hash存在天然的问题,哈希冲突,又叫哈希碰撞。

开放定址法

​ 也叫再散列法,其基本思想是:当关键字 key 的哈希地址 p=H(key)出现冲突时,以 p 为基础,产生另一个哈希地址 p1 ,如果 p1 仍然冲突,再以 p 为基础,产生另一个哈希地址 p2 ,…,直到找出一个不冲突的哈希地址 pi ,将相应元素存入其中。

​ 这种方法有一个通用的再散列函数形式: Hi=(H(key) + di) % m i=1,2,…,n(n <= m-1) 其中 H(key)为哈希函数,m 为表长,di 称为增量序列。

​ 增量序列的取值方式不同,相应的再散列方式也不同。主要有以下三种:

​ 1、线性探测法,di=1,2,3,…,m-1,简单地说,就是以当前冲突位置为起点,步长为 1 循环查找,直到找到一个空的位置,如果循环完了都没找到,证明容器已经满了;

​ 2、平方探测法,di=±1²,±2²,…,±k² (k<=m/2),相当于步长为±i²查找,直到找到一个空的位置;

​ 3、伪随机探测法,di=伪随机数序列,相当于每次查找的步长都是随机的。

​ 下面是一个具体的例子,已知哈希表长度 m=11,哈希函数为:H(key)= key % 11,则 H(47)=3H(26)=4H(60)=5,假设下一个关键字为 69,则H(69)=3,与 47 冲突:(1)用线性探测法处理冲突,下一个哈希地址为 H1=(3 + 1)% 11 = 4,仍然冲突,再找下一个哈希地址为 H2=(3 + 2)% 11 = 5,还是冲突,继续找下一个哈希地址为 H3=(3 + 3)% 11 = 6,此时不再冲突,将 69 填入 5 号单元;(2)用平方探测法处理冲突,下一个哈希地址为 H1=(3 + 1²)% 11 = 4,仍然冲突,再找下一个哈希地址为 H2=(3 - 1²)% 11 = 2,此时不再冲突,将 69 填入 2 号单元;(3)用伪随机探测法处理冲突,且伪随机数序列为:2,5,9,……,则下一个哈希地址为 H1=(3 + 2)% 11 = 5,仍然冲突,再找下一个哈希地址为H2=(3 + 5)% 11 = 8,此时不再冲突,将 69 填入 8 号单元。

再哈希法

​ 这种方法是同时构造多个不同的哈希函数:Hi=RH1(key) i=1,2,…,k,当哈希地址 Hi=RH1(key)发生冲突时,再计算 Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生堆集,但增加了计算时间。

链地址法

​ 又叫拉链法,就是将所有哈希地址为 i 的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第 i 个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。

建立公共溢区

​ 将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。此方法缺点在于:查找冲突数据的时候,需要遍历整个溢出表才能获取到数据。

优缺点

开发定址法

​ 1、优点:(1)记录更容易进行序列化操作;(2)如果记录总数可以预知,可以创建完美哈希函数,此时处理数据的效率是非常高的。

​ 2、缺点:(1)存储记录的数目不能超过桶数组的长度,如果超过就需要扩容,而扩容会导致某次操作的时间成本飙升;(2)使用探测序列,有可能其计算的时间成本过高,导致哈希表的处理性能降低 ;(3)当冲突多的时候,数据容易堆积在一起,对查找不友好;(4)删除记录时,不能简单的将节点的空间置空,否则将会截断在它填入散列表之后的同义词节点查找路径,因此删除只能是添加一个标记,逻辑删除。比如需要删除记录a,记录b是在a之后插入桶数组的,但是和记录a有冲突,是通过探测序列再次跳转找到的地址,所以如果直接删除a,a的位置变为空槽,而空槽是查询记录失败的终止条件,这样会导致记录b在a的位置重新插入数据前不可见,所以不能直接删除a,而是设置删除标记。

拉链法

​ 1、优点:(1)对于记录总数频繁可变的情况,处理的比较好(避免了动态调整的开销);(2)拉链法中各个链表上节点是动态申请的,不会造成内存的浪费,所以尤其适合那种记录本身尺寸很大的情况和无法确定表长的情况;(3)删除记录时,易于实现,直接将链表上的节点删除即可;(4)处理冲突的方式简单,且无堆积现象,非同义词绝对不会发生冲突,平均查找时间较短。

​ 2、缺点:(1)存储的记录是随机分布在内存中的,这样在查询记录时,相比结构紧凑的数据类型(比如数组),哈希表的跳转访问会带来额外的时间开销 ;(2)使用链表,记录不容易进行序列化操作。

