虽然我们不希望发生冲突,但实际上发生冲突的可能性仍是存在的。当关键字值域远大于哈希表的长度,而且事先并不知道关键字的具体取值时。冲突就难免会发 生。另外,当关键字的实际取值大于哈希表的长度时,而且表中已装满了记录,如果插入一个新记录,不仅发生冲突,而且还会发生溢出。因此,处理冲突和溢出是 哈希技术中的两个重要问题。
1、开放定址法

 用开放定址法解决冲突的做法是:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探查到开放的 地址则表明表中无待查的关键字,即查找失败。
注意:
①用开放定址法建立散列表时,建表前须将表中所有单元(更严格地说,是指单元中存储的关键字)置空。
②空单元的表示与具体的应用相关。
    按照形成探查序列的方法不同,可将开放定址法区分为线性探查法、线性补偿探测法、随机探测等。
(1)线性探查法(Linear Probing)
该方法的基本思想是:
   将散列表T[0..m-1]看成是一个循环向量,若初始探查的地址为d(即h(key)=d),则最长的探查序列为:
       d,d+l,d+2,…,m-1,0,1,…,d-1
    即:探查时从地址d开始,首先探查T[d],然后依次探查T[d+1],…,直到T[m-1],此后又循环到T[0],T[1],…,直到探查到T[d-1]为止。
探查过程终止于三种情况:
    (1)若当前探查的单元为空,则表示查找失败(若是插入则将key写入其中);
   (2)若当前探查的单元中含有key,则查找成功,但对于插入意味着失败;
    (3)若探查到T[d-1]时仍未发现空单元也未找到key,则无论是查找还是插入均意味着失败(此时表满)。
利用开放地址法的一般形式,线性探查法的探查序列为:
       hi=(h(key)+i)%m 0≤i≤m-1 //即di=i
用线性探测法处理冲突,思路清晰,算法简单,但存在下列缺点:
① 处理溢出需另编程序。一般可另外设立一个溢出表,专门用来存放上述哈希表中放不下的记录。此溢出表最简单的结构是顺序表,查找方法可用顺序查找。
② 按上述算法建立起来的哈希表,删除工作非常困难。假如要从哈希表 HT 中删除一个记录,按理应将这个记录所在位置置为空,但我们不能这样做,而只能标上已被删除的标记,否则,将会影响以后的查找。
③ 线性探测法很容易产生堆聚现象。所谓堆聚现象,就是存入哈希表的记录在表中连成一片。按照线性探测法处理冲突,如果生成哈希地址的连续序列愈长 ( 即不同关键字值的哈希地址相邻在一起愈长 ) ,则当新的记录加入该表时,与这个序列发生冲突的可能性愈大。因此,哈希地址的较长连续序列比较短连续序列生长得快,这就意味着,一旦出现堆聚 ( 伴随着冲突 ) ,就将引起进一步的堆聚。
(2)线性补偿探测法
线性补偿探测法的基本思想是:
将线性探测的步长从 1 改为 Q ,即将上述算法中的 j = (j + 1) % m 改为: j = (j + Q) % m ,而且要求 Q 与 m 是互质的,以便能探测到哈希表中的所有单元。
【例】 PDP-11 小型计算机中的汇编程序所用的符合表,就采用此方法来解决冲突,所用表长 m = 1321 ,选用 Q = 25 。
(3)随机探测
随机探测的基本思想是:
将线性探测的步长从常数改为随机数,即令: j = (j + RN) % m ,其中 RN 是一个随机数。在实际程序中应预先用随机数发生器产生一个随机序列,将此序列作为依次探测的步长。这样就能使不同的关键字具有不同的探测次序,从而可以避 免或减少堆聚。基于与线性探测法相同的理由,在线性补偿探测法和随机探测法中,删除一个记录后也要打上删除标记。

