繁体   English   中英

二阶搜索树中的有序遍历复杂性(使用迭代器)?

[英]In-order traversal complexity in a binary search tree (using iterators)?

相关问题: 二叉树O(N)的InOrder树遍历的时间复杂度? 但是它基于遍历递归(因此在O(log N)空间中),而迭代器只允许消耗O(1)空间。

在C ++中,通常需要将标准容器的迭代器递增为O(1)操作。 对于大多数容器来说,它已被轻易证明,但是使用map等,似乎有点困难。

  • 如果将map实现为跳过列表,那么结果将是显而易见的
  • 然而,它们通常被实现为红黑树(或至少作为二叉搜索树)

因此,在有序遍历期间,有时候“下一个”值不容易达到。 例如,如果您指向左子树的右下方叶子,则要遍历的下一个节点是根,这是depth步长。

我试过“证明”算法的复杂性(就“步骤”而言)是摊销的 O(1),这似乎没问题。 但是我还没有进行演示。

这是我为深度为4的树追踪的一个小图,数字(在节点的位置)表示在有序遍历期间从该节点到下一个节点的步数:

       3
   2       2
 1   1   1   1
1 2 1 3 1 2 1 4

注意:如果这是一棵较大树的子树,则最右边的叶子的成本为4。

总和为28,总节点数为15:因此平均每个节点的成本小于2,(如果它保持不变)将是一个很好的摊销成本。 所以:

  • 在有序遍历期间,为平衡(和完整)二叉搜索树增加迭代器真的是O(1)吗?
  • 可以将结果扩展到覆盖非完整二叉搜索树吗?

是的,对于任何树,摊销成本实际上是每次迭代的O(1)

证明基于您“访问”每个节点的次数。
叶子只访问过一次。 没有叶子最多访问3次:

  1. 从父节点到节点本身。
  2. 当从左子树回来时
  3. 当从正确的子树回来时

没有更多的访问任何节点,因此如果我们总结每个节点的访问次数,我们得到一个小于3n ,所以所有节点的总访问次数是O(n) ,这给了我们每步O(1)摊销。

(注意,因为在一个完整的树中有n / 2个叶子,我们得到你遇到的2n ,我相信可以证明任何树的访问总和将小于2n ,但是这个“优化”不在范围在这里IMO)。


每步的最坏情况是O(h) ,它是平衡树中的O(logn) ,但在某些情况下可能是O(n)


PS我不知道如何在C ++中实现Red-Black树,但如果您的树数据结构包含来自每个节点的parent字段,它可以替换递归堆栈并允许O(1)空间消耗。 (这当然是“作弊”,因为存储n这样的字段是O(n)本身)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM