数据结构-散列表课件.ppt

  1. 1、本文档共34页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构-散列表课件

7.3 散列表的查找技术;7.3 散列表的查找技术;概 述;散列表:采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表。;散列函数:将关键码映射为散列表中适当存储位置的函数。;散列地址:由散列函数所得的存储位置 。;例子;概 述;散列技术的关键问题: ⑴ 散列函数的设计。如何设计一个简单、均匀、存储利用率高的散列函数。 ⑵ 冲突的处理。如何采取合适的处理冲突方法来解决冲突。;冲突:对于两个不同关键码ki≠kj,有H(ki)=H(kj),即两个不同的记录需要存放在同一个存储位置,ki和kj相对于H称做同义词。 ;散列函数;1、散列函数——直接定址法;散列函数为:;根据关键码在各个位上的分布情况,选取分布比较均匀的若干位组成散列地址。 ;适用情况:;对关键码平方后,按散列表大小,取中间的若干位作为散列地址(平方后截取)。 ;将关键码从左到右分割成位数相等的几部分,将这几部分叠加求和,取后几位作为散列地址。 ;1、处理冲突的方法——开放定址法;(1)线性探测法;例:关键码集合为 {47, 7, 29, 11, 16, 92, 22, 8, 3},散列表表长为11,散列函数为H(key)=key mod 11,用线性探测法处理冲突,则构造的散列表为:;用线性探测法构造的散列表中查找算法——伪代码;int HashSearch1(int ht[ ], int m, int k) { int j=k%m; if (ht[j]==k) return j; //没有发生冲突,比较一次查找成功 int i=(j+1) % m; while (i!=j) { if (ht[i]==k) return i; //发生冲突 if(ht[i]==0) break; i=(i+1) % m ;//向后探测一个位置 } if (i==j) throw 溢出; else { ht[i]=k; return i; }};(2)二次探测法;;(3)随机探测法;基本思想:将所有散列地址相同的记录,即所有同义词的记录存储在一个单链表中(称为同义词子表),在散列表中存储的是所有同义词子表的头指针。 ;例:关键码集合 {47, 7, 29, 11, 16, 92, 22, 8, 3},散列函数为H(key)=key mod 11,用拉链法处理冲突,构造的开散列表为: ;在拉链法构造的散列表查找算法——伪代码;Nodeint *HashSearch2(Nodeint *ht[ ], int m, int k) { j=H(k); p=ht[j]; while (p p-data!=k) p=p-next; if (p-data= =k) return p; else { q=new Nodeint; q-data=k; q-next= ht[j]; ht[j]=q; } };基本思想:散列表包含基本表和溢出表两部分(通常溢出表和基本表的大小相同),将发生冲突的记录存储在溢出表中。查找时,对给定值通过散列函数计算散列地址,先与基本表的相应单元进行比较,若相等,则查找成功;否则,再到溢出表中进行顺序查找。 ;例:关键码集合 {47, 7, 29, 11, 16, 92, 22, 8, 3},散列函数为H(key)=key mod 11,用公共溢出区法处理冲突,构造的散列表为: ;散列查找的性能分析 ;查找成功时;开散列表与闭散列表的比较

文档评论(0)

gm8099 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档