哈希函数处理冲突的方法相关推荐

  1. 哈希表、冲突处理方法、查找长度

    1.定义 哈希函数就是将关键字和它的存储位置之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应.按这个思想建立的表为哈希表. 2.哈希函数的构造方法 2.1 直接定址法 取关键 ...

  2. 哈希表解决冲突的两种方式

    虽然我们不希望发生冲突,但实际上发生冲突的可能性仍是存在的.当关键字值域远大于哈希表的长度,而且事先并不知道关键字的具体取值时.冲突就难免会发 生.另外,当关键字的实际取值大于哈希表的长度时,而且表中 ...

  3. 哈希算法(哈希函数)的基本使用

    哈希算法(哈希函数)的基本使用 什么是哈希? 哈希的原理和特点 数组与哈希表 哈希函数 哈希函数的冲突与碰撞 哈希算法 哈希的应用 什么是哈希? 如果我们需要誊抄一本新华字典,那么有什么方法呢?比如当 ...

  4. 数据结构 - 哈希策略和冲突处理

    1. 哈希策略 访问集合中的项的最快的方法,是通过数组和基于数组的列表所支持的随机访问. 假设第一个建是1500,剩下的键是连续性的数字.数组中一个给定的位置,可以通过表达式key - 1500 来计 ...

  5. 哈希表 哈希函数 时间_您需要了解的哈希函数

    哈希表 哈希函数 时间 安全从业人员的功能表中有一个工具可以帮助每个人理解,无论他们对计算机进行什么操作:加密哈希函数. 这听起来听起来像是神秘的,技术性的,甚至可能很无聊,但是我对什么是哈希以及它们 ...

  6. 数据结构:哈希表函数构造和冲突解决方法

    哈希表 哈希函数:记录的存储位置和它的关键字之间建立一个确定的对应关系. 冲突:对不同的关键字可能得到同一哈希地址,这种现象称为冲突. 哈希函数构造方法 1.直接定址法 取关键字或关键字的某个线性函数 ...

  7. python字典实现原理-哈希函数-解决哈希冲突方法

    python字典实现原理-哈希函数-解决哈希冲突方法 参考文章: (1)python字典实现原理-哈希函数-解决哈希冲突方法 (2)https://www.cnblogs.com/guyannanfe ...

  8. Hash函数与算法、哈希查找、哈希冲突解决方法总结

    Hash哈希知识点导航 1.基本概念 2. 哈希函数   2.1 直接寻址法   2.2 数字分析法   2.3 平方取中法   2.4 折叠法   2.5 随机数法   2.6 除留余数法 3. 哈 ...

  9. 哈希 ---《哈希函数》------除数的选取为什么是质数?、《哈希冲突》------解决方法、《闭散列》、《开散列》

    一.哈希概念 顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较**.顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(logN ) ...

最新文章

  1. mysql数据库中nchar_MySQL数据库中CHAR与VARCHAR之争
  2. 聊聊nginx报错499问题
  3. 【莓控】黑莓8110中文说明书
  4. PHP计划任务:如何使用Linux的Crontab执行PHP脚本
  5. iOS后台下载功能(收集)
  6. 究竟该不该“勃”!!!
  7. 关于流水帐表序列号生成时的并发操作问题
  8. 2019年Q3:全球超大规模数据中心数量增至504个
  9. gdal库对ENVI文件的一点支持不好
  10. java 拼接html_程序员用1.5小时写出的Java代码,让同事瞠目结舌!直呼优秀
  11. tableau 倒序都倒了_Tableau优秀作品拆解复刻01-是时候终结瘘管病了
  12. IAR集成开发环境的使用
  13. TCGA三个在线可视化网站
  14. Kindle Paperwhite2(第6代)5.7.2.1固件升级教程
  15. 快速更换证件照背景颜色
  16. matlab求导函数作图,excel对数据求导作图/如何用excel计算导数
  17. linux nand flash模拟u盘,STM32 USB NAND FLASH 模拟U盘
  18. 洛谷算法题单:模拟与高精度例题(上)
  19. 大数据工程师需要哪些基础知识?
  20. linux系统多网口聚合配置,linux端口聚合

热门文章

  1. c语言编程1 1=2,编写一个C语言程序:求S=1/1+1/2+1/3+…+1/n
  2. 鸟哥的linux私房菜 lvm,linux鸟哥的私房菜学习笔记之LVM学习
  3. VMware中出现物理内存不足的解决方案
  4. 委托站点中的MIP、RMPN、UMPN、IMEI、IMSI、分别代表是什么意思?
  5. html简单组件(三):简洁美观的搜索框
  6. 忘记密码 密码保护SqlServer备份文件恢复方法
  7. 2017中国(上海)国际城市地下综合管廊产业展览会暨主题论坛会刊(参展商名录)
  8. 用计算机求平均数怎么做,3. 利用计算器求平均数
  9. tableau-帕累托图
  10. JavaScript-异常处理