数据结构与算法课程设计报告-利用哈希技术统计C源程序关键字出现频度
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构与算法课程设计报告
题目:利用哈希技术统计C源程序关键字出现频度
学生姓名:
学号: ______
班级: ____
指导教师: _
2012年 6 月18 日
利用哈希技术统计C源程序关键字出现频度
(1)题目内容:
利用Hash技术统计某个C源程序中的关键字出现的频度
(2)基本要求:
扫描一个C源程序,用Hash表存储该程序中出现的关键字,并统计该程序中的关键字出现的频度。用线性探测法解决Hash冲突。设Hash函数为:
Hash(key)[(key的第一个字母序号)*100+(key的最后一个字母序号)] MOD 41
一、对题目的分析
哈希表是为了便于快速搜索而组织的值组合的集合。Hash Table是一种数组,可以用任意简单变量值来访问其元素,这种数组叫做关联数组,也叫哈希表。值对的集合。
理想的情况下是希望不经过任何比较,一次存储就能得到所查到的记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应。
基本要求:使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数,也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标,hash值)存在一一对应的关系,于是用这个数组单元来存储这个元素。使用hash表存储关键字时难免会有不同的关键字对应同一关键码的情况,因此必须有个处理冲突的办法。
Hash函数:
Hash(key)[(key的第一个字母序号)*100+(key的最后一个字母序号)] MOD 41
二、处理冲突的方法
处理冲突的办法—线性探测法
用线性探法解决冲突时,把有冲突的关键字往后推移直到有空位置的关键码时再插入到hash表中。
C语言关键字:
C语言关键字是C语言的保留的一些单词,这些单词都有了固定的意义和用途,不可以作为变量或者自定义类型或类名来使用。其特点是都有小写字母构成。C语言关键字有哪些:
double int struct break else long switch case enum register char extern return union const float short
unsigned continue for signed void default goto sizeof volatile do while static if auto case
定义一个多维数组,数组第一行存放关键字,数组第二行存储hash函数处理后关键字结点地址,用hash函数存储关键字
Hash(Key)=[(Key第一个字符在1-26个字母中的序号)*100+(Key最后一个字符在1-26个字母中的序号)%41
如此得到如for对应地址3,if对应于地址4,int对应地址18等等。
哈希表 H(key)=keyMOD41 处理冲突为线性探测再散列。
三、算法设计及部分函数
打开含关键字的CPP文件:
int Open(char *filename)
{
char word[MaxLength],ch;
int i;
FILE *read; //指向FILE类的指针*read
if((read=fopen(filename,"r"))==NULL) //只读方式读取文件,如果为空
{
cout< return -1; //跳出Open函数 } while(!feof(read)) //判断文件是否结束,到末尾函数值为“真”即非0 { i=0; ch=fgetc(read); //读取一个字符 while(LetterNot(ch)==0&&feof(read)==0) ch=fgetc(read); //如果不是字母就接着读取,关键字都是由字母组成的while(LetterNot(ch)==1&&feof(read)==0) { if(i==MaxLength) { while(LetterNot(ch)==1&&feof(read)==0) { ch=fgetc(read); //超过MAXLEN的长度则一定不为关键字,把余下连一起的字母都读取 } i=0; break; } else { word[i++]=ch; //把读取到的字母存入word数组中 ch=fgetc(read); } } word[i]='\0'; if(KeywordsNot(word)) { CreatHash(word); } } fclose(read); cout< } 在Hash表中查找关键字找出关键字位置: int FindHash(char *keyword) //在Hash表中查找关键字 { int key,find,FindColl=0; if(!KeywordsNot(keyword)) //是否关键字 return -1; key=GetHashValue(keyword); if(strcmp(Test[key].keyword,keyword)==0) return key; for(find=key+1;find { //线性探测法 FindColl++; //FindColl统计冲突次数 if(strcmp(Test[find].keyword,keyword)==0) { Test[find].coll=FindColl; //把冲突次数存入coll return find; } } for(find=0;find { FindColl++; if(strcmp(Test[find].keyword,keyword)==0) { Test[find].coll=FindColl; return find; } } return -1; } 建立Hash表: int CreatHash(char *keyword) //建立Hash表,keyword是一个数组 { int key; if(!KeywordsNot(keyword)) //判断是否关键字 return -1; key=GetHashValue(keyword); //计算Hash值 if(strlen(Test[key].keyword)>0) //Hash表中该位置存在关键字 { if(strcmp(Test[key].keyword,keyword)==0) //Hash表中该位置的关键字相同 {