为什么TreeSet迭代O(n)而不是O(n * logn)?

时间:2016-04-14 20:48:59

标签: java algorithm data-structures tree treeset

我读了一篇关于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)时间。

2 个答案:

答案 0 :(得分:12)

一个next操作的最坏情况时间是O(log n),因为它是树的高度。但是,平均而言,可以在时间O(1)中找到下一个元素。这是因为整个遍历本质上使用了每个n-1树边缘两次。

答案 1 :(得分:0)

您可以像这样实现树的迭代:

.next()

对于每个节点,函数print将被调用一次,因此总迭代时间为O(N)。您可以迭代地实现完全相同的算法(无递归)。如果你足够小心,你可以有一个类来保持迭代状态,并在调用println时前进。确实,{{1}}之间的函数调用次数是不均匀的,但是当你整体看它时,你会发现它们中只有N个。