【问题标题】:Red-Black tree: Split/Concatenate in log(n) time红黑树:在 log(n) 时间内拆分/连接
【发布时间】:2015-05-15 19:07:47
【问题描述】:

根据 Ron Wein 的说法,您能够在 O(log(n)) 时间内完成红黑树的拆分和连接。见他的文章:Efficient Implementation of Red-Black Trees with Split and Catenate Operations

但是我仍然不相信 split 的运行时间是真的。

这个想法是 split 使用最坏情况的 log(n) 连接。这些连接完成得很快,因为我们可以通过记住上次连接的 p 来找到节点 p。

问题在于连接启动了修复(平衡)算法,据我所知,该算法需要 O(log n)(请参阅连接伪代码中的步骤 5)。 这给了我一个 log(n)*log(n) 的运行时间,因为拆分会产生最坏情况下的 log(n) 连接。

Ron Wein 在他的论证中没有考虑修复算法。我在分析中遗漏了什么,还是算法有误?

【问题讨论】:

  • 可能是一个摊销论点,暗示并非每个修复都真的很昂贵
  • 一个好主意,但事实就是如此,最终结果至少是摊销时间,但事实并非如此。所以不要以为是这样。不过谢谢你的回答
  • 我不是这个意思。如果您可以将修复的总工作限制在 拆分操作中(例如通过摊销),那么您将得到拆分的适当最坏情况。
  • "但是,当我们沿着树向下走时,我们可以很容易地同时沿着 T1 的最右边的路径和 T2 的最左边的路径,并找到与 κ 具有相同黑色高度的节点。因此,每个连接操作以恒定摊销时间进行,整个过程的总运行时间为O(C log n)。"
  • 是的,作者认为在给定的情况下可以在恒定的摊销时间内完成连接。完整的论点在参考 Tar83a 中。

标签: algorithm split concatenation binary-search-tree red-black-tree


【解决方案1】:

未来。如果有人再次遇到同样的问题: 与 Ron Wein 所做的相比,Tarjan 在算法上有一些重要的区别。我仍然无法看出 Wein 在他的算法中是正确的,但 Tarjan 是正确的。所以我建议你改用他的。

第一个重点是平衡算法的成本为 O(log(d)),其中 d 是您开始平衡的深度。 然后,Tarjan 的算法有所不同,它从拆分键开始并沿路径移动到根目录。通过这样做,您将看到您连接的子树具有大致相同的深度。因此“d”总是很小。因此,它可以更快地完成。

第二件事是 Tarjan 建议对所有节点进行扩充,以便它们知道自己的等级(其子树的黑色深度+它自身)。通过这样做,我们能够知道哪棵树在 O(1) 时间内最大。 也可以在 O(1) 时间内找到那里的高度差异。

我建议大家阅读 Tarjans 的论文而不是 Wein 的论文

【讨论】:

  • 拜托,你能发布一个Tarjan算法的链接吗?我有一些问题要找到它。
猜你喜欢
  • 2011-03-11
  • 1970-01-01
  • 2011-02-10
  • 2010-09-06
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
相关资源
最近更新 更多