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

Eri*_*ric 8 java algorithm tree treeset data-structures

我读了一个关于TreeSet的时间复杂度的前一个问题,答案是它需要O(n)时间.但是,我不明白为什么O(n)迭代而不是O(n*nlogn).

每次下一次调用都需要O(logn)时间

所以,如果我像这样迭代一个TreeSet:

while (iterator.hasNext()){ //Runs N times
   System.out.println(iterator.next() + " "); //each next is O(logn)
}
Run Code Online (Sandbox Code Playgroud)

我希望它是O(n*logn)而不是O(n),因为while循环有N次迭代,每次iterator.next()调用需要O(logn)时间.

Dav*_*tat 13

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

  • @markspace是的,每个`iterator.next()`调用都有最坏情况时间O(log n).但与此同时,遍历整个`TreeSet`的最坏情况时间为O(n).(在上面给出的答案中,如果你迭代整个`TreeSet`,那么在最坏的情况下,`iterator.next()`的平均时间将是O(1).) (2认同)