探测哈希表

时间:2013-03-09 19:10:12

标签: algorithm hashmap hashcode hash-collision hash-function

我正在使用3种不同类型的探测器为项目实现哈希表。现在我正在研究线性。

对于线性探测,我理解探测是如何工作的,我的导师暗示他希望步长为1.事情是,不允许重复。所以我必须在插入之前“搜索”一个值,对吧?但是,如果表被用于所有单元格被“占用”或“删除”的点,该怎么办?然后,为了搜索特定的密钥以确保它不在表中,我将不得不搜索整个表。这意味着搜索操作(以及扩展,插入操作)是O(n)。

这似乎不对,我想我误解了一些事情。

我知道我不会遇到与二次探测相同的问题,因为该表需要至少半空,并且它只会探测确定数量的元素。对于双重哈希,我不确定这是如何工作的,因为我还需要搜索表以证明要插入的密钥不存在。但是,如果没有一个单元格“从未被占用?”,我怎么知道如何停止搜索?

所以:在开放散列中,过去表中的每个条目都被占用了,是否需要O(n)探测器来搜索元素(如果不允许重复,则插入?)

1 个答案:

答案 0 :(得分:2)

如果您误解了线性探测的这一方面,那么我也是如此。我同意如果哈希表接近满,那么每次插入时性能会降低到O(n)。有关所有详细信息,请参阅Don Knuth's 1963 analysis

顺便说一句,我惊讶地发现这个问题的第一次分析实际上是由数学家Ramanujan在1913年完成的,其结果暗示“线性探测哈希表中元素的总位移,即建筑成本”满的是大约N ^(3/2)。“ (见here

但实际上,我不认为插入速度慢的问题是几乎完整的哈希表的重要问题。重要的问题是你达到了根本无法再插入的程度!

因此,哈希表的任何实际实现必须具有在超出给定加载因子时重新调整哈希表的大小的策略,并且基于理论或实验选择用于重新调整大小的最佳加载因子。在这种情况下,使用实验特别有价值,因为线性散列的性能可能对散列函数以避免集群的方式在散列表中均匀分布项目的能力非常敏感,这使得性能非常依赖于集群的特性。要插入表中的项目。