哈希表Word文件下载.docx

上传人:b****3 文档编号:18172449 上传时间:2022-12-13 格式:DOCX 页数:9 大小:16.29KB
下载 相关 举报
哈希表Word文件下载.docx_第1页
第1页 / 共9页
哈希表Word文件下载.docx_第2页
第2页 / 共9页
哈希表Word文件下载.docx_第3页
第3页 / 共9页
哈希表Word文件下载.docx_第4页
第4页 / 共9页
哈希表Word文件下载.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

哈希表Word文件下载.docx

《哈希表Word文件下载.docx》由会员分享,可在线阅读,更多相关《哈希表Word文件下载.docx(9页珍藏版)》请在冰豆网上搜索。

哈希表Word文件下载.docx

intisletter(charch);

//判断是否为字母

intreadc(char*filename);

//读取源程序文件中的单词

intgetkey(char*str,intlen);

//获取该单词的key

voidresethash(intn);

//重置哈希表

voidcopycount(intx[],intn);

//将频道拷贝到数组里

voidcheck(int*x1,int*x2);

//计算相对距离

intmain()

charfilename1[]={"

test1.txt"

};

charfilename2[]={"

test12.txt"

intx1[hashlen],x2[hashlen];

//存储频度的数组,用于相似度S的计算

resethash(0);

//完全重置哈希表,即哈希指针置为NULL,频度置为0

creathash();

//通过文件ckey.txt创建哈希表

readc(filename1);

//读取第一个测试源程序文件

copycount(x1,hashlen);

//讲统计好的频度复制给x数组

resethash

(1);

//仅仅将频度count置为0

readc(filename2);

//同上

copycount(x2,hashlen);

cout<

<

"

\t"

哈希序号"

\t"

关键字"

频度1"

频度2"

endl;

for(inti=0;

i<

41;

i++)

{

if(hasht[i].hash1!

=NULL)

{

cout<

i<

hasht[i].hash1<

x1[i]<

x2[i]<

}

}

filename1<

和"

filename2<

的相似情况为:

check(x1,x2);

//检查相似度

return0;

}

voidresethash(intn)

{//重置哈希表

if(n=0)//完全重置哈希表

for(inti=0;

41;

i++)

hasht[i].hash1=NULL;

hasht[i].count=0;

elseif(n=1)//仅仅重置频度

voidcopycount(intx[],intn)

{//拷贝频度

n;

x[i]=hasht[i].count;

intgetkey(char*str,intlen)//根据哈希函数获取该单词的key

charkey1,key2;

intkey;

key1=str[0];

key2=str[len-1];

key=(int)(key1*100+key2)%41;

returnkey;

voidcreathash(void)//对文件ckey.txt中的32个关键字创建哈希表

{

FILE*fp;

intlength;

charstr[size];

//暂时存储关键字字符的数组

char*s=NULL;

size;

str[i]='

\0'

;

if((fp=fopen("

ckey.txt"

"

r"

))==NULL)

cout<

can'

tcreatfile!

\n"

exit(0);

while(fgets(str,size,fp)!

=NULL)//读取一行写入一行

if(str==NULL)

break;

length=strlen(str);

str[length-1]='

//调试后发现的,没有这里就停止运行了

Hashfunc(str);

fclose(fp);

voidHashfunc(charstr[])

{//将关键字根据哈希函数放入哈希表中的指定位置

intkey,len;

len=strlen(str);

key=getkey(str,len);

while(hasht[key%41].hash1!

key++;

//线性探索

hasht[key%41].hash1=(char*)malloc(sizeof(char)*(len+1));

strcpy(hasht[key%41].hash1,str);

intHashfind(char*words)//在哈希表中找是否该words为关键字,并统计频度

intkey,len,find;

len=strlen(words);

key=getkey(words,len);

while(hasht[key].hash1==NULL)key++;

key=key%41;

if(strcmp(hasht[key].hash1,words)==0)

hasht[key].count++;

return1;

for(find=key+1;

find<

hashlen;

find++)//如果不在key位置则向往后线性查找,然后再从头找

{

//线性探查法顺序查找哈希表中是否已存在关键字

if(hasht[find].hash1!

if(strcmp(hasht[find].hash1,words)==0)

hasht[find].count++;

return1;

}

for(find=0;

key;

find++)

if(hasht[find].hash1!

if(strcmp(hasht[find].hash1,words)==0)

intisletter(charch)

{//判断是否ch为字母

if((ch>

='

a'

&

ch<

z'

)||(ch>

A'

Z'

))return1;

intreadc(char*filename)

{//读取源程序文件中的单词

FILE*fp1=NULL;

charwords[maxlen],ch;

inti;

if((fp1=fopen(filename,"

cannotcreatfile!

while(!

feof(fp1))//结束返回1

i=0;

ch=fgetc(fp1);

//一个字符一个字符的读

while(isletter(ch)==0&

feof(fp1)==0)

ch=fgetc(fp1);

while(isletter(ch)==1&

if(i==maxlen)

{

while(isletter(ch)==1&

{

ch=fgetc(fp1);

}

i=0;

break;

}//超过最大关键字长度将会跳过当前识别区域,读取下一个单词

else

words[i++]=ch;

ch=fgetc(fp1);

}

words[i]='

Hashfind(words);

//将得到的该单词调入Hashfind函数,来判断是否为关键字,并统计频度

fclose(fp1);

floatMol(int*x)//取模函数

inti=0,sum=0;

for(i=0;

N;

sum+=(x[i]*x[i]);

return(float)pow((float)sum,0.5);

intDot(int*x1,int*x2)

{//点积函数

sum+=x1[i]*x2[i];

returnsum;

floatS(int*x1,int*x2)

returnDot(x1,x2)/(Mol(x1)*Mol(x2));

//求相似度S

floatD(int*x1,int*x2)//求几何距离

intx[N],i=0;

i++)//向量相减

x[i]=x1[i]-x2[i];

returnMol(x);

//再求模

voidcheck(int*x1,int*x2)

inta;

floatb;

inti,sum=0;

a=x1[i]-x2[i];

sum+=a*a;

b=sqrt(sum);

相似度="

b<

return;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1