【问题标题】:Hash Function in Separate Chaining Vs. Open Addressing单独链接中的哈希函数与。开放寻址
【发布时间】:2015-03-31 07:00:24
【问题描述】:

我正在阅读 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) 在开放寻址中,我们是否总是需要 mod 两次 tableSize 的键(+gap)?

【问题讨论】:

    标签: data-structures


    【解决方案1】:

    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 * i 用于一些常量 ab != 0(二次探测)
    • f(x, i) = h1(x) + i * h2(x) 用于一些合适的哈希函数 h1h2(双重哈希)

    最后一个特别容易溢出,这可能会弄乱某些属性,因此您可能希望执行一些以表格大小为模的计算(特别是如果这是一个素数,因为这样您就有一个很好的字段可以工作) .

    此外,在需要 f(x, i + 1) 之前,您总是会使用 f(x, i) mod tablesize,因此您不妨递增地计算 f,在每一步中,您都按表大小进行修改,因为无论如何您都必须这样做。

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

    【讨论】:

      猜你喜欢
      • 2011-02-03
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 2022-01-10
      • 2020-08-24
      • 2017-05-11
      相关资源
      最近更新 更多