哈希表删除复杂性

时间:2016-02-23 04:52:45

标签: java c++ algorithm data-structures time-complexity

哈希表中删除的复杂性是多少?它可以根据实施方式而有所不同。如果它是作为连续数组实现的,那么我们是否在删除时压缩数组(这使得它不是O(1))?

如果它是基于双向链表的,O(1)删除是可能的,但在这种情况下我们如何将哈希键映射到链表节点?如果它是基于树的,则可以理解为O(logN)。

但是,C ++中的删除unordered_map和Java中较早的HashMap实现声称是O(1)。有人可以在这里填补实施空白吗?

编辑:为简单起见,我们假设没有碰撞。

2 个答案:

答案 0 :(得分:0)

删除{Key,Value}并不保证是恒定的时间性能(即不是O(1))。

documentation中声称"为基本操作提供了恒定时间性能,假设散列函数在桶中正确地分散元素"。

在发生碰撞的情况下,恒定时间表现不具备保障性

答案 1 :(得分:0)

你为什么要紧凑?

您的哈希表以M个空桶开头。如果你问问0中的内容,它会告诉你"什么都不是"。你插入了一些东西,并说出N满桶和M-N空桶。

对象O恰好散列到存储桶12.要插入它,请将其放入存储桶12.如果删除O,则只需将存储桶12替换为空值,与开始时相同。如果你问第12桶中的内容,它就会告诉你"没什么"。

您通常希望将数组保持较大(例如,比例为2),而不是插入的项目数。我不认为我已经看到了许多一般性的回收空间 - 除非明确调整大小,否则它们通常只会增加使用更多。

你也可以有一个组合(LinkedHashMap?),你可以有效地拥有一个双向链表,以便更快地遍历元素,还可以像上面那样支付哈希映射的开销,在这种情况下,存储桶将包含指向链表节点。