单独链接中的哈希函数打开寻址

时间:2015-03-31 07:00:25

标签: data-structures

我正在阅读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)在Separate Chaining中,有一个哈希函数是否有意义:

hash(x) = x mod 10

当表格大小等于时,让我们说11?

2)在开放寻址中,我们是否总是必须 mod tableSize 两次 mod

1 个答案:

答案 0 :(得分:2)

1)不是真的。这是正确的,但效率不高。如果mod小于表格大小,则表格顶部至少会有一个未使用的存储桶。如果有特定原因选择该值为mod(如果您正在查找某些属性,则可能存在),那么您可以将表格修剪为该大小并避免浪费。

2)这不是必要的(((a mod c) + b) mod c是多余的),并且这不是第一个唯一的定义。稍微更普遍的是h_i(x) = f(x, i) mod tableSizef包括

的一些明显选择
  • f(x, i) = x + i(线性探测)
  • 某些常量f(x, i) = x + a * i + b * i * ia
  • b != 0(二次探测)
  • f(x, i) = h1(x) + i * h2(x)获取一些合适的哈希函数h1h2(双哈希)

最后一个特别容易出现溢出,这可能会破坏一些属性,所以你可能想要以表格大小为模进行一些计算(特别是如果这是一个素数,因为那时你有一个很好的字段工作)。

此外,在您需要f(x, i) mod tablesize之前,您总是会使用f(x, i + 1),因此您还可以逐步计算f,在每个步骤中您通过表格大小来修改因为无论如何你必须这样做。

但我们当然不仅限于那些形式的f或者我们寻找开放点的开放式寻址方案。 Cuckoo hashing(和变体)有两个候选位置来插入一个项目,并且如果两个地方都已满,则会踢出一个项目并将其移动到其alt位置(可能还会移动一个项目)避免无限循环)。这样,查找只有两个要查看的位置,而不是可能是整个表。它有很多变种。