第九篇查找(Search).ppt

  1. 1、本文档共98页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
冲突处理 开放定址法 (Open Address Hash) 封闭定址法 (Closed Address Hash) 封闭定址法: Hash表链表数组,地址空间是H[0….n-1]; Hash表单元H[i]是一个链表,存放若干数据元素,他们是同义词; 它的基本思想是: 将同义词防在key的hash 码对应的链表中; 三、处理冲突的方法 0 1 2 3 4 5 6 7 1051 1779 1492 1812 1917 1945 例: H(key)=key mode 8 Keys: 1051 1492 1779 1812 1917 1945 H[key]= 3 4 3 4 5 5 查找:对给定的key, 计算hash码 i=H(key); 在链表H[i]中顺序查找key; 算法分析: 计算hash码,很少的工作量,是常数 a; 在链表H[i]中顺序查找,(Li+1)/2, Li是该链表长度; 所以 其中: m是表长,n是数据元素个数; 请大家自己写出插入、删除算法 开放定址法: Hash表是数组,地址空间是H[0….n-1]; Hash表单元H[i]只存放一个数据元素; 它的基本思想是: 如果一个元素的Hash地址对应的Hash单元已被另一个元素占有(冲突),我们需定义一个候选地址序列,每当发生冲突时,选择下一个地址去试探。这个序列称为探测序列 Key的探测序列:d0, d1, ……, dm-1, m是表长; d0=H(key) d1, ……, dm-1,需要我们定义, 计算d1, ……, dm-1,的过程称为rehash(再Hash); Rehash: 1). 最简单的rehash是线性探测再散列 (Linear Probing Rehash) di=(di-1+1) mod m or di=(d0+i) mod m or rehash(j)=(j+1) mod m j是最近一次探测的地址; 例: H(key)=key mode 8 Keys: 1051 1492 1776 1812 1918 1945 d0= 3 4 0 4 6 5 d1= 5 6 d2= 7 1776 1055 1492 1812 1918 1945 0 1 2 3 4 5 6 7 H 例: H(key)=key mode 8 Keys: 56 16 32 72 64 8 24 d0= 0 0 0 0 0 0 0 d1= 1 1 1 1 1 1 d2= 2 2 2 2 2 ………………………….. 56 16 32 72 64 8 24 0 1 2 3 4 5 6 7 H 发生了大量的冲突,冲突位置集中,这种现象是聚集 2) 随机探测再散列 方法很多: di=(di-1+p) mod m p是一质数; di=(di-1+hashk(key)+1) mod m di=(di-1+(-1)i i) mod m Int search(KeyType K, boolean empty) { ans=-1; empty=false; // 缺省查找不成功; code=H(K); // 计算d0, code是起始探测位置, loc=code; //loc是当前探测位置 while (H[loc]!=emptyCel

文档评论(0)

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

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

1亿VIP精品文档

相关文档