红黑树:在log(n)时间内拆分/连接

时间:2015-03-13 10:27:30

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

根据Ron Wein的说法,你可以在O(log(n))时间内分割和连接红黑树。见他的artikle:Efficient Implementation of Red-Black Trees with Split and Catenate Operations

然而,我仍然不相信分裂的运行时间确实如此。

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

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

Ron Wein,在他的论证中没有把修复算法算在内。我在分析中遗漏了什么,或者算法错了?

1 个答案:

答案 0 :(得分:1)

将来。如果有任何问题再次出现: 与Ron Wein相比,Tarjan在算法上有一些重要的差异。我仍然无法看到Wein在他的算法中是正确的,但是Tarjan是。所以我建议你改用他。

第一个重点是平衡算法花费O(log(d)),其中d是你开始balacing的深度。 然后Tarjan的算法不同之处在于从分裂键开始并在路径上移动到root。通过这样做,您将看到您连接的子树具有相同的深度。因此," d"总是很小。因此它可以更快地完成。

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

我建议所有人阅读Tarjans纸而不是Wein的