虽然平方探测排除了一次聚集,但散列到同一位置的元素仍然会探测相同的备选位置,比如当冲突函数为i^2时,对于每个要插入的X,其向前探测地步长都是0,1,4,9,16,这样对于散列到同一位置的X,他们都会探测相同的备选位置,这是二次聚集。双散列对平方探测法里面的冲突函数做了进一步的改进,F(i)进一步的复杂化,引入了另外一个函数,这个函数对每个X都会计算出一个值,而不是和二次函数一样探测同样的位置。比较常见的是作为冲突函数,即散列函数为的选择也十分重要,显然,函数结果一定不能为0.与类似,也可以是求余的形式,如=R - (X mod R)。如下面的例子

双散列如果实现得较好,其预期的探测次数几乎和随机冲突解决方法的进行相同。相对于平方探测,它多加了一个散列函数,而平方探测不需要第二个散列函数,因此在实践中更加简单,同时速度更快。但是平方探测法最好表中元素不要填的太满,应该将其装填因子保持在0.5以下。对于元素过满的表,我们可以再散列(rehashing),建立另外一个大约两倍大的表(并且使用一个相关的新的散列函数),扫描整个原始表的元素,通过新的散列函数将原表中未删除的元素散列到新表中。一个例子就是将大小为7的原表中的4个元素(装填因子为0.71)再散列到大小为17的新表中,原散列函数为X mod 7,新的散列函数为X mod 17.

  

                                      

再散列代价十分昂贵,运行时间为O(N),如果在交互系统中运用,若有用户刚好插入引起了再散列,他将会感到系统速度变慢。对于再散列的时机,一种是表满到一半就再散列,一种是插入失败才再散列,还有就是达到某个装填因子时再散列。似乎第三种是比较合适的时机,因为装填因子确实对散列的性能有比较大的影响。

再散列在平方探测法中的实现:

HashTb rehashing(HashTb ht)
{int old_size = ht->table_size;Cell* old_table = ht->table;ht = initialize(2 * old_size);for (int i = 0; i < old_size; ++i){if (old_table[i].info == Legitimate){insert(ht, old_table[i].element);}}free(old_table);return ht;
}

数据结构笔记(六)——散列(Hash Table)之双散列和再散列(4)相关推荐

  1. 散列表(Hash Table)

    散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列 ...

  2. 什么是散列表(Hash Table)

    散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度 ...

  3. 数据结构--散列表 Hash Table

    文章目录 1.线性探测 哈希表代码 2.拉链法 哈希表代码 1. 散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来.可以说,如果没有数组,就没有散列表. ...

  4. 白话算法(6) 散列表(Hash Table)从理论到实用(中)

    不用链接法,还有别的方法能处理碰撞吗?扪心自问,我不敢问这个问题.链接法如此的自然.直接,以至于我不敢相信还有别的(甚至是更好的)方法.推动科技进步的人,永远是那些敢于问出比外行更天真.更外行的问题, ...

  5. 白话算法(6) 散列表(Hash Table) 从理论到实用(下)

    [澈丹,我想要个钻戒.][小北,等等吧,等我再修行两年,你把我烧了,舍利子比钻戒值钱.] --自扯自蛋 无论开发一个程序还是谈一场恋爱,都差不多要经历这么4个阶段: 1)从零开始.没有束缚的轻松感.似 ...

  6. 数据结构——散列表(Hash Table)(哈希表)

    散列表 散列表英文是hash table,经常被叫做Hash表,或者哈希表. 哈希表其实就是由数组演化而来的,利用的就是数组支持按照下标随机访问数据的特性,可以说散列表就是数组的一种扩展. 百度文库对 ...

  7. 算法设计与分析——散列表/哈希表(Hash Table):直接寻址表

    分类目录:<算法设计与分析>总目录 相关文章: ·散列表/哈希表(Hash Table)(一):基础知识 ·散列表/哈希表(Hash Table)(二):直接寻址表 ·散列表/哈希表(Ha ...

  8. 数据结构笔记 第六章 查找技术

    查找技术 在计算机科学中定义为:在一些(有序的/无序的)数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找.也就是根据给定的某个值,在查找表中确定一个关键字等于给定值的记录或数据元 ...

  9. 06-散列(Hash)基础分析

    文章目录 散列(Hash)基础分析 什么是散列表? 如何理解散列设计? 如何解决散列冲突? Java中散列应用分析与实践? 如何对散列(Hash)函数进行设计? 数据插入时线性探测过程是怎样的? 开放 ...

最新文章

  1. corosync+pacemaker高可用集群
  2. SAS数据挖掘方法论 ─ SEMMA
  3. 腾飞答不忘初心的三个问题
  4. 上手测试GaussDB(for Redis) 和开源 Redis,只为推荐质优价廉的Redis
  5. 驱动设计ARM(6410)-按键驱动0基础知识点
  6. DB2 8.2 9.1 9.5 9.7 下载地址(原创)
  7. 5G 协议 标准 下载
  8. c语言贪吃蛇程序设计报告蚂蚁文库,贪吃蛇游戏C程序设计报告
  9. 小新pro13黑苹果配置实录
  10. 穿越“惊世骇俗”的美景
  11. 财务内部收益率用计算机怎么算,​财务内部收益率怎么算
  12. 十几减9的口算题_一年级数学《口算十几减9》教案
  13. 如何用matlab对两个行向量作图_matlab 绘图与图形处理(二)
  14. 三剑客----awk
  15. Ant Design Charts绘制中国地图并动态添加标记点
  16. 【摘记】ABD-Net: Attentive but diverse Person Re-Id
  17. 计组作业【题目记录】
  18. python代码 素数集合 回文素数,反素数,梅森素数,双素数
  19. What is Java thread priority? 什么是java线程优先级
  20. CTF 竞赛入门指南(CTF All In One)学习(七)

热门文章

  1. HTML5--入门介绍
  2. 逻辑推理:张老师的生日
  3. 【面试】Js面试题(一)
  4. ERROR 429: Too Many Requests.
  5. 如何在linux上的上修改配置ip地址
  6. 微信小程序开发项目源代码_SSM项目汽车租赁平台+后台管理系统
  7. c 开发android ios实例,使用 C++ 进行跨平台移动开发
  8. 皮尔逊相关性的五个假设前提
  9. 华为路由器忘记密码_如果忘记密码,如何访问路由器
  10. 自做Google Chrome免安装绿色版