散列·布谷鸟散列

布谷鸟散列

1、定义

1.1 描述

​ 假设有N个项,我们维护两个分别超过半空的表,且有独立的散列函数,可以把每个项分配到每个表中的一个位置,布谷鸟散列保持不变的是一个项总是会被存储在这两个位置之一。

  • 维护2个超过半空的散列表

  • 每个表有独立的散列函数

  • 每个项都在2个表中有对应位置

    1.2 图解

    图解

  • 图解说明

    ​ 我们的初始状态为2张表,分别由2个散列函数维护,现在我们有ABCDEF 共6个元素,每个元素在2张表中均有散列位置(例如A在表1中的散列位置为0,在表2中的散列位置为2),开始插入

    1. 图1:插入A,先寻找在表1点散列位置0,插入到位置0;

    2. 图2:插入B,先寻找在表1点散列位置0,插入到位置0,但是位置0已经有A存在,后插入优先原则,B将A从表1点位置0挤走,A进入备选位置,插入表2点位置2;

    3. 图3:插入C,在表1点位置1插入C,没有冲突;

    4. 图4:插入D,在表1的位置为1,产生冲突,将C挤走,C插入表2位置4;

      ​ 插入E,在表1点位置3;

    5. 图5:插入F,在表1点位置3,产生冲突,将E挤走;

    6. 图6:E被挤到表2位置2,产生冲突,将A挤走;

    7. 图7:A被挤到表1位置0,产生冲突,将B挤走;

    8. 图8:B被挤到表2位置0,没有冲突,最终状态确定。

2、循环

​ 在上述图解中,我们看到在进行元素插入时,我们总是优先插入当前插入的元素,若产生冲突,则将原位置的元素挤走,如此类推,知道所有元素没有冲突的插入。但是,这种模式有个很明显的问题,就是如果散列值不好,则很容易发生循环,即插入导致永远的在挤走冲突元素,永远都在冲突状态。例如:在上述图解中插入G(1,2)。就会产生循环。

2.1 循环概率

​ 有研究表明,如果表的装填因子小于0.5,循环的概率非常低

3、扩展

​ 如果在2张表的基础上,建立更多的表用来散列,比如3表分散,4表分散。虽然这样做增加了查找的开销,但也大幅度增加了空间的利用。因为每张表都会很小。

4、优势

​ 布谷鸟散列的优势:

  1. 最坏情况下常数级的查找和删除时间。
  2. 避免了懒惰删除和额外的数据以及并行化的可能性。

5、代码实现

https://github.com/dhcao/dataStructuresAndAlgorithm/blob/master/src/chapterFive/CuckooHashTable.java

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TuringK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值