【问题标题】:Understanding Cuckoo hashing insertion了解 Cuckoo 哈希插入
【发布时间】:2017-05-03 16:01:58
【问题描述】:

我一直在尝试从这个伪代码中了解杜鹃散列插入的工作原理:

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)
  • 如果他们是第二张表中的冲突,则插入回第一张表中,并踢出之前的占用键。
  • 不断重复上述步骤,直到插入钥匙。如果出现循环,则重新哈希表并重新开始。

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

如果可能,我们将不胜感激任何更简单的伪代码版本/解释,因为很难从伪代码逐步理解该算法。

【问题讨论】:

    标签: algorithm hash


    【解决方案1】:

    正如您所注意到的,在每一点,算法都会将要插入的值与哈希表中的一个槽进行交换。它不检查槽是否为空,如果是则只放置值。

    因此,对循环的更好描述是:

    • 在两个表的第一个中插入键
    • 如果该位置已被占用,则将旧值插入到第二个表中。
    • 如果该位置已被占用,则继续循环。

    实际上,插入是在两个表之间曲折的路径中,当找到一个空槽时结束(或路径太长)。

    两个表必须具有不同的哈希函数,因为如果一个值在两个表中具有相同的哈希,则被驱逐的值将进入另一个表中的同一个槽,驱逐一个将进入同一槽的值原始表,因此路径的最大长度为 2。使用不同的哈希函数,被驱逐的值可以在另一个表中的任何地方,典型的路径长度可以更大。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-07
      • 2023-03-18
      • 1970-01-01
      • 2015-06-25
      • 2017-03-28
      • 1970-01-01
      • 2011-11-22
      相关资源
      最近更新 更多