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),因此这两个元素之间没有渐近差异(迭代器的开销是恒定的)。