我在C ++中实现一个HashTable,使用双重散列的开放寻址。
据我所知,双哈希背后的基本原理是:
indexInProbingSequence = (originalIndex + i * hashFunction2(key)) % tableSize
我认为我已正确实施此部分。这是一个家庭作业,这是我不能就任何特定代码提出建议的课程政策,所以你必须相信我的那一部分。
似乎导致我出现问题的是,偶尔,某些键在受到第二个哈希函数时会返回一个值(prime)表大小的倍数。在这些情况下,探测序列中的所有索引都是相同的。例如,在:
originalIndex = 32
hashFunction2(key) = 3035446
tableSize = 211
探测序列是:
(32 + 1 * 3035446) % 211 == 32
(32 + 2 * 3035446) % 211 == 32
等等。
我错过了什么?
答案 0 :(得分:2)
我认为你没有错过任何东西,特别是在hashFunction2(key) == 0
时,无论表格大小如何,都会出现问题。
使用(hashFunction2(key) % (tableSize - 1) + 1)
代替hashFunction2(key)
。最好是步幅是以表格大小为模的环的发生器(这是说你的探针最终覆盖整个表格的豪华方式),或者至少有一个很长的时间段。由于您的表格大小是素数,这意味着您必须避免使用0。