文档详情

哈希表实验报告

hao****an
实名认证
店铺
DOC
298.02KB
约9页
文档ID:157461977
哈希表实验报告_第1页
1/9

数据结构实验报告四——哈希表查找名字(字符串)实验题目:哈希表查找名字(字符串) 实验目标:输入一组名字(至少50个),将其保存并利用哈希表查找输出哈希查找冲突次数,哈希表负载因子、查找命中率数据结构:哈希表和数组(二维)二维数组用于静态顺序存储名字(字符串),哈希表采用开放定址法,用于存储名字(字符串)对应的关键字并实现对名字(字符串)的查找需要的操作有:1.关键字求取(主函数中两次出现,未单独编为函数)关键字key=abs(字符串首位ASCII码值-第二位ASCII码值+第([]+1)位ASCII码值-最后一位ASCII码值-倒数第二位ASCII码值)*字符串长度(abs为求整数绝对值的函数)2.处理关键字的哈希函数(Hash)利用平方取中法求关键值key在哈希表中的位置公式add=(key*key)%1000/LENGTH(add为key在哈希表中的地址)int Hash(int key){ return((key*key)/1000%LENGTH);}3.处理哈希表中冲突的函数(Collision)利用线性探测再散列处理冲突,利用全局变量count统计冲突次数int Collision(int key,int Hashtable[]){ int i; for(i=1;i<=LENGTH;i++) { if(Hashtable[(Hash(key)+i)%LENGTH]==-1) return((Hash(key)+i)%LENGTH); count++; }}4.哈希表初始化(InitHash)void InitHash(int Hashtable[]){ int i; for(i=0;i包含)以及求整数的绝对值(abs)(函数库包含)算法设计:1建立长度为LENGTH的哈希表Hash(LENGTH具体值由宏定义决定)。

2输入要插入的字符串总数num(num小于等于LENGTH),再输入num个字符串,将这num个字符串的关键值key计算出来后插入哈希表中3输出哈希表(帮助调试用,并非实验目的)4依次查找这num个字符串对应的关键字在哈希表中位置,并统计冲突次数,记为count根据公式计算负载因子和命中率(负载因子=表中填入的记录数/哈希表的长度,命中率=元素个数/查找次数)输出元素个数、冲突次数、查找次数、负载因子、命中率源程序(将LENGTH定义为60,实际调试中定义为60和100各一次):#include#include#include#include#define LENGTH 60 /*实际调试中定义为60和100各一次*/int Hash(int key);int Collision(int key,int Hashtable[]);void InitHash(int Hashtable[]);void InsertHash(int key,int Hashtable[]);int SearchHash(int key,int Hashtable[]);void PrintHash(int Hashtable[]);int count=0,num=0;void main(){ int i,key,collapsetime,searchtime,Hash[LENGTH]; float loadelem,hitprob; char names[LENGTH][20]; InitHash(Hash); printf("input the number of names(number<=%d).\n",LENGTH); scanf("%d",&num); printf("input names.\n"); for(i=0;i

/ InsertHash(key,Hash); } count=0;/*将count置零,清除插入过程中产生的冲突次数*/ PrintHash(Hash); for(i=0;i

ASL=3.5,总平均查找次数为175,平均命中率为0.285714显然,本程序实现的哈希查找在本次试验中优于平均状况截图第二组(LENGTH宏定义为100)输入:50个名字(字符串,采用英文单词)输出:1.哈希表(帮助调试用)2.实验要求的各项参数元素个数:50,冲突次数:27,查找次数:77,负载因子:0.500000,命中率:0.649351.根据线性探测在散列成功查找时的公式ASL=(1+)(其中,ASL表示平均查找长度,表示负载因子)ASL=1.5,总平均查找次数为75,平均命中率为0.666667显然,本程序实现的哈希查找在本次试验中略逊于平均状况附:输入的50个字符串abandonalacrityarchipelagoassessattenuatebigotbrakebuffooncircumspectcommittedconfrontconstringeconvictioncovendefusedetractdimensiondiscreditdoldrumsencomiumennobleepitheteuphemismexcursivefeasiblesensitiveshrewdstationarygreasyobscurepersistentprevalentprominentrelevantvulnerableinevitablypresumablyguaranteelegislationmechanismpatternessencereputationthresholdoverwhelmhinderwreckwiltfloutnovel实验总结与心得:构造合适的关键字和哈希函数对于增加命中率非常关键,哈希函数最终选用了平方取中法。

而关键字,对于字符串形式的存储元素作用相当重要起初打算用(字符串首位ASCII码值*字符串长度)作为关键字,但发现命中率不到0.2;因此加上了最后一位和第二位,命中率可提高到0.26(仍不如平均状况);加上倒数第二位提高到0.3,最后加上第([n/2]+1)位形成了五位相加减的状况,将命中率提高到了现在的0.39(以上所述的状况是LENGTH为60,输入字符串数目为50,这也是调试所用的宏定义状况,第二组输出结果是将LENGTH直接改为100时实现的)这充分表明了本次实验需要一定的耐心。

下载提示
相关文档
正为您匹配相似的精品文档