通过HashMap进行迭代(复杂性)

时间:2018-11-28 18:27:29

标签: java hash hashmap time-complexity hashtable

据我了解,通过容量为“ m”且条目数为“ n”的哈希表进行迭代的时间复杂度为O(n + m)。我直觉地想知道为什么会这样吗?例如,为什么它不是n * m?

谢谢!

2 个答案:

答案 0 :(得分:1)

您绝对正确。迭代HashMap是一项O(n + m)操作,其中nHashMap中包含的元素数,而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)。