【发布时间】:2019-05-09 06:42:16
【问题描述】:
HashMap(myHashMap.entrySet().iterator().next() 和 myHashMap.keySet().iterator().next() 和 myHashMap.values().iterator().next())的所有 3 个集合视图迭代器的时间复杂度在 javadoc 中有详细记录,它是 O(n+ c) 对于所有这 3 个迭代器(n 是映射数,c 是容量,即哈希表中存储桶的物理数量)。
但是 3 个各自的 TreeMap 集合视图的各自的 3 个迭代器呢?官方 javadoc 中什么也没说。它们的复杂性是什么?我确实查看了 SE8 源代码,但我无法从那里判断。
【问题讨论】:
-
Federico Peralta Schaffner 对此 SO 问题的评论 stackoverflow.com/questions/53667320/… 暗示所有三个 TreeMap 集合视图迭代器的 log(n) - 作为意见
-
@Holger 我认为他在谈论一个
next()电话。 -
@ZhaoGang 完全正确。这不是 Javadoc 所说的。
-
对于 TreeMap,形成集合视图的时间为 O(n),迭代每个元素的时间总共为 O(n)。 O(2n) 本质上将变成 O(n)。正确的? (考虑全迭代)
-
@Ankur 创建集合视图只是创建对象包装器并设置一些链接,所以它是
O(1)。然后,由于它是一个 view(即不是实际条目的副本),因此通过iterator.next()获取每个条目可能会产生一些隐藏成本。对于TreeMap,我认为它需要到达最低的条目,即树的最左边的叶子,这将是O(logN),因为树是平衡的。然后,对于其余的条目,这将只是一个红黑树遍历,对于每个获取的条目将产生O(1),整个遍历总共产生logN + N - 1 ~ O(N)。
标签: java time-complexity treemap