我为什么会看到这些哈希表函数的不同运行时间复杂度?
在维基百科上,查找和删除是O(n)(我认为哈希表的目的是具有恒定的查找时间,那么如果查找是O(n),这还有什么意义呢)。
在以前的一些课程笔记中,我看到了各种不同的复杂度,取决于某些细节,包括一种全都是O(1)的方法。如果我可以得到全部是O(1),为什么要使用其他实现方法?
如果我在像C++或Java这样的语言中使用标准哈希表,我可以期望时间复杂度是什么?
我为什么会看到这些哈希表函数的不同运行时间复杂度?
在维基百科上,查找和删除是O(n)(我认为哈希表的目的是具有恒定的查找时间,那么如果查找是O(n),这还有什么意义呢)。
在以前的一些课程笔记中,我看到了各种不同的复杂度,取决于某些细节,包括一种全都是O(1)的方法。如果我可以得到全部是O(1),为什么要使用其他实现方法?
如果我在像C++或Java这样的语言中使用标准哈希表,我可以期望时间复杂度是什么?
哈希表具有O(1)
的平均和摊销时间复杂度,但会受到O(n)
的最坏情况时间复杂度的影响。[我认为这就是你的困惑所在]
哈希表受到O(n)
最坏情况时间复杂度的影响,有两个原因:
O(n)
的时间。然而,它被认为具有O(1)
的平均和摊销情况,因为:
O(n)
,最多可以在n / 2
个操作之后发生,这些操作都假定为O(1)
:因此当您总结每个操作的平均时间时,您会得到:(n * O(1) + O(n)) / n)= O(1)
请注意,由于重新哈希问题 - 实时应用程序和需要低延迟的应用程序不应使用哈希表作为其数据结构。
编辑:哈希表的另一个问题:缓存。
O(1)
。如果你需要最坏情况 - 哈希表将不足够。 - amitO(n)
降低到 O(log n)
。(我猜如果哈希表已经使用了良好的加密哈希函数,即使面对攻击者也可以避免碰撞,因此这可能被认为是过度设计。) - joeytwiddleO(1)
。问题在于如果两个键不相等,但它们生成相同的哈希值。123
。123
已经有一个值存在。然后,它会将新值与现有值进行比较,并发现它们不相等。在这种情况下,为该键创建一个数组或链表。此时,检索此值变成了O(n)
,因为哈希表需要遍历该桶中的每个值以找到所需的值。n
个项目。 - josetable_size/8 <= #elements <= table_size/2
,因此它会回到 O(1)
。但是,如果表的大小是动态的,则仍然存在重新散列问题,这将使最坏情况达到 O(n)
。详见我的回答以获取细节和解释。 - amit根据哈希实现的方式,最坏的情况下时间复杂度可以达到O(n),而在最好的情况下为O(1)(通常情况下,如果你的数据结构不太大,很容易达到)