繁体   English   中英

单独链接与中的哈希函数。 开放式寻址

[英]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 tableSizef一些明显选择包括

  • f(x, i) = x + i (线性探测)
  • 对于某些常数ab != 0 f(x, i) = x + a * i + b * i * i (二次探测)
  • f(x, i) = h1(x) + i * h2(x)用于某些合适的哈希函数h1h2 (双哈希)

最后一个特别容易溢出,这可能会弄乱某些属性,因此您可能希望对表大小进行模运算(尤其是如果这是一个质数,因为这样您就可以使用一个不错的字段了)。

同样,在需要f(x, i + 1)之前,您总是要使用f(x, i) mod tablesize ,因此您最好递增地计算f ,因为在每个步骤中,通过tablesize进行mod无论如何都要做。

但是,我们当然不仅限于这些形式的f ,甚至不限于我们在寻找开放位置的这种开放式编址方案。 布谷鸟哈希 (和变体)有两个候选位置可插入一个项目,如果两个位置都已满(请注意避免无限循环),它将踢出一个项目并将其移至其alt位置(可能还会移动一个项目) )。 这样,查找只需要查看两个位置,而不是整个表。 它有许多变体。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM