我正在寻找类似于CLR中的红黑区间树的区间树算法,但默认情况下支持合并区间,以便从不存在任何重叠区间。
换句话说,如果您有一个包含两个区间[2,3]和[5,6]的树,并且您添加了区间[4,4],则结果将是仅包含一个区间的树[2,6] ]
由于
更新:我正在考虑的用例是计算传递闭包。间隔集用于存储后继集,因为它们是found to be quite compact。但是,如果你将区间集表示为链表,我发现在某些情况下它们会变得非常大,因此找到插入点所需的时间也是如此。因此我对间隔树感兴趣。还有很多将一棵树与另一棵树合并(即一组OR操作) - 如果两棵树都很大,那么使用两棵树的顺序走路而不是每个间隔的重复插入来创建新树可能更好。
答案 0 :(得分:4)
我看到的问题是插入一个较大的间隔会消灭掉一大块树,这使得很难恢复红黑不变量。
我认为使用splay树会更容易,如下所示。为简单起见,每棵树包含两个标记,所有其他区间左侧的间隔A
和右侧的间隔Z
。插入间隔I
时,将I
的前任H
展开到树的根。树看起来像
H
/ \
... X
/ \
... ...
现在分离X
并将I
的继任者J
展开到根目录。
H J
/ / \
... ... ...
此时,I
重叠的所有区间都在J
的左子树中。分离该子树并将其所有节点放在空闲列表中,必要时扩展I
。将I
设为H
和J
I
/ \
H J
/ \
... ...
继续我们的快乐方式。此操作是O(log n)分摊的,其中n是树节点的数量(这可以通过检查splay树势函数并执行大量代数来证明。)
我应该添加一个自然的递归树到树合并,方法是插入一棵树的根然后合并左右子树。我不知道如何分析它。