【发布时间】:2013-09-20 17:23:12
【问题描述】:
我正在阅读Introduction to Algorithms by Cormen 第 14 章(增强数据结构),其中他在谈论区间树。下面是他提到的区间树背后的设计方法。
第 1 步:底层数据结构
我们选择一棵红黑树,其中每个节点x包含一个区间x:int,x的key是low区间的端点 x.int.low。因此,数据结构的中序树遍历按低端点排序的顺序列出了区间。
这可以通过声明一个具有 min 和 max 的节点来完成。 comparableTo 函数应该只比较 x.int.low。
第 2 步:附加信息
除了区间本身,每个节点x还包含一个值x.max,它是存储在根子树中的任何区间端点的最大值在 x。
第 3 步:维护信息
我们必须验证插入和删除在 n 个节点的区间树上花费 O(lg n) 时间。我们可以确定 x.max 给定区间 x.int 和节点 x 的子节点的 max 值:
x:max = max(x.int.high; x.left.max; x.right.max)
第 4 步:开发新业务
我们唯一需要的新操作是
INTERVAL-SEARCH(T,i),它在树T中找到一个区间重叠的节点间隔i。如果树中没有与 i 重叠的区间,则该过程返回一个指向标记 T:nil 的指针。
我可以通过 AVL 树 来实现这一点,但出于好奇想知道我们是否可以扩充 Java 中的现有库,例如 TreeSet 或其他 collection 实体 em> 以适应上述设计。如果是这样,您能否提供示例代码或示例?
【问题讨论】:
-
特别是,我认为你不能这样做的原因是你不能挂钩树旋转事件来更新
max值。 -
@ErikP。谢谢。我自己实现了,下面我放了。如果您有任何评论,请发表评论。
-
一个基于 AVL 的 Java 实现已得到维护,也可在此处获得 github.com/Breinify/brein-time-utilities/#intervaltree。
标签: java algorithm data-structures tree interval-tree