我读了一篇关于TreeSet时间复杂度的previous question,答案是它需要O(n)时间。但是,我不明白为什么O(n)迭代而不是O(n * nlogn)。
每次下一次通话都需要O(logn) time
因此,如果我遍历这样的TreeSet:
while (iterator.hasNext()){ //Runs N times
System.out.println(iterator.next() + " "); //each next is O(logn)
}
我希望它是O(n * logn)而不是O(n),因为while循环有N次迭代,每次iterator.next()调用需要O(logn)时间。
答案 0 :(得分:12)
一个next
操作的最坏情况时间是O(log n)
,因为它是树的高度。但是,平均而言,可以在时间O(1)
中找到下一个元素。这是因为整个遍历本质上使用了每个n-1
树边缘两次。
答案 1 :(得分:0)
您可以像这样实现树的迭代:
.next()
对于每个节点,函数print将被调用一次,因此总迭代时间为O(N)。您可以迭代地实现完全相同的算法(无递归)。如果你足够小心,你可以有一个类来保持迭代状态,并在调用println
时前进。确实,{{1}}之间的函数调用次数是不均匀的,但是当你整体看它时,你会发现它们中只有N个。