第14章 数据结构的扩张
14.1 动态顺序统计
顺序统计树:在红黑树的基础上,增加一个属性x.size,这个属性表示以x为根的子树(包括x本身)的内结点(不包括NIL)数,有等式:
x.size = x.left.size+x.right.size+1
元素的秩为在中序遍历树时输出的位置。
- 查找具有给定秩的元素
查找以x为根的子树中包含第i小关键字的结点
OS-SELECT(x,i)
r = x.left.size + 1
if i == r
return x
if i < r
return OS-SELECT(x.left,i)
else return OS-SELECT(x.right,i-r)
- 确定一个元素的秩
OS_RANK(T,x)
r =x.left.size + 1
y = x
while y != T.root
if y == y.p.right
r = r + y.p.left.size + 1
y = y.p
return r
- 对子树规模的维护
插入:第一阶段维护子树的规模,对由根至叶子的路径上遍历的每一个结点x,都增加x.size属性,新增结点的size为1.第二阶段,旋转次数至多为2次,仅会使两个结点的size属性失效。故只需在LEFT-ROTATE(T,x)代码中增加下面两行:
y.size = x.size
x.size = x.left.size + x.right.size + 1
14.2 如何扩张数据结构
定理(红黑树的扩张):设f是n个结点的红黑树T扩张的属性,且假设对任一结点x,f的值仅依赖于结点x、x.left和x.right的信息,还可能包括x.left.f和x.right.f。那么,我们可以在插入和删除操作期间对T的所有结点的f值进行维护,并且不影响两个操作的 O(lgn) 渐进时间性能。
14.3 区间树
区间重叠:
i
和
扩张:
- 1、基础数据结构
选择一颗红黑树,每个结点x包含一个区间属性x.int,且x的关键字为区间的低端点x.int.low。 - 2、附加信息
x.max,是以x为根的子树中所有区间的端点的最大值 - 3、对信息的维护
x.max = max(x.int.high, x.left.max, x.right.max)
- 4、设计新的操作
用来找出树T中与区间i重叠的那个结点,若不存在与i重叠的结点,则返回指向哨兵T.nil的指针
INTERVAL-SEARCH(T,i)
x = T.root
while x!=T.nil && i does not overlap x.int
if x.left != T.nil && x.left.max >= i.low
x = x.left
else x = x.right
return x