1、动态顺序统计
顺序统计树:向红黑树的结构中添加一个size域,表示包含自身节点的当前节点的子树节点的数目。修改后可以快速支持顺序统计量操作。
1)检索具有给定排序的元素
过程OS_SELECT(x,i)返回一个指向以x为根的子树中包含第小关键字的结点的指针,即为了找出顺序统计量树T中的第i小关键字。
OS_SELECT(x,i)
r = size[left[x]]+1; //先计算x的处于的位置
if i = r //x正好是第i小的关键字
then return x;
else if i < r //x比第i关键字大,则在其左子树查找
then return OS_SELECT(left[x],i)
else return OS_SELECT(right[x],i-r) //x比第i关键字小,则在其右子树查找
(2)确定一个元素的秩(位置)
给定指向一顺序统计树T中节点x的指针,求x在顺序统计树中序遍历得到的线性序中的位置。
OS_RANK(T,x)
r = size[left[x]]+1; //获取以x为根子树中x的位置(中序遍历)
y = x;
while y != root[T] //从下向上直到根节点
do if y = right[p[y]] //如果是右子树
then r = r + size[left[p[y]]]+1;
y = p[y]; //向上移动
return r;
(3)对子树规模的维护
在红黑树中添加size域后,能够通过OS_SELECT和OS_RANK迅速计算出所需的顺序统信息。通过修改红黑树的插入和删除操作,在此过程是通过旋转来修改size域。
2、如何扩张数据结构
对一种数据结构的扩张过程分为四个步骤:
1)选择基础数据结构
2)确定要在基础数据结构中添加哪些信息
3)验证可用基础数据结构上的基本修改操作来维护这些新添加的信息
4)设计新的操作
3、区间树
这小结讲的是扩张红黑树以支持由区间构成的动态集合上的操作。区间可以很方便的表示各占用一段连续时间的一些事情。区间树是一种动态集合进行维护的红黑树,该集合中的每个元素x都包含在一个区间int[x]。区间树支持下列操作:
INTERVAL_INSERT(T,x):将包含区间域int的元素x插入到区间树T中
INTERVAL_DELETE(T,X):从区间树T中删除元素x
INTERVAL_SEARCH(T,i):返回一个指向区间树T中元素x的指针,使int[x]与i重叠,若集合中无此元素存在,则返回nil[T]。