C++ STL RBTree是按顺序迭代O(N ln N)?

C++ STL RBTree是按顺序迭代O(N ln N)?,c++,algorithm,stl,red-black-tree,C++,Algorithm,Stl,Red Black Tree,问题:STL红黑树(STL_tree.h)的顺序是迭代时间复杂度O(N ln N)? 我搜索了一下网,找不到答案 我认为任何ADT的顺序迭代的时间复杂度都应该是O(N)。如果我错了,请让我知道 我从这段代码中查看了STL RB树 () 迭代器的++运算符似乎不是O(1),而是O(ln) 如果我没有弄错的话,上面的代码是O(ln)复杂度而不是O(1) 那么下面的++操作符也将具有O(ln)复杂度 _Self& operator++() { _M_increment(); return *

问题:STL红黑树(STL_tree.h)的顺序是迭代时间复杂度O(N ln N)? 我搜索了一下网,找不到答案


我认为任何ADT的顺序迭代的时间复杂度都应该是O(N)。如果我错了,请让我知道

我从这段代码中查看了STL RB树 ()

迭代器的++运算符似乎不是O(1),而是O(ln)

如果我没有弄错的话,上面的代码是O(ln)复杂度而不是O(1)

那么下面的++操作符也将具有O(ln)复杂度

_Self& operator++() { _M_increment(); return *this; }
_Self operator++(int) {
  _Self __tmp = *this;
  _M_increment();
  return __tmp;
}
这意味着即使是STL RBTree上的简单迭代也将是O(N ln N)而不是O(N)

我是错了还是做了一些奇怪的假设


顺便说一下,我考虑了基于堆栈的迭代器在路径上的堆叠。 我认为它可以达到O(1)的时间复杂度,但它将花费O(ln)的空间复杂度,就像基于递归的顺序遍历所花费的成本一样

然而,堆栈方法的问题是当不同的线程改变树结构并通过旋转扰乱路径堆栈时。(但大多数时候,当我们考虑使用这种类型的ADT进行多线程编程时,我们通常会锁定整个树,因此路径混乱不是一个大问题……对吧?)即使是这种类型的O(ln N)方法也不是线程安全的

提前感谢。

\U M_增量在最坏的情况下是O(lg n),是的,但摊销O(1)。您可以访问维基百科,了解更多有关摊销分析的信息

我在这里给出的是直观的解释,而不是证据:

想想树上的每一条边。对于每条边,它将在整个遍历过程中使用两次,一次用于进入,一次用于离开


边的数目是O(n)。在增量中,我们最关心的部分是循环。幸运的是,这些循环使用边缘访问,这意味着,对于整个遍历,循环体将总共执行O(n)次。因此,每个增量的摊销复杂性为O(1)

你说得对。无论使用_M_增量还是顺序递归遍历,每个边访问都是2。当N=2^m-1时,整个摊销为O(2*2^m/N)=O(1)。我认为这个问题与重复的候选者没有什么不同。然而,如果你仍然认为这个问题是一个真正的重复。请删除此问题。
_Self& operator++() { _M_increment(); return *this; }
_Self operator++(int) {
  _Self __tmp = *this;
  _M_increment();
  return __tmp;
}