Java Map实现渐进复杂性(HashMap,LinkedHashMap,TreeMap)

时间:2019-01-18 09:21:23

标签: java algorithm collections hashmap time-complexity

我正在尝试处理HashMapLinkedHashMapTreeMap的渐进复杂性。在不同的网站和文章上,平均写着get = O(1),最糟糕的是写成O(n)。 (如果所有键都添加到一个存储桶中)。

但是我读了Bruce Eckel thinking in java书,并且有一个比较示例

enter image description here

如果您查看此数据,则该数据将消失O(n)

我完全感到困惑。至少对于MapHashMap,有人能解释LinkedHashMap实现的渐近复杂性-TreeMapgetput吗? (也许有一篇很好的文章将所有内容都清楚并整理在一起?)

编辑

put方法最感兴趣。因为resize()的大小与ArrayList中的发生类似。

1 个答案:

答案 0 :(得分:3)

它称为摊销 O(1),这意味着在一段时间内有很多条目,而您经常这样做get。您似乎也缺乏对O(1)的理解-这意味着它是恒定的。如果我在HashMap中添加了更多条目-检索条目所花费的时间是相同的,那么在该HashMap中是10或1000万个条目,并考虑到{{1} }已实现,并且没有hashCode的虚拟实现(例如,这是将条目放入同一存储桶的时间)。

在某些情况下确实会发生调整大小,但是它甚至与return 1的执行方式还不接近。 ArrayList只会使内部数组变大,总是ArrayList会将内部存储桶加倍至某个点(see when exactly here),之后它将某个存储桶转换为HashMap,从而使搜索速度更快-这是在Java中添加的-8。