算法导论(六)——扩充的数据结构的应用
选择数据结构(红黑树);决定附加信息(计算节点子树大小);验证数据结构不受修改操作影响(插入删除后需旋转);在新的结构上进行新的操作
1. 动态有序统计:(SELECT在动态集中返回第i小的数,RANK在有序集中返回排名为i的元素)
【已知】对于一个无序的集合,能够在O(n)的时间内确定任何的顺序统计量
【目标】修改红黑树,使得在O(lgn)时间内确定任何的顺序统计量
——>顺序统计树: 在每个结点上存储附加信息的一棵红黑树。
【节点信息】附加属性x.size = x.left.size + x.right.size + 1
【对子树规模的维护】维护size时间复杂度:O(1)。所以插入、删除,包括维护size属性,都只需要O(lgn)时间。
OS-SELECT( x, i ) // 过程返回一个指针,指向以x为根的子树中包含第i小关键字的结点
r= x.left.size + 1
if i == r
return x
else if i < r
return OS-SELECT( x.left, i )
else
return OS-SELECT( x.right, i - r )
OS-RANK( T, x ) // 过程返回T中序遍历对象的线性序中x的位置
r= x.left.size + 1
y= x
while y != T.root
if y == y.p.right
r += y.p.left.size + 1
y = y.p
return r
2. 区间树(找到与目标区间重合的区间)
【节点信息】每个结点的关键字为区间int(低端点x.int.low)。附加信息包含一个值x.max,它是以x为根的子树中,所有区间的端点的最大值。
【对子树规模的维护】一次旋转后,更新max属性只要O(1)的时间;所以插入和删除的运行时间为O(lgn)。
参考:
http://blog.csdn.net/loveprogram_1/article/details/32318211
http://blog.csdn.net/lu597203933/article/details/43459035