【问题标题】:TreeMap collection views iterators time-complexity?TreeMap 集合视图迭代器时间复杂度?
【发布时间】:2019-05-09 06:42:16
【问题描述】:

HashMapmyHashMap.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


【解决方案1】:

尝试根据这些伟大的 cmets 来回答这个问题:

  1. 与整个迭代过程相比,单个next() 调用的时间复杂度完全不同。

  2. Java 中的TreeMap 基于红黑树,这是一种平衡的二叉搜索树。

参考https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html

  1. 迭代整个 TreeMap 的时间复杂度应该与遍历 Red-Balck 树的时间复杂度相同(对于前序或后序遍历)。所以时间复杂度应该是O(n),其中n是键(或值,或键值映射)计数。

  2. 对于单个next 调用,我们可以在O(1) 中进行。如果整个 O(n) 时间复杂度为真,这应该是微不足道的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多