【发布时间】:2019-05-16 18:14:04
【问题描述】:
关于线性探测(哈希表)有一点对我来说并不直观。 如果我将 key1 其哈希结果放入数组索引 1。然后我将 key2 -> 数组索引 2 放入。然后我将 key3 -> 再次放入数组索引 1,这将转到数组索引 3。 然后,当我搜索 key3 时,我应该通过包含与我的哈希完全不同的键的索引。这不是浪费吗?如果序列真的很大并且包含很多键(例如,我有 20 个元素,然后为 null,对于导致数组索引从 0 到 20 的任何键,我必须遍历所有索引,尽管它们与我的哈希值不同我可以通过单独的链接来消除它)。
或者这可以通过我们的哈希函数(如果写得足够好)在索引之间平均分配键并且我们不断调整数组大小以使其最大半满这一事实得到缓解?
【问题讨论】:
-
你完全正确。线性探测简单,但在各种条件下性能较差。在这种情况下,k 次冲突会生成一个表格,其中需要平均 k/2 次探测来查找密钥。如果碰撞发生在大小为 n 的表中的 m 个桶上,那么当 k 接近 n/m 时情况会变得非常糟糕,因为相邻的填充点的团块一起增长。即使散列函数是完美的,也有比线性探测更好的方法。已经写了很多关于封闭哈希表性能的文章。进行更多搜索和阅读!
标签: algorithm performance hash hashtable linear-probing