Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2011, 14:57   #1
Madragon
Новичок
Джуниор
 
Регистрация: 07.06.2011
Сообщений: 2
По умолчанию Подсчёт времени при хэшировании текста

Нужно зафиксировать время добавление и поиска элемента при заполненности на 20, 40, 60, 80, 100%. Но после 20% время не хочет считаться.

Цитата:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <sys/time.h>
#define MAXL 100

struct element { //структурный элемент цепочек решения коллизий
int count; //частота встречаемости этого слова
char* word; //само слово
};

struct times{
float max;
float min;
float mids;
int midc;
};

struct mor{ //структура для одсчёта 10-ти самых встречаемых слов
int hash; //хэш слова
int count; //сколько раз встретился
char *word; //само слово
};

int m[] = {2048, 4096};
int mc;
int count = 0;
int overload = 0;

float A = 0.618;

struct times tim;

void word_cat(char *word);
int hash(char *word, int probe);
int hash_add(struct element **ph, char *word);
int find(struct element **ph, char *word);
void more(struct element **p);
void ending(struct element **p);


int main(int argc, char *argv[], char *pnvp[]){
if(argc<2){
printf("Укажите путь к исходному тексту!!!\n");
return -1;
}
struct timeval tv1, tv2;
float start, end, func_time, mid = 0;
int i,j,err = 0, tk;
char temp_word[MAXL]; //буфер чтения
tim.max = 0;
tim.min = 1000;
tim.mids = 0;
tim.midc = 0;
for(i=0;i<2;i++){ //главный цикл, в нём последовательно строятся и заполняются тхеш-таблицы длин указанных в массиве m
struct element **p = malloc(sizeof(struct element*)*m[i]); //выделяем память под таблицу
err = 0;
mc = m[i]; //в глобальную переменную заносится текущий размер таблицы
printf("\n\nРезультаты для хеш-таблицы размером %d\n\n", mc);

j = 0;
while(j<mc){ //обнуление хеш-таблицы(можно for-ом но у меня исторически сложился while)
p[j] = NULL;
j++;
}
FILE *f=fopen(argv[1], "r"); //открытие текстового файла
if(f==NULL){printf("Файл %s не найден!!!\n", argv[1]); return -1;}
j = 0;
tk = 0;
printf("Зависимось времени выборки от заполнености хеш таблицы(вставка)\n");
printf("Процент заполнености Максимальное Минимальное Среднее\n");
count = 0;
overload = 0;
while(fscanf(f, "%s", temp_word)!=EOF){ //цикл заполнения
err = 0;
word_cat(temp_word); //обрезка слова
for(j=20;j<101;j=j+20){
if(count==((mc/100)*j)&&count!=tk){
//printf("%d %d\n", (mc/100)*j, count);
tk = count;
mid = tim.mids/tim.midc;
printf(" %d%%........ ...... %f сек %f сек %f сек\n", j, tim.max, tim.min, mid);
break;
}
}
gettimeofday(&tv1,NULL);
err = hash_add(p, temp_word); //добавление слова в хеш-таблицу
gettimeofday(&tv2,NULL);
if(err!=0){
p[err] = malloc(sizeof(struct element));
p[err]->count = 1;
p[err]->word = malloc(sizeof(char)*strlen(temp_wor d)+1);
strcpy(p[err]->word, temp_word);
count++;
}
tv2.tv_sec -= tv1.tv_sec;
tv1.tv_sec = 0;
start = tv1.tv_sec + (float)tv1.tv_usec*1E-6;
end = tv2.tv_sec + (float)tv2.tv_usec*1E-6;
func_time = end - start;
tim.mids += func_time;
tim.midc++;
if(func_time>tim.max){
tim.max = func_time;
}
if(func_time<tim.min){
tim.min = func_time;
}
if(err==-1){
overload = 1;
break;
}
strcpy(temp_word, ""); //обнуление буфера
}
printf("\n");
fclose(f);
printf("\n");
ending(p); //освобождение памяти
free(p);
}
return 0;
}
Madragon вне форума Ответить с цитированием
Старый 07.06.2011, 14:57   #2
Madragon
Новичок
Джуниор
 
Регистрация: 07.06.2011
Сообщений: 2
По умолчанию

И это еще не всё
Цитата:
void word_cat(char *word){ //нарезку слов
int i;
int len = strlen(word) + 1;
int separator = len;
for(i=len-2; i>=0; i--){
if((word[i]==44)||(word[i]==58)||(word[i]==59||word[i]==46)||(word[i]==33)||(word[i]==63)||(word[i]=='"')){
separator = i;
}else{
break;
}
}
word[separator] = '\0';
}

int hash(char *word, int probe){
int h1, h2, h = 0;
int sum = 0;
int i;
for(i=0;i<strlen(word);i++){ //вычисление числа слова
sum += *(word+i)*((100*i)+1);
}
int tmp = sum*A;
h1 = mc*(sum*A - tmp);
h2 = ((sum%3083)/2)*2+1;
h = (h1 + probe)%mc;
return h;
}

int hash_add(struct element **ph, char *word){
int fl = 0, i = 0, h = 0;
while(fl==0){
if(i==mc-1){
return -1;
}
h = hash(word, i);
if(ph[h]!=NULL){
if(strcmp(ph[h]->word, word)==0){
(ph[h]->count)++;
fl = 1;
}
}else{
return h;
}
i++;
}
return 0;
}

int comp2(struct mor *a, struct mor *b){ //ещё один костыль, нужны для qsort-а
if((a->count)<(b->count)){
return 1;
}else{
return -1;
}
}

void ending(struct element **p){ //освобождение памяти
int i;
for(i=0;i<mc;i++){
if(p[i]==NULL){
continue;
}
free(p[i]);
}
}

int find(struct element **ph, char *word){
int fl = 0, i = 0, h = 0;
while(fl==0){
if(i==mc-1){
return -1;
}
h = hash(word, i);
if(ph[h]!=NULL){
if(strcmp(ph[h]->word, word)==0){
//(ph[h]->count)++;
return 0;
}
}
i++;
}
return 0;
}
Madragon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi подсчёт затраченного времени АлексаШка Помощь студентам 6 09.06.2010 08:51
Ошибка при Сравнении времени Студло БД в Delphi 6 07.02.2010 00:12
Подсчёт пульсаций и пауз при приёме данных с ИК пульта Terran Win Api 6 21.11.2009 12:19
Расчет диапазона времени при переходе через сутки Givasi Microsoft Office Excel 4 28.08.2009 15:24
Выбор Даты/Времени из БД при помощи DateTimePicker rainbow Общие вопросы Delphi 3 08.10.2008 12:42