伪随机探查和二次探查.PPT

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1 第十章 检索 宋国杰 北京大学信息科学技术学院 2010年12月 2010-2011第一学年本科生课程 2 内容 基本概念 10.1 线性表的检索 10.2 集合的检索 10.3 散列表的检索 3 引子:碰撞的处理 开散列方法(也称拉链法) 把发生冲突的关键码存储在散列表主表之外 闭散列方法(也称开地址方法 ) 把发生冲突的关键码存储在表中另一个槽内 4  10.3.2 开散列方法 碰撞发生时,把同义词存放在散列表外 两类方法 拉链法 桶式散列 5 1. 拉链法 把散列表中的每个槽定义为一个链表的表头 散列到特定槽的所有记录都放到这个槽的链表中 例子:{77、7、110、95、14、75、62 } h(Key) = Key % 11 6 同义词表的组织 组织方式 根据输入顺序 根据值的顺序 适合于检索不成功的情况 根据访问频率的顺序 7 拉链法性能分析 给定一个大小为M存储n个记录的表 散列函数(在理想情况下)将把记录在表中M个位置平均放置,使得平均每一个链表中有n/M个记录 Mn 时,散列方法的平均代价就是Θ(1) 8 不足之处 如果整个散列表存储在内存,拉链法容易实现 如果散列表存储在磁盘中,用拉链法则不太合适 同义词表中的元素可能存储在不同的磁盘页中 这就会导致在检索一个特定关键码值时引起多次磁盘访问,从而增加了检索时间 引入桶式散列 9 2. 桶式散列 适合存储于磁盘的散列表 基本思想 把文件记录分为若干桶,每个桶包含一个或多个页块 一个桶内的各页块用指针连接起来,每个页块包含若干记录 散列函数h(K)表示具有关键码值K的记录所在的存储桶号 10 桶式散列文件组织 右图表示一个具有B个存储桶的散列文件组织 如果B很小,存储桶目录表可放在内存 如果B较大,要存放好多页块,则存储桶目录表就放到外存上 11 桶式散列的访问 检索访问 计算H(i)的值,然后调桶目录表中包含第i个桶目录的页块进入内存,查到第i个存储桶的第一个页块的地址,然后根据该地址调入相应页块 磁盘访问性能 调存储桶目录表进入内存(设不在内存)需进行一次访外 逐个检查桶内各页块,则平均访外次数为桶内页块数一半 对于修改、插入等其他运算尚需另1次访外写外存。 12 10.3.3 闭散列方法 d0=h(K)称为K的基地址 当冲突发生时,使用某种方法为关键码K生成一个散列地址序列,称为探查序列 d1,d2,... di ,...dM-1 di = d0 + p(K,i) (0iM)是后继散列地址,p(K,i)是探查函数。 13 闭散列表解决冲突的基本思想 插入K时,若基地址结点已被占用 则按探查序列依次查找,将找到的第一个空闲位置di作为K的存储位置 若所有后继散列地址都不空闲,说明该闭散列表已满,报告溢出 14 检索过程 检索时也要像插入时一样遵循同样的策略 重复冲突解决过程 找出在基位置没有找到的记录 插入和检索函数都假定每个关键码的探查序列中至少有一个存储位置是空的 否则可能会进入一个无限循环中 也可以限制探查序列长度 15 探查方法 1. 线性探查法 2. 二次探查法 3. 伪随机数序列探查法 4. 双散列探查法 16 1. 线性探查 基本思想 如果记录的基位置存储位置被占用,那么就在表中下移,直到找到一个空存储位置 探查序列:d+1, d+2, ......, M-1, 0, 1, ......, d-1 用于简单线性探查的探查函数是:p(K,i) = i 线性探查的优点 表中所有的存储位置都可作为插入记录的候选 17 可能产生的问题——聚集 “聚集”(clustering,或称为“堆积”) 散列地址不同的结点,争夺同一后继散列地址 小的聚集可能汇合成大的聚集 导致很长的探查序列 18 散列表示例 已知一组关键码为(26,36,41,38,44,15,68,12,06,51,25),散列表长度M = 15,用线性探查法解决冲突构造这组关键码的散列表。 利用除余法构造散列函数,选取小于M的最大质数P = 13,则散列函数为:h(K)= K %13。顺序插入各个结点:26: h(26) = 0;36: h(36) = 10;41: h(41) = 2;38: h(38) = 12;44: h(44) = 5 发生冲突:15,68 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 26 25 41 15 68 44 6 36 38 12 51 19 聚集示例 在理想情况下,表中的每个空槽都应该有相同的机会接收下一个要插入的记录。 下一条记录放在第11个槽中的概率是2/15 放到第7个槽中的概率是11/15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

文档评论(0)

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

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

1亿VIP精品文档

相关文档