07.06.2011, 14:57
|
#1
|
Новичок
Джуниор
Регистрация: 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;
}
|
|
|
|