c++ - 哈希表 : Double hashing when the second hash function returns a multiple of the table size

标签 c++ hash hashtable double-hashing

我正在用 C++ 实现一个哈希表,通过双重哈希使用开放寻址。

我理解双重哈希背后的基本原理是:

indexInProbingSequence = (originalIndex + i * hashFunction2(key)) % tableSize

我想我已经正确地实现了这部分。这是一项家庭作业,类(class)的政策是我不能就任何特定的代码征求意见,所以你必须在这方面相信我。

似乎给我带来问题的是,有时,某些键在执行第二个哈希函数时返回的值是(主要)表大小的倍数。在这些情况下,探测序列中的所有索引都是相同的。例如,当:

originalIndex = 32
hashFunction2(key) = 3035446
tableSize = 211

探测顺序是:

(32 + 1 * 3035446) % 211 == 32
(32 + 2 * 3035446) % 211 == 32

等等。

我错过了什么?

最佳答案

我认为您没有遗漏任何内容,特别是当 hashFunction2(key) == 0 时,无论表大小如何都会出现问题。

使用 (hashFunction2(key) % (tableSize - 1) + 1) 代替 hashFunction2(key)。步幅最好是环的生成器,以表格大小为模(这是一种时髦的说法,你的探测最终覆盖了整个表格),否则至少有一个很大的周期。由于您的 table 大小是素数,这意味着您必须避免 0。

关于c++ - 哈希表 : Double hashing when the second hash function returns a multiple of the table size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7806591/

相关文章:

c++ - 将指向类对象的智能指针与类对象混合

mysql - 在 phpMyAdmin 中散列

hashtable - 编程语言用于字典/关联数组的默认哈希函数是什么?

string - GoLang的字符串映射键有字符串长度限制吗?

algorithm - 集合的简单通用哈希函数

java - 嵌套 HashMap 无法正常工作

c++ - MSVC 编译器实例化函数模板的默认定义,即使存在专门化

c++ - 智能感知 : an array may not have elements of this type

c++ - 正确声明指针,分配内存,并将它们作为参数发送 c++

algorithm - 使用链接散列并使用大小为 `m` 的表