ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:558.34KB ,
资源ID:3673860      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3673860.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(散列法的实验研究课程设计报告.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

散列法的实验研究课程设计报告.docx

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;

4、Hd.si=cnt;elsedod=(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

5、 此哈希表容量为%d,当前表内存储的记录个数% 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

6、(数字%d 的探查次数为:%dn,hd.key,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,

7、cnt;Node *s,*q;for(i=0;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;type

8、def structNode *link;HashTable2;typedef structint * 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;

9、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

10、(n);printf(n);printf(请输入一个任务选项);int x;scanf(%d,&x);switch(x)case 1:GetIn (a);break;case 2:GetOut(a);break;case 3:CreateHashTable1(hash1,a,num);break;case 4:CreateHash3(ha,a,num);break;case 5:CreateHashTable2(hash2,a,num);break;case 6:printf(请输入你查找的数据:); scanf(%d,&data);SearchHash1(hash1,data);break;

11、case 7:printf(请输入你查找的数据:); scanf(%d,&data);SearchHash3(ha,data);break;case 8:printf(请输入你查找的数据:); scanf(%d,&data);SearchHash2(hash2,data,num);break;case 0:exit(-1);d. 调试分析(1)程序的关键是掌握文件的相关操作、哈希函数的创建和运用、处理冲突 的方法等。在编程过程中,出现了很多问题,如文件无法正常打开、程序无法 运行、添加的头文件错误等。修改后程序运行正常。(2)关于散列法中,散列函数构造方法多种多样,同时对于同一散列函数解 决冲

12、突的方法也可以不同。两者是影响查询算法性能的关键因素。对不同的数 采取不同的函数构造方法和处理冲突的方法,需要认真分析和研究。添加数据信息,运行结果如下图:数据的输出,运行结果如下图:用线性再散列方法建立哈希表,运行结果如下图:用二次探测再散列建立哈希表,运行结果如下图:用线性再散列法查找,运行结果如下图所示:用二次探测再散列法查找,运行结果如下图:用链地址法查找,运行结果如下图:退出程序,运行结果如下图:对性能的分析:查找过程中,关键码的比较次数,取决于产生冲突的多少, 产生的冲突少,查找效率就高,产生的冲突多,查找效率就低。因此,影响产 生冲突多少的因素,也就是影响查找效率的因素。影响产生

13、冲突多少有以下三 个因素: 1、散列函数是否均匀;2、处理冲突的方法;3、散列表的装填因子。 散列表的装填因子定义为:= 填入表中的元素个数 / 散列表的长度。 是 散列表装满程度的标志因子。由于表长是定值, 与“填入表中的元素个数” 成正比,所以, 越大,填入表中的元素较多,产生冲突的可能性就越大; 越小,填入表中的元素较少,产生冲突的可能性就越小。实际上,散列表的平 均查找长度是装填因子 的函数,只是不同处理冲突的方法有不同的函数。(e) 课程总结(1)收获通过本次课程设计,使我对计算机语言有了更深一层的了解,也使我对 算法的运用有了更多的体会,对算法和生活的联系也有了更多的体会。更进一

14、步了解和熟悉了关于哈希表的创建和运用。现在,计算机领域,他只向我展现 了冰山一角,以后我会继续探索。好的算法源于我们不断的思考,思考源于我 们对梦想的追寻。(2)心得体会在这次数据结构设计中遇到了很多实际性的问题,在实际设计中才发现。 书本上理论性的东西在实际应用中还是有一定的出入的。所以有些问题要不断 的更正以前的错误思维。通过这次设计,我懂得了学习的重要性,了解到理论 知识与实践结合的重要意义。学会了坚持、耐心和努力,这将为自己今后的学 习和工作打下牢固的基础。通过学习,对专业知识了解更多,学会如何把自己 平时所学的东西应用到实际中。-参考文献:1 李云清,杨庆红. 数据结构(C 语言版)

15、.北京:人民邮电出版社,2004.2 严蔚敏,吴伟民.数据结构(C 语言版).北京:清华大学出版.1997.3 苏光奎,李春葆.数据结构导学.北京:清华大学出版.2002.4周海英,马巧梅,靳雁霞.数据结构与算法设计.北京:国防工业出版社,2007.5 张海藩. 软件工程导论. 北京:清华大学出版社.2003.6互联网附录:程序清单#include#include#define HashSize 53#define MaxSize 20typedef structint key;int si;HashTable1;void CreateHashTable1(HashTable1 *H,int

16、*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;elsedod=(d+1)%HashSize;cnt+;while(Hd.key!=0);Hd.key=ai;Hd.si=cnt;printf(n 线性再探索哈希表已建成!); void SearchHash1(HashTable1 *h,int data)int d;d=data%HashSize;if(hd.ke

17、y=data)printf(数字%d 的探查次数为:%dn,hd.key,hd.si);elsedod=(d+1)%HashSize;while(hd.key!=data & dHashSize);if(dHashSize)printf(数字%d 的探查次数为:%dn,hd.key,hd.si);elseprintf(没有查找到你所输入的数n);typedef struct nodeint key;int si;struct node *next;Node;typedef structNode *link;HashTable2;void CreateHashTable2(HashTable2

18、*ht,int *a,int num)/哈希表链地址; int i,d,cnt;Node *s,*q;for(i=0;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;void SearchHash2(HashTable2 * h,int data,int num)int d;Node *q;d=data%num;q=hd-link;w

19、hile(q-key!=data & q-next!=NULL)q=q-next;if(q-next!=NULL)printf(数字%d 的查找次数为:%dn,q-key,q-next); elseprintf(没有找到你要查找的那个数n);typedef structint * elemHashSize;int count;int size;HashTable3;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(

20、q=0)return q;else i=c/2+1;return (-1);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,当前表内存储的记录个数% d.n,HashSize,h-count);void SearchHash3(HashTable3 *h,int

21、 data)/哈希表二次探索再散列查找 int c=0,p,pp;p=data%HashSize;pp=p;while(h-elempp!=NULL)&(*(h-elempp)!=data)pp=Collision(p,c);if(h-elempp!=NULL)&(*(h-elempp)=data)printf(n 查找成功!n 查找冲突次数为%d:,c);elseprintf(n 没有查到此数!n);int num;void GetIn(int *a)printf(输入添加的个数:);scanf(%d,&num);for(int i=0;inum;i+)scanf(%d,&ai);print

22、f(数据已经输入完毕!n);void GetOut(int *a)printf(你所输入的数据:);for(int i=0;inum;i+)printf(%d,ai);printf(n 输出已完毕!);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;whi

23、le(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)

24、;printf(n);printf(请输入一个任务选项);int x;scanf(%d,&x);switch(x)case 1:GetIn (a);break;case 2:GetOut(a);break;case 3:CreateHashTable1(hash1,a,num);break;case 4:CreateHash3(ha,a,num);break;case 5:CreateHashTable2(hash2,a,num);break;case 6:printf(请输入你查找的数据:);scanf(%d,&data);SearchHash1(hash1,data);break;case 7:printf(请输入你查找的数据:);scanf(%d,&data);SearchHash3(ha,data);break;case 8:printf(请输入你查找的数据:);scanf(%

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

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