【问题标题】:How the Double Hash Function Works in C++?双散列函数在 C++ 中是如何工作的?
【发布时间】:2016-02-24 04:35:23
【问题描述】:

我正在阅读有关 HashTable 的内容,并找到了一个易于理解的好来源Here.

但我对双散列函数感到困惑。这是双重哈希函数的详细信息。

双重哈希使用将第二个哈希函数应用于 发生碰撞时的键。第二个哈希函数的结果 将是形成要插入的碰撞点的位置数。

第二个功能有几个要求:

it must never evaluate to 0
must make sure that all cells can be probed

第二个流行的哈希函数是:Hash2(key) = R - (key % R) 其中 R 是一个小于表大小的素数。

这是双重哈希函数的图像。

现在混乱开始了。正如他们在图像中所说的那样。 49 应该在来自[9] 索引的7 位置。那么实际位置将是[6] 那么为什么他们将49 放在[0] 索引处?其他剩余整数也一样。

如果没有空索引会发生什么?

【问题讨论】:

    标签: c++ data-structures hash hashtable double-hashing


    【解决方案1】:

    图像有误,可能使用不同的哈希方法。

    当没有空单元格时,您必须重新散列。请参阅双散列部分下方的“使用重新散列进行散列”部分。

    【讨论】:

    • 好的,谢谢。为什么哈希表搜索是 O(1)?我很困惑,因为有时我们一次找不到元素,然后我们需要双重哈希或其他方法来找到元素,那么它怎么可能是 O(1)? O(1) 表示直接在数组中查找元素?
    • @UnKnown O(1) 只是意味着搜索时间大致是线性的(与容器的大小无关)。哈希表中的搜索可能需要进行一次或几次比较,但如果是两倍大,则不会花费两倍的时间。
    • 对于二次我们还需要重新散列吗?并且在重新散列时我们需要使用相同的索引?或者我们需要再次从哈希表中传递索引的值?
    【解决方案2】:

    确实图片错误。基本思想是按第二个有函数给出的值跳过任何地方,如果已经被占用,则继续跳过相同的号码。的地方,直到找到一个空单元格。为此,第二个哈希函数不得返回 0。

    更多解释请见here。

    【讨论】:

      猜你喜欢
      • 2014-11-07
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多