1、散列法的实验研究课程设计报告课程设计报告问题描述:(1) 散列法中,散列函数构造方法多种多样,同时对于同一散列函数解决冲突的方法也可以不同。两者是影响查询算法性能的关键因素。(2) 程序实现几种典型的散列函数构造方法,并观察,不同的解决冲突方法对查询性能的影响。a. 需求分析:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。对不同的关键字可能得到同一散列地址,即key1key2,而f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数H(key)和处理冲突的方法将一组关键
2、字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”作为记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。散列表的查找过程基本上和造表过程相同。一些关键码可通过散列函数转换的地址直接找到,另一些关键码在散列函数得到的地址上产生了冲突,需要按处理冲突的方法进行查找。对散列表查找效率的量度,依然用平均查找长度来衡量。查找过程中,关键码的比较次数,取决于产生冲突的多少,产生的冲突少,查找效率就高,产生的冲突多,查找效率就低。因此,影响产生冲突多少的因素,也就是影响查找效率的因素。该课程设计要求比较几种哈希函数的构造方法和解决冲突的方
3、法对查询性能的影响。b. 概要设计该程序实现对哈希函数的构造方法、处理冲突的方法及在哈希表中查找数据的功能。用线性再散列方法建立哈希表,用代码实现为:typedef structint key;int si;HashTable1;void CreateHashTable1(HashTable1 *H,int *a,int num)/哈希表线性探测在散列;int i,d,cnt;for(i=0;iHashSize;i+)Hi.key=0;Hi.si=0;for(i=0;inum;i+)cnt=1;d=ai%HashSize;if(Hd.key=0)Hd.key=ai;Hd.si=cnt;else
4、dod=(d+1)%HashSize;cnt+;while(Hd.key!=0);Hd.key=ai;Hd.si=cnt;printf(n线性再探索哈希表已建成!);用二次探测再散列建立哈希表,代码实现如下:void CreateHash3(HashTable3 *h,int *a,int num)/二次探索表int i,p=-1,c,pp;for(i=0;ielempp!=NULL)pp=Collision(p,c);if(ppelempp=&(aai);h-count+;printf(第%d个记录冲突次数为%dn,i+1,c);printf(n建表完成!n此哈希表容量为%d,当前表内存储的
5、记录个数%d.n,HashSize,h-count);二次探测再散列法解决冲突int Collision(int p,int &c)int i,q;i=c/2+1;while(i=0)return q;elsei=c/2+1;elseq=(p-i*i)%HashSize;c+;if(q=0)return q;else i=c/2+1;return (-1);用线性再散列法查找,代码实现如下:void SearchHash1(HashTable1 *h,int data)int d;d=data%HashSize;if(hd.key=data)printf(数字%d的探查次数为:%dn,hd.k
6、ey,hd.si);elsedod=(d+1)%HashSize;while(hd.key!=data & dHashSize);if(dlink;while(q-key!=data & q-next!=NULL)q=q-next;if(q-next!=NULL)printf(数字%d的查找次数为:%dn,q-key,q-next);elseprintf(没有找到你要查找的那个数n);用链地址法查找,代码实现如下:void CreateHashTable2(HashTable2 *ht,int *a,int num)/哈希表链地址;int i,d,cnt;Node *s,*q;for(i=0;
7、ilink=NULL;for(i=0;ikey=ai;s-next=NULL;d=ai%num;if(htd-link=NULL)htd-link=s;s-si=cnt;elseq=htd-link;while(q-next!=NULL)q=q-next;cnt+;cnt+;s-si=cnt;q-next=s;c. 详细设计(1) 程序中结构体的定义typedef structint key;int si;HashTable1;typedef struct nodeint key;int si;struct node *next;Node;typedef structNode *link;Ha
8、shTable2;typedef struct int * elemHashSize;int count;int size;HashTable3;(2) 主函数模块void main()int data;HashTable1 hash1HashSize;HashTable2 * hash2HashSize;HashTable3 * ha;ha=(HashTable3 *)malloc(sizeof(HashTable3);for(int i=0;ielemi=NULL;ha-count=0;ha-size=HashSize;int aMaxSize;while(1)printf(n ); printf(n 欢迎使用本系统 ); printf(n ); printf(n 散列法的实验研究 );printf(n 【1】. 添加数据信息 【2】 数据的输出 );printf(n 【3】. 建立哈希表(线性再散列) );printf(n 【4】. 建立哈希表(二次探测再散列) );printf(n 【5】. 建立哈希表(链地址法) );printf(n 【6】. 线性再散列法查找 );printf(n 【7】. 二次探测再散列法查找 );printf(n 【8】. 链地址法查找 );printf(n 【0】. 退出程序 );printf(n );printf(n);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1