CLRS 14.3区间树

本文详细解析了CLRS中14.3章节关于区间树的内容,包括14.3-2的修改、14.3-3的重叠区间判断策略及其O(lgn)的时间复杂度,以及区间树的基础结构、附加信息维护和区间树在矩形重叠问题中的应用,总时间复杂度为O(lgn)。

14.3-1
在CLRS 13.2节中的LEFT-ROTATE最后添加两行代码:

y.max = x.max
x.max = max(α.max,β.max,x.int.high)

14.3-2
将书上的INTERVAL-SEARCH第三行的if语句中的 改为 > 即可。

14.3-3
对于INTERVAL-SEARCH,首先检查区间 x 是否和被查询区间 i 重叠,如果不重叠,要么转向左子树要么转向右子树。若区间重叠, 并且是右子树的区间和区间 i 重叠,由于关键字是低端点,我们返回的就是最小低端点区间;但若是有左子树区间和区间 i 重叠,返回的就有可能不是最小低端点区间。所以需要先检查是否有左子树区间和区间 i 重叠。

MIN-INTERVAL-SEARCH(T, i)
    return MIN-INTERVAL-SEARCH-FROM(T, T.root, i)

MIN-INTERVAL-SEARCH-FROM(T, x, i)
    if x.left ≠ T.nil and x.left.max ≥ i.low
        y = MIN-INTERVAL-SEARCH-FROM(T, x.left, i)
        if y ≠ T.nil
            return y
        elseif i overlaps x.int
            return x
        else return T.nil
    elseif i overlaps x.int
        return x
    else return MIN-INTERVAL-SEARCH-FROM(T, x.right; i)

时间复杂度是 O(lgn)

14.3-4

INTERVAL-OVERLAP-LIST(T, x, i)
    if i overlaps x.int
        print x
    if x.left != T.nil and x.left.max ≥ i.low
        INTERVAL-OVERLAP-LIST(T, x.left, i)
    if x.int.low ≤ i.high and x.right != T.nil and x.right.max ≥ i.low
        INTERVAL-OVERLAP-LIST(T, x.right, i)

14.3-5
先找到和区间 i 的低端点相等的区间(由于低端点是关键字),再比较找到的这个区间的高端点和区间 i 的高端点是否相等。

INTERVAL-SEARCH-EXACTLY(T, i)
    x = SEARCH(T, i.low)    //普通红黑树查找
    if x.high == i.high
        return x
    return T.nil 

14.3-6
1、基础数据结构
以集合中的数据作为关键字的红黑树。SEARCH和普通红黑树的TREE-SEARCH一样。
2、附加信息
每个结点 x 的扩张属性如下:
x.min.gap:记录以x为根结点的树的min-gap,若 x 为叶子结点则min-gap=∞ ;
x.min.val:记录以x为根结点的树中最小的关键字;
x.max.val:记录以x为根结点的树中最大的关键字;
3、信息维护
上面三个属性可以直接从结点和结点的孩子计算出来,从定理14.1可以知道插入删除操作只需 O(lgn) 时间。

x.min.val={x.left.min.valx.key

x.max.val={x.right.max.valx.key

x.min.gap=minx.left.min.gapx.right.min.gapx.keyx.left.max.valx.right.min.valx.key

4、新操作
Min_Gap():返回根结点的min-gap值,运行时间 O(1)
返回最接近的差值时间是 O(lgn)

14.3-7
基本思想是:采用一颗区间树,树中每个结点存放的区间是矩形的 y 区间。然后沿 x 轴用一条扫描线从左向右移动,将当前所有和扫描线相交的矩形都放在区间树中,因此在区间树中任意和 y 区间重叠的矩形就是重叠矩形。具体如下:
1.按矩形的 x 轴坐标排序(每个矩形有两条平行 y 轴的边,举个例子,现在有三个矩形,分别是(1,5)、(3,4)、(2,7),那么排序就是(1,1),(2,3),(3,2),(4,2),(5,1),(7,3),其中(1,1)中的后面一个 1 表示是第一个矩形,其余类似)。
2.扫描排序列表(按 x 轴从小到大),当遇到矩形的左边界时,在区间树中检查是否有和此矩形 y 区间相交的矩形,并将此矩形插入到区间树中;当遇到矩形的右边界时,从区间树中删除此矩形。
时间:排序是 O(lgn),区间树操作 O(lgn),总时间是 O(lgn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值