2、拉链法
(1)拉链法解决冲突的方法
    拉链法解决冲突的做法是:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数 组T[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。在拉链法中,装填因子α可以大于 1,但一般均取α≤1。
【例】设有 m = 5 , H(K) = K mod 5 ,关键字值序例 5 , 21 , 17 , 9 , 15 , 36 , 41 , 24 ,按外链地址法所建立的哈希表如下图所示:
          
(2)拉链法的优点
与开放定址法相比,拉链法有如下几个优点:
①拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;
②由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;
③开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;
④在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表,删除结点不能简单地将被删结 点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条件。因此在 用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点。
(3)拉链法的缺点
    拉链法的缺点是:指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间,而若将节省的指针空间用来扩大散列表的规模,可使装填因子变小,这又减少了开放定址法中的冲突,从而提高平均查找速度。

转载于:https://blog.51cto.com/zlfwmm/1636812

解决哈希(HASH)冲突的主要方法相关推荐

  1. HashMap解决Hash冲突为什么要使用红黑树

    1.HashMap的数据结构 HashMap是由数组与链表来实现的,同时,也具备了数组和链表的所以特点 2.什么是hash冲突 hash冲突:就是根据key即经过一个哈希变换得到的结果的作为地址去存放 ...

  2. HashMap是怎么解决哈希冲突的?

    文章目录 HashMap是怎么解决哈希冲突的? 什么是哈希冲突? HashMap采用链式寻址法解决 扩展 开放寻址法 再Hash法 建立公共溢出区 HashMap是怎么解决哈希冲突的? 一搜博客啊,我 ...

  3. Hash冲突处理终极版

    对于Hash,我们是怎样来处理冲突的.现在就来介绍一些经典的Hash冲突处理的方法.主要包括 (1)开放地址法 (2)拉链法 (3)再哈希法 (4)建立公共溢出区 (1)开放地址法     基本思想: ...

  4. 解决哈希(hash)冲突的方法

    解决哈希(hash)冲突的方法 当关键字值域远大于哈希表的长度,而且事先并不知道关键字的具体取值时.冲突就难免会发生.另外,当关键字的实际取值大于哈希表的长度时,而且表中已装满了记录,如果插入一个新记 ...

  5. HashMap 中 hash 冲突的解决方法及原理分析

    我们最先衰老的不是容貌,而是不顾一切的闯劲.有时候,要敢于背上超出自己预料的包袱,真的努力后,你会发现自己要比想象的优秀很多. HashMap冲突的解决方法比较考验一个开发者解决问题的能力. 在Jav ...

  6. hash冲突原理及解决方法

    在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap也一样.当程序试图将多个 key-value 放入 HashMa ...

  7. HashMap的实现原理及hash冲突(碰撞)解决方法

    HashMap 采用一种所谓的"Hash 算法"来决定每个元素的存储位置.当程序执行 map.put(String,Obect)方法 时,系统将调用String的 hashCode ...

  8. 初窥Java哈希(如何解决Hash冲突)

    目录 一.引言 二.哈希表和哈希冲突概念 1.通过取模运算来建立一个简单的哈希表 2.什么是哈希冲突 3.哈希函数设计原则 4.常见的哈希函数 (1)直接定址法 (2)除留余数法 (3)平方取中法 ( ...

  9. 解决哈希冲突(四种方法)

    目录 一.了解哈希表及哈希冲突 二.解决哈希冲突办法 1.开放定址法:我们在遇到哈希冲突时,去寻找一个新的空闲的哈希地址. (1)线性探测法 (2)平方探测法(二次探测) 2.再哈希法 3.链地址法: ...

  10. 哈希冲突与解决哈希冲突的两种方法

    哈希冲突与解决哈希冲突的两种方法 1.哈希冲突 2.解决哈希冲突的方法 (1)链接法 (2)开放寻址法 ①线性探查 ②二次探查 ③双重探查 注:本文注重对解决哈希冲突方法的介绍,而非对背后原理的介绍. ...

最新文章

  1. LaTeX技巧 twocolumn 双栏
  2. ADC的有效位数和信纳比计算
  3. BZOJ4381[POI2015]Odwiedziny——分块+长链剖分
  4. Visual Studio Code 配置指南
  5. win10触摸板手势
  6. deepin执行apt-get update报错https://deb.opera.com/opera-stable stable Release” 没有 Release 文件N: 无法安全地用该
  7. GPU Gems1 - 26 OpenEXR图像文件格式与HDR(The OpenEXR Image File Format and HDR)
  8. Ubuntu 装机必备设置与软件安装
  9. linux内存管理总结
  10. 又崩了?苹果发生大规模网络故障:多项服务受影响 目前已恢复
  11. 《CATIA V5 从入门到精通(第二版)》——2.3 操作草图(Operation)
  12. linux dbx 进程,dbx 命令命令详解
  13. Flex TLF 相关知识
  14. CentOS 7 Shipyard启动时一直显示省略号的解决办法
  15. 《上海市居住证》积分申请的个人书面材料
  16. 中文短文本分类实例十四-LEAM(Joint Embedding of Words and Labels for Text Classification)
  17. 淘宝店铺运营经验分享,影响宝贝转化率的因素有哪些,如何提高转化
  18. 人工智能,这五个行业岗位未来很吃香
  19. 图片链接直接打开显示正常,放在img标签里就加载不出来的解决方法
  20. 最新最全的免费股票数据接口--沪深A股基本面数据API接口(四)

热门文章

  1. NeurIPS 2021论文接收结果统计:Oral级论文不足3%,图神经网络火到进前三
  2. 科创板首发过会,格灵深瞳“三变”交出IPO答卷
  3. 咱们程序员,能吵吵就别动手!现在靠说就可以编程,支持Java、Python等10种语言|免费...
  4. 三次元风景照秒变宫崎骏动画,还能把石原里美吉卜力化,AnimeGAN已开源
  5. 解读2019华为第001号文件:AI时代软件开发的第一要义是可信
  6. 加速产业AI化!浪潮提出”元脑“生态计划,要用计算力+生态成就行业AI大脑...
  7. 神经网络在Keras中不work!博士小哥证明何恺明的初始化方法堪比“CNN还魂丹”...
  8. Kubernetes源码分析之kubelet
  9. 根因分析初探:一种报警聚类算法在业务系统的落地实施
  10. IccFileHandler和IccRecords