Hashmap插入O(N)?

时间:2013-06-29 03:40:42

标签: hashmap

所以,假设你有一个使用线性探测的散列图。

首先使用键X插入一个值X,哈希值到位置5,比如说。

然后使用键Y插入一个值Y,该键也是哈希值5.它将需要位置6.

然后插入一个带有键Z的值Z,它也是哈希值5.它将需要位置7.

然后删除Y,因此内存看起来像“X,null,Z”

然后尝试使用键Z插入一个值,它将检查5,看到它已经被检查,检查6,然后将其插入那里为空。但是,已经存在一个带有键Z的条目,所以你将有两个带有键Z的条目,这是与不变量相对的。

因此,您不需要遍历整个地图,直到找到值本身。如果找不到,则可以将其插入第一个空格。因此,某个键上的所有首次插入都不是O(N)?

2 个答案:

答案 0 :(得分:3)

没有

您遇到的问题是由于您删除错误造成的。

事实上,使用线性探测从表中删除有点困难 - 使用线性探测构建的许多表根本不支持删除。

那说:至少在理论上,哈希表上的几乎所有操作都可以在最坏的情况下(插入,删除,查找等)结束线性。无论哈希函数多么聪明你写的,有无限的输入可以散列到任何特定的输出。有了足够不幸的输入选择(或者只是一个糟糕的哈希函数),你可以得到一个任意百分比,所有这些都产生相同的哈希码。

编辑:如果您坚持使用线性探测支持删除,基本思路是您需要确保条目的每个“链”保持连续。因此,您对密钥进行散列,然后从那里一直走到下一个空桶。您检查每个条目的哈希码,并将最后一个连续项目的“孔”填入孔之前的位置。反过来,这可能会创建另一个洞,你需要填入最后一个项目,该项目是在你正在创建的那个洞之前的一个位置(等等,递归地)。

答案 1 :(得分:-2)

不确定为什么村里的白痴(;))删除了他的帖子,因为他是对的 - 过度使用/不平衡的哈希表退化为线性搜索。

为了实现O(1)性能,不得过度使用表(在给定条目数的情况下,表必须足够大),并且哈希算法必须做得很好(避免不平衡),给定特征/统计关键价值。

应该注意的是,有两种基本的哈希表方案 - 线性探测,其中哈希同义词简单地插入到下一个可用的表槽中,以及链表,其中哈希同义词被添加到表元素之外的链表中对于给定的哈希值。它们产生大致相同的统计数据,直到过度使用/不平衡,此时线性探测快速完全分离,而链接列表只是缓慢降级。并且,正如其他人所说,线性探测使删除变得非常困难。