- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构教学课件ppt作者主编马世霞第7章查找课件.ppt
7.4 哈希查找(散列查找) 冲突:对于不同的关键字ki、kj,若ki?kj,但H(ki)=H(kj)的现象叫冲突(collision) 。 同义词:具有相同函数值的两个不同的关键字,称为该哈希函数的同义词。 哈希函数通常是一种压缩映象,所以冲突不可避免,只能尽量减少;当冲突发生时,应该有处理冲突的方法。设计一个散列表应包括: ① 散列表的空间范围,即确定散列函数的值域; ② 构造合适的散列函数,使得对于所有可能的元素(记录的关键字),函数值均在散列表的地址空间范围内,且出现冲突的可能尽量小; ③ 处理冲突的方法。即当冲突出现时如何解决。 (5)除留余数法 H (key)=key %?p (p是一个整数) ,其中%为模p取余运算。 例如,已知散列元素(18,75,60,43,54,90,46),表长m=10,p=7,则有 ??? h(18)=18 % 7=4??? h(75)=75 % 7=5??? h(60)=60 % 7=4??? ??? h(43)=43 % 7=1??? h(54)=54 % 7=5??? h(90)=90 % 7=6??? ??? h(46)=46 % 7=4 此时冲突较多。为减少冲突,可取较大的m值和p值,如m=p=13,结果如下: ??? h(18)=18 % 13=5??? h(75)=75 % 13=10??? h(60)=60 % 13=8 ??? ??? h(43)=43 % 13=4??? h(54)=54 % 13=2??? h(90)=90 % 13=12??? ??? h(46)=46 % 13=7 此时没有冲突,如图7-10所示。 7.4.3 处理冲突的方法 (1)开放定址法 基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi?,通用的再散列函数形式: ?????Hi=(H(key)+di)% m?? i=1,2,…,n ( 1≤i m ) 关键字集为 {47,7,29,11,16,92,22,8,3},哈希表表长为11, H (key)=key % 11,用线性探测法处理冲突: 其中:H(key) 为用哈希函数计算得到的地址号(但)已被其他记录占用; m为哈希表的长度;di为增量序列,可有下列三种取值方法: * di = 1,2,3…,m-1,称线性探测再散列; *di = 12, -12, 22,-22,32,…±k 2 ( k ≤ m/2 )称二次探测再散列; * di为伪随机序列,称伪随机探测再散列; (2)拉链法 是将散列表中地址相同的关键字链接形成一个单链表,每个单链表第一个结点的地址对应存储在散列表相应的存储单元中。 (3)建立一个公共溢出区 凡是冲突的都放在一起,给冲突的元素找个区域存放。如同收孤儿院收留所。为所有冲突的关键字建立一个公共的溢出区来存放。 (4)哈希表的查找分析 一般情况下,处理冲突方法相同的哈希表,其平均查找长度依赖于哈希表的装填因子a。 a=表中填入的记录数/ 哈希表的长度 装填因子是哈希表装满程度的标志因子。由于表长是定值,α与“填入表中的元素个数”成正比,所以,α越大,填入表中的元素较多,产生冲突的可能性就越大;α越小,填入表中的元素较少,产生冲突的可能性就越小。 【例7-3】编写程序,实现在开散列表上查找元素。 #include stdio.h #include malloc.h #define MaxSize 20 typedef struct node5 { int key; struct node5 *next; }CHAINHASH; CHAINHASH *Htc[MaxSize]; void Creat_Hash(CHAINHASH *Htc[]) { CHAINHASH *p; int i, j; i = 0; scanf(%d,i); while (i != -99) { j = i % 13; p =(CHAINHASH*)malloc(sizeof(CHAINHASH)); p-next = Htc[j]; p-key = i; Htc[j] = p; scanf(%d,i); } /*输入开散列表元素关键字值*/ } void Print_hash(CHAINHASH *Htc[]) /*显示开散列表 */ { int i; CHAINHA
您可能关注的文档
- 数字逻辑电路测试与设计第2版教学课件ppt作者李玲第4章触发器与时序电路课件.ppt
- 数字逻辑电路测试与设计第2版教学课件ppt作者李玲第5章模数和数模转换电路课件.ppt
- 数字逻辑第2版习题答案作者武庆生数字逻辑第六章习题课件.ppt
- 数字逻辑第2版习题答案作者武庆生第三章习题课件.ppt
- 数字逻辑第2版习题答案作者武庆生第二章习题课件.ppt
- 数字逻辑第2版习题答案作者武庆生第五章习题课件.ppt
- 数字逻辑第2版习题答案作者武庆生第四章习题课件.ppt
- 数字逻辑第2版教学课件ppt作者武庆生第1章2014)课件.ppt
- 数字逻辑第2版教学课件ppt作者武庆生第2章2014课件.ppt
- 数字逻辑第2版教学课件ppt作者武庆生第2章2014)课件.ppt
文档评论(0)