Data structures 单独链接与开放寻址中的哈希函数

Data structures 单独链接与开放寻址中的哈希函数,data-structures,Data Structures,我正在读维斯的《数据结构》一书,我对单独链接中的哈希函数和开放寻址中的哈希函数之间的区别感到困惑 在单独链接中,哈希函数定义为: 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 当桌子的大小等于

我正在读维斯的《数据结构》一书,我对单独链接中的哈希函数和开放寻址中的哈希函数之间的区别感到困惑

在单独链接中,哈希函数定义为:

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) 在开放寻址中,我们是否总是需要通过表大小修改键(+gap)两次

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

2) 这并不是真正必要的(
((a mod c)+b)mod c
是多余的),而且这不是唯一的定义。更一般地说,您有
h_i(x)=f(x,i)mod tableSize
,对于
f
,一些明显的选择包括

  • f(x,i)=x+i
    (线性探测)
  • f(x,i)=x+a*i+b*i
    对于某些常数
    a
    b!=0
    (二次探测)
  • f(x,i)=h1(x)+i*h2(x)
    用于一些合适的散列函数
    h1
    h2
    (双散列)
最后一个特别容易发生溢出,这可能会弄乱一些属性,因此您可能希望执行一些以表大小为模的计算(特别是如果这是一个素数,因为这样您就有了一个很好的字段)

此外,在需要
f(x,i+1)
之前,您总是要使用
f(x,i)mod tablesize
,因此您最好以增量方式计算
f
,在每一步中,您都要按表大小进行修改,因为您无论如何都要这样做

但是我们当然不局限于那些形式的
f
,或者实际上也不局限于这种我们寻找一个开放点的开放寻址方案。(和变体)有两个候选位置可插入项目,如果两个位置都已满(注意避免无限循环),则将踢出项目并将其移动到alt位置(也可能替换项目)。这样一来,查找只需查看两个位置,而不是整个表。它有许多变体