Java 构建迭代器的时间复杂性

Java 构建迭代器的时间复杂性,java,data-structures,time-complexity,Java,Data Structures,Time Complexity,我有这个密码 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 takes O(log n)中运行,我想问:第

我有这个密码

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 takes 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();
    }

后继者也在logn中运行,除非实现另有规定,否则迭代树仍然是O(n)(与数组一样)


因此,总体复杂性仍然是
O(nlogn)

在两个实例中迭代整个数据时,两个构造函数应该占用相同的时间O(n)


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

这取决于
AVLTree
iterator()方法的实现。没有它的源代码,我们无法告诉您更多。通常情况下,迭代器的创建成本很低,而且是O(1)。创建迭代器的时间取决于您的实现,但通常不会超过查找第一个元素所需的时间,这是根(->O(1))或最小/最大元素(->O(logn)),这取决于您的遍历方案。遍历所有元素仍然是O(n),因此这两个元素之间没有渐近差异(迭代器的开销是恒定的)。