我正在尝试处理HashMap
,LinkedHashMap
和TreeMap
的渐进复杂性。在不同的网站和文章上,平均写着get
= O(1)
,最糟糕的是写成O(n)
。 (如果所有键都添加到一个存储桶中)。
但是我读了Bruce Eckel thinking in java
书,并且有一个比较示例
如果您查看此数据,则该数据将消失O(n)
我完全感到困惑。至少对于Map
和HashMap
,有人能解释LinkedHashMap
实现的渐近复杂性-TreeMap
,get
和put
吗? (也许有一篇很好的文章将所有内容都清楚并整理在一起?)
编辑
对put
方法最感兴趣。因为resize()
的大小与ArrayList
中的发生类似。
答案 0 :(得分:3)
它称为摊销 O(1)
,这意味着在一段时间内有很多条目,而您经常这样做get
。您似乎也缺乏对O(1)
的理解-这意味着它是恒定的。如果我在HashMap
中添加了更多条目-检索条目所花费的时间是相同的,那么在该HashMap
中是10或1000万个条目,并考虑到{{1} }已实现,并且没有hashCode
的虚拟实现(例如,这是将条目放入同一存储桶的时间)。
在某些情况下确实会发生调整大小,但是它甚至与return 1
的执行方式还不接近。 ArrayList
只会使内部数组变大,总是; ArrayList
会将内部存储桶加倍至某个点(see when exactly here),之后它将某个存储桶转换为HashMap
,从而使搜索速度更快-这是在Java中添加的-8。