使用 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。
当提供第二个碰撞案例时,如何解决?
I.E:
假设我们有一个数字数组:
[22, 1, 13, 11, 24, -1, -1, -1, -1, -1, -1]
其中-1表示数组为空....
如果我们尝试使用
插入 33h1(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。