Hashmap 哈希映射插入O(N)?

Hashmap 哈希映射插入O(N)?,hashmap,Hashmap,假设您有一个使用线性探测的hashmap 首先插入一个带有键X的值X,该值散列到位置5,例如 然后插入一个带有键Y的值Y,该值也散列为5。地点是6号 然后插入一个带有键Z的值Z,该值也散列为5。地点是7号 然后删除Y,使内存看起来像“X,null,Z” 然后尝试用键Z插入一个值,它将选中5,查看是否已获取,选中6,然后将其作为空值插入。但是,已经有一个带有键Z的条目,因此您将有两个带有键Z的条目,这与不变量相反 因此,您不需要遍历整个地图,直到找到值本身吗。如果找不到,则可以将其插入第一个空空间

假设您有一个使用线性探测的hashmap

首先插入一个带有键X的值X,该值散列到位置5,例如

然后插入一个带有键Y的值Y,该值也散列为5。地点是6号

然后插入一个带有键Z的值Z,该值也散列为5。地点是7号

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

然后尝试用键Z插入一个值,它将选中5,查看是否已获取,选中6,然后将其作为空值插入。但是,已经有一个带有键Z的条目,因此您将有两个带有键Z的条目,这与不变量相反

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

您遇到的问题是由于删除操作不正确而导致的

事实上,使用线性探测从表中删除有些困难——以至于许多使用线性探测构建的表根本不支持删除

这就是说:至少在理论上,哈希表上的几乎所有操作在最坏的情况下(插入、删除、查找等)都会以线性结束。不管您编写的哈希函数有多聪明,都有无限的输入可以哈希到任何特定的输出。如果选择了一个非常不幸的输入(或者仅仅是一个糟糕的哈希函数),那么最终可能会产生任意百分比的相同哈希代码

编辑:如果您坚持使用线性探测支持删除,那么基本思想是您需要确保每个条目的“链”保持连续。所以,你散列密钥,然后从那里一直走到下一个空桶。检查每个条目的散列代码,并用散列到孔之前位置的最后一个连续项填充“孔”。反过来,这可能会创建另一个洞,您必须用散列到要创建的洞之前的位置的最后一个项目来填充该洞(以此类推)

您遇到的问题是由于删除操作不正确而导致的

事实上,使用线性探测从表中删除有些困难——以至于许多使用线性探测构建的表根本不支持删除

这就是说:至少在理论上,哈希表上的几乎所有操作在最坏的情况下(插入、删除、查找等)都会以线性结束。不管您编写的哈希函数有多聪明,都有无限的输入可以哈希到任何特定的输出。如果选择了一个非常不幸的输入(或者仅仅是一个糟糕的哈希函数),那么最终可能会产生任意百分比的相同哈希代码


编辑:如果您坚持使用线性探测支持删除,那么基本思想是您需要确保每个条目的“链”保持连续。所以,你散列密钥,然后从那里一直走到下一个空桶。检查每个条目的散列代码,并用散列到孔之前位置的最后一个连续项填充“孔”。反过来,这可能会造成另一个漏洞,你必须用散列到你要创建的漏洞之前的位置的最后一个项目来填补这个漏洞(如此循环)。

不确定为什么村里的白痴(;)删除了他的帖子,因为他是对的——过度提交/不平衡的散列表退化为线性搜索

为了实现O(1)性能,表不能过度提交(表必须足够大,给定条目数),并且哈希算法必须做得很好(避免不平衡),给定键值的特征/统计信息


应该注意的是,有两种基本的哈希表方案——线性探测,其中哈希同义词被简单地插入到下一个可用的表槽中;链表,其中哈希同义词被添加到给定哈希值的表元素之外的链表中。它们产生大致相同的统计数据,直到过度承诺/不平衡,在这一点上,线性探测很快完全崩溃,而链表只是缓慢退化。而且,正如其他人所说,线性探测使得删除非常困难。

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

为了实现O(1)性能,表不能过度提交(表必须足够大,给定条目数),并且哈希算法必须做得很好(避免不平衡),给定键值的特征/统计信息


应该注意的是,有两种基本的哈希表方案——线性探测,其中哈希同义词被简单地插入到下一个可用的表槽中;链表,其中哈希同义词被添加到给定哈希值的表元素之外的链表中。它们产生大致相同的统计数据,直到过度承诺/不平衡,在这一点上,线性探测很快完全崩溃,而链表只是缓慢退化。而且,正如其他人所说,线性探测使删除变得非常困难。

我的问题错了,请参阅使用探测时处理删除的各种技术。可以想象,使用链接实现的删除更容易一些。我的问题错了,请参阅使用探测时处理删除的各种技术。可以想象,使用链式实现的删除更容易一些。所以要插入一个键,我不应该在找到同一个键之前遍历列表?似乎删除操作也应该遍历整个列表,直到找到密钥并删除条目,否?是的,要插入密钥,您可能会一直走到一个空桶。我已经编辑了答案,以便给出更好的答案