连接红黑树

时间:2010-07-05 01:49:04

标签: algorithm data-structures red-black-tree

OCaml标准库有一个很棒的Set实现,它使用非常有效的分而治之算法来计算两组的union。我相信它从一个集合中获取整个子树(不仅仅是单个元素)并将它们插入到另一个集合中,在必要时重新平衡。

我想知道这是否需要OCaml使用的AVL树中保存的高度信息,或者是否也可以使用红黑树。例如,是否可以更有效地连接一对红黑树,而不是简单地迭代第二棵树,将其元素附加到第一棵树的末尾?

4 个答案:

答案 0 :(得分:41)

答案 1 :(得分:3)

由于您似乎在谈论Concatenate +添加到最后,看起来您有以下问题:

Given two red-black trees T1 and T2, such that keys of T1 <= keys of T2,
find union of the two.

这称为树上的连接操作,在这种情况下,可以在O(log n)时间内连接树,请查看:http://www.cs.tau.ac.il/~wein/publications/pdfs/rb_tree.pdf

同时退房:http://net.pku.edu.cn/~course/cs101/resource/Intro2Algorithm/book6/chap14.htm,问题14.2。

答案 2 :(得分:1)

在连接并且不在每个节点中使用高度信息扩充树时,可以比O(log ^ 2(n))做得更好。 您可以在2 * [log(n1)+ log(n2)]中连接,其中n1和n2表示要连接的树中的节点数。在O(log(n))中计算高度后,在向下看树时使用每个节点中的Balance信息以找到正确的连接点!

答案 3 :(得分:0)

当您将树与低重叠组合时,您可能会赢得一些东西,但通常您必须重新获得节点。通过平衡,您会遇到更糟糕的情况,因为在触摸一个节点后可能会有旋转规则。