使用 Double Hashing 解决第二种情况的冲突

Resolving second case collisions using Double Hashing

当提供第二个碰撞案例时,如何解决?

I.E:

假设我们有一个数字数组:

[22, 1, 13, 11, 24, -1, -1, -1, -1, -1, -1]

其中-1表示数组为空....

如果我们尝试使用

插入 33
h1(key) = key % 11
h2(key) = 7 - (key % 7)

传入 33 将得到 2,其中数组位置 2 已被占用(有 13)。我们如何处理这个碰撞案例?我们是否再次将返回的 mod 值传递给 h2?我们是否替换该数组值的值? (我怀疑后者不是这样的。)

编辑:为 h2 添加了括号

使用双重散列,您计算的位置为:

pos = (h1 + i * h2) mod table_size

这里的技巧是递增 i 直到找到散列 table 中的空位置。因此,计算不仅进行一次,而且进行多次,直到找到一个插槽。有关详细信息,请参阅 Wikipedia article

还有其他类似于双重散列的开放寻址形式也非常有效,例如 cuckoo hashing and robin-hood hashing