【问题标题】:Complexity time building an Iterator构建迭代器的复杂性时间
【发布时间】:2016-05-09 15:34:45
【问题描述】:

我有这个代码

public AvlTree(int[] data) {
    for (int val : data) {
        add(val);
    }
}
public AVLTree(AVLTree avlTree) {
    for (int val : avlTree) {
        add(val);
    }
}

AVLTree 实现 Iterable 的地方。第一个构造函数在 O(n log n) 中运行,add 需要 O(log n) ,我想问:第二个构造函数是否相同,或者制作迭代器比迭代它需要更多时间? 迭代器:

    @Override
    public boolean hasNext() {
        return node != null;
    }

    @Override
    public Integer next() {
        if (!hasNext()) throw new NoSuchElementException();
        Node cur = node;
        node = successor(node);
        return cur.getKey();
    }

successor 也在 logn 中运行

【问题讨论】:

  • 这取决于AVLTreeiterator()方法的实现。如果没有它的源代码,我们无法告诉您更多信息。通常,迭代器的创建成本很低,而且 O(1)。
  • 创建迭代器的时间将取决于您的实现,但通常不会超过找到 first 元素,它是根 (-> O(1 )) 或最小/最大元素 (-> O(log n)),具体取决于您的遍历方案。遍历所有元素仍然是 O(n),因此两者之间没有渐近差异(迭代器将具有恒定的开销)。

标签: java data-structures time-complexity


【解决方案1】:

当您在两个实例中迭代整个数据时,两个构造函数都应该花费相同的时间 O(n)。

尽管 add() 方法只需要 O(n log n),但您正在迭代数据这一事实使其成为 O(n)。

【讨论】:

    【解决方案2】:

    除非实现另有说明,否则迭代树仍然是O(n)(就像数组一样)。

    所以总体复杂度仍然是O(n log n)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 2019-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多