zoukankan      html  css  js  c++  java
  • 散列·布谷鸟散列

    布谷鸟散列

    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

    凡你能说的,你说清楚。凡你不能说的,留给沉默!
  • 相关阅读:
    反射:框架设计的灵魂
    Junit测试
    XML笔记
    map 的用法
    opencv总结1
    光源
    镜面反射
    openGL纹理对象
    GPU入门
    动态规划1
  • 原文地址:https://www.cnblogs.com/dhcao/p/10562128.html
Copyright © 2011-2022 走看看