了解Cuckoo哈希插入

时间:2017-05-03 16:01:59

标签: algorithm hash

我一直在尝试从这个伪代码中学习布谷鸟哈希插入的工作原理:

procedure insert(x)
    if lookup(x) then return
    loop MaxLoop times
        x ↔ T1[h1(x)]
        if x = ⊥ then return
        x ↔ T2[h2(x)]
        if x = ⊥ then return
    end loop
    rehash(); insert(x);
 end

在线resource的第4页中找到了该内容。我想知道是否有人可以解释MaxLoop下的代码?

我对算法的看法是以下步骤:

  • 尝试使用哈希函数h1(x)
  • 在两个表中的第一个表中插入密钥
  • 如果它们是碰撞,请尝试使用h2(x)
  • 插入第二个表格
  • 如果他们是第二个表中的collison,请插回第一个表,并踢出前一个占用密钥。
  • 继续重复上述步骤,直到插入密钥。如果发生循环,则重新散列表格并重新开始。

我只是不明白这些步骤是如何进入MaxLoop下的代码的?特别是x ↔ T1[h1(x)]x ↔ T2[h2(x)]之类的代码,它们是交换值。

如果可能的话,可以理解伪代码的任何类型的更简单的版本/解释,因为难以从伪代码逐步理解该算法。

1 个答案:

答案 0 :(得分:2)

正如您所注意到的,算法在每个点处交换要插入的值以及哈希表中的槽。它不会检查插槽是否为空,只检查该值是否为。

所以循环的更好描述是:

  • 将密钥插入两个表中的第一个
  • 如果该位置已被占用,请将旧值插入第二个表格。
  • 如果该位置被占用,请继续循环。

实际上,插入是在两个表之间形成锯齿的路径,在找到空槽(或路径太长)时结束。

这两个表必须具有不同的散列函数,因为如果一个值在两个表中具有相同的散列,则被驱逐的值将进入另一个表中的相同插槽,从而逐出一个值,该值将进入同一个插槽中原始表,使路径的最大长度为2。使用不同的散列函数,被驱逐的值可以在另一个表中的任何位置gi,并且典型的路径长度可以更大。