[英]Hash Function in Separate Chaining Vs. Open Addressing
我正在阅读Weiss的《数据结构》一书,并且对“单独链接”中的散列函数之间的差异感到困惑。 打开寻址中的哈希函数。
在单独的链接中,哈希函数定义为:
hash(x) = x mod tableSize
而在公开寻址中:
h_i(x) = (hash(x) + f(i)) mod tableSize
其中,i是试验和f(i)的数目是函数,如F(I)= I为线性探测中,f(I)= I ^ 2为二次探测,等
我有两个问题:
1)在单独链接中,具有哈希函数是否有意义:
hash(x) = x mod 10
当表大小等于11时?
2)在打开解决,我们总是要通过国防部的tableSize键(+间隙)两次?
1)不是。 这将是正确的,但效率不高。 如果mod
不到表的大小,都会有至少一个未使用的水桶,在您的桌面的顶部。 如果有特殊原因,选择值mod
的(有可能是,如果你正在寻找某些属性),那么你可以只修剪表,该尺寸,避免浪费。
2)并不是真正必要的(( ((a mod c) + b) mod c
是多余的),并且它不是唯一的唯一定义。 一般而言,您有h_i(x) = f(x, i) mod tableSize
, f
一些明显选择包括
f(x, i) = x + i
(线性探测) a
和b != 0
f(x, i) = x + a * i + b * i * i
(二次探测) f(x, i) = h1(x) + i * h2(x)
用于某些合适的哈希函数h1
和h2
(双哈希) 最后一个特别容易溢出,这可能会弄乱某些属性,因此您可能希望对表大小进行模运算(尤其是如果这是一个质数,因为这样您就可以使用一个不错的字段了)。
同样,在需要f(x, i + 1)
之前,您总是要使用f(x, i) mod tablesize
,因此您最好递增地计算f
,因为在每个步骤中,通过tablesize进行mod无论如何都要做。
但是,我们当然不仅限于这些形式的f
,甚至不限于我们在寻找开放位置的这种开放式编址方案。 布谷鸟哈希 (和变体)有两个候选位置可插入一个项目,如果两个位置都已满(请注意避免无限循环),它将踢出一个项目并将其移至其alt位置(可能还会移动一个项目) )。 这样,查找只需要查看两个位置,而不是整个表。 它有许多变体。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.