据我了解,通过容量为“ m”且条目数为“ n”的哈希表进行迭代的时间复杂度为O(n + m)。我直觉地想知道为什么会这样吗?例如,为什么它不是n * m?
谢谢!
答案 0 :(得分:1)
您绝对正确。迭代HashMap
是一项O(n + m)
操作,其中n
是HashMap
中包含的元素数,而m
是其容量。实际上,这在the docs中有明确说明:
在集合视图上进行迭代所需的时间与HashMap实例的“容量”(存储桶数)及其大小(键值映射数)成比例。
直观(和概念上),这是因为HashMap
由一个 buckets 数组组成,该数组的每个元素都指向空(即,指向null
)或条目列表。
因此,如果存储区数组的大小为m
,并且地图中总共有n
个条目(我的意思是,n
个条目分散在所有列表中然后将HashMap
进行迭代,方法是访问每个存储桶,对于具有列表项的存储桶,则访问列表中的每个条目。由于总共有m
个存储桶和n
个元素,因此迭代为O(m + n)
。
请注意,并非所有哈希表实现都如此。例如,LinkedHashMap
类似于HashMap
,除了它的所有条目都以双链表方式连接(以保留插入或访问顺序)之外。如果您要迭代LinkedHashMap
,则无需访问每个存储桶。仅访问第一个条目,然后单击其链接到下一个条目,然后继续下一个条目,依此类推,直到最后一个条目,就足够了。因此,迭代LinkedHashMap
就是O(n)
,其中n
是条目总数。
答案 1 :(得分:0)
对集合视图进行迭代所需的时间与 HashMap 实例的“容量”(桶的数量)加上其大小(键值映射的数量)成正比 n = 桶数 m = 键值映射数
Hashmap 的复杂度是 O(n+m),因为最坏的情况是一个数组元素包含整个链表,这可能是由于将 hashcode 函数用作键的错误实现而发生的。 Visialise the worst-case scenario 为了迭代这个场景,java首先需要迭代整个数组O(n),然后迭代链表O(m),将这些组合起来就是O(n+m)。