一般Hash表与Big O中Java的HashMap之间的区别

时间:2013-12-18 11:50:48

标签: java algorithm data-structures hashmap big-o

Hash table wiki条目将Big O列为:

搜索:O(n)
插入:O(n)
删除:O(n)

当一个java HashMap与Big O列为:

得到:O(1)
放:O(1)
删除:O(1)

有人可以解释为什么Big O在概念和实现之间存在差异?我的意思是如果有一个O(1)的最坏情况的实现,那么为什么概念中存在O(n)的可能性?

3 个答案:

答案 0 :(得分:1)

最坏的情况是O(n),因为您放入HashMap的每个条目都可能产生相同的哈希值(比方说10)。这会为每个条目产生冲突,因为每个条目都放在HashMap [10]中。根据实现的冲突解决策略,HashMap要么在索引10处创建一个列表,要么将该条目移动到下一个索引。

然而,当应该再次访问该条目时,哈希值用于获取HashMap的初始索引。因为它在每种情况下都是10,所以HashMap必须解决这个问题。

答案 1 :(得分:1)

因为最坏情况和平均情况之间存在差异,甚至维基百科列出了avarage案例的O(1)复杂性。 Java的HashMap与维基百科的哈希表完全相同。所以这只是一个文档问题。

基本上,哈希表会根据您要存储的对象计算数值。该数值大致用作访问存储对象的位置的索引(导致O(1)复杂度)。但是,有时某些对象可能会导致相同的数值。在这种情况下,这些对象将存储在存储在哈希映射中相应位置的列表中,因此最坏情况下的O(n)复杂度。

答案 2 :(得分:0)

我不确定您在哪里发现了报告的Java HashMap的复杂性,但它列出了平均情况,它与维基百科在您链接的页面上的状态相符。