1、哈希表#include #include#include#include#define N 32 /关键字个数#define size 256#define maxlen 9 /关键字数组长度#define hashlen 41 /哈希表长度struct hashtable /结构体数组哈希表 char *hash1; /指向关键字的指针 int count; /记录频度hashthashlen;using namespace std;void Hashfunc(char str); /将关键字根据哈希函数放入哈希表中的指定位置int Hashfind(char *words); /在哈希表中
2、找是否该words为关键字,并统计频度void creathash(void); /创建哈希表int isletter(char ch); /判断是否为字母int readc(char * filename); /读取源程序文件中的单词int getkey(char *str,int len); /获取该单词的keyvoid resethash(int n); /重置哈希表void copycount(int x,int n); /将频道拷贝到数组里void check(int *x1, int *x2); /计算相对距离int main() char filename1=test1.txt;
3、 char filename2=test12.txt; int x1hashlen,x2hashlen; /存储频度的数组,用于相似度S的计算 resethash(0); /完全重置哈希表,即哈希指针置为NULL,频度置为0 creathash(); /通过文件ckey.txt创建哈希表 readc(filename1); /读取第一个测试源程序文件 copycount(x1,hashlen); /讲统计好的频度复制给x数组 resethash(1); /仅仅将频度count置为0 readc(filename2); /同上 copycount(x2,hashlen); resethash(1
4、); coutt哈希序号 t关键字 t频度1 t频度2 tendl; for (int i = 0; i 41; i+) if(hashti.hash1!=NULL) coutti thashti.hash1 tx1i tx2i tendl; coutfilename1和filename2的相似情况为:endl; check(x1,x2); /检查相似度 return 0;void resethash(int n) /重置哈希表 if(n=0) /完全重置哈希表 for(int i=0;i41;i+) hashti.hash1=NULL; hashti.count=0; else if (n=
5、1) /仅仅重置频度 for(int i=0;i41;i+) hashti.count=0; void copycount(int x,int n) /拷贝频度 for (int i = 0; i n; i+) xi=hashti.count; int getkey(char *str,int len) /根据哈希函数获取该单词的key char key1,key2; int key; key1=str0; key2=strlen-1; key=(int)(key1*100+key2)%41; return key;void creathash(void) /对文件ckey.txt中的32个关
6、键字创建哈希表 FILE *fp; int length; char strsize; /暂时存储关键字字符的数组 char *s=NULL; for (int i = 0; i size; i+) stri=0; if(fp=fopen(ckey.txt,r)=NULL) coutcant creat file!n; exit(0); while (fgets(str,size,fp)!=NULL) /读取一行写入一行 if (str=NULL) break; length=strlen(str); strlength-1=0; /调试后发现的,没有这里就停止运行了 Hashfunc(str
7、); fclose(fp);void Hashfunc(char str) /将关键字根据哈希函数放入哈希表中的指定位置 int key,len; len=strlen(str); key=getkey(str,len); while (hashtkey%41.hash1!=NULL) key+; /线性探索 hashtkey%41.hash1=(char*)malloc(sizeof(char)*(len+1); strcpy(hashtkey%41.hash1,str); int Hashfind(char *words) /在哈希表中找是否该words为关键字,并统计频度 int key
8、,len,find; len=strlen(words); key=getkey(words,len); while(hashtkey.hash1=NULL)key+; key=key%41; if(strcmp(hashtkey.hash1,words)=0) hashtkey.count+; return 1; for(find=key+1;findhashlen;find+) /如果不在key位置则向往后线性查找,然后再从头找 /线性探查法顺序查找哈希表中是否已存在关键字 if(hashtfind.hash1!=NULL) if(strcmp(hashtfind.hash1,words)
9、=0) hashtfind.count+; return 1; for(find=0;find=a&ch=A&ch=Z)return 1; return 0;int readc(char *filename) /读取源程序文件中的单词 FILE *fp1=NULL; char wordsmaxlen,ch; int i; if(fp1=fopen (filename,r)=NULL) coutcan not creat file!n; exit(0); while (!feof(fp1) /结束返回1 i=0; ch=fgetc(fp1); /一个字符一个字符的读 while (islette
10、r(ch)=0&feof(fp1)=0) ch=fgetc(fp1); while (isletter(ch)=1&feof(fp1)=0) if (i=maxlen) while (isletter(ch)=1&feof(fp1)=0) ch=fgetc(fp1); i=0; break; /超过最大关键字长度将会跳过当前识别区域,读取下一个单词 else wordsi+=ch; ch=fgetc(fp1); wordsi=0; Hashfind (words); /将得到的该单词调入Hashfind函数,来判断是否为关键字,并统计频度 fclose(fp1); return 0;float
11、 Mol(int *x) /取模函数 int i = 0, sum = 0; for (i = 0; i N; i+) sum += (xi * xi); return (float)pow(float)sum,0.5);int Dot(int *x1, int *x2) /点积函数 int i = 0, sum = 0; for (i = 0; i N; i+) sum += x1i * x2i; return sum;float S(int *x1,int *x2) return Dot(x1, x2)/(Mol(x1)*Mol(x2); /求相似度Sfloat D(int *x1, int *x2) /求几何距离 int xN, i = 0; for (i = 0; i N; i+) /向量相减 xi= x1i - x2i; return Mol(x); /再求模void check(int *x1, int *x2) int a ; float b; int i,sum=0; for (i = 0; i hashlen; i+) a= x1i -x2i; sum+=a*a; b=sqrt(sum); cout相似度=bendl; return;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1