数据结构扩张

扩张红黑树构造出两种数据结构

动态顺序统计:
支持一般动态集合上顺序统计操作的数据结构,通过这种结构我们可以快速的找到一个集合中的第i小的数,或者一个指定元素在集合中的全序中的位置。
    修改红黑树使得可以在O(lgn)时间内确定任何的顺序统计量,集合在集合线性序中的位置成为元素的**秩**。在红黑树的节点中添加了一个新的属性x.size,包含了以x为根的(包含x)的子树的内节点数,即这棵子树的大小,并且我们定义哨兵T.nil.size为零。为了消除存在相同关键字使得秩的定义的不确定性,我们定义一个元素的 秩 为在中序遍历树时输出的位置
查找具有给定秩的元素
OS-SELECT(x,i)  //查找第i小的关键字
 1. r=x.left.size+1               //以x为根的子树中节点x的秩r
 2. if i==r
 3.     return x
 4. elseif i<r
 5.       return OS-SELECT(x.left,i)
 6. else return OS-SELECT(x.right,i-r)   //在x的右子树中查找第i-r小的
确定一个元素的秩
OS-RANK(T,x)  //返回对T中序遍历的对应的线性序列中x的位置
 1. r=x.left.size+1
 2. y=x
 3. while y!=T.root    //每次迭代的开始,r是以y为根的子树中x.key的秩
 4.     if y==y.p.right
 5.        r=r+y.p.left.size+1  
 6.     y=y.p
 7. return r

区间树:扩张红黑树来支持由区间构成的动态集合上的一些操作
INTERVAL-SEARCH(T,i) //查找树中与区间i重合的节点,若节点不存在,则返回哨兵T.nil指针

 1. x=T.root
 2. while x!=T.nil and i does not overlap x.int
 3.    if x.left!=T.nil and x.left.max>=i.low
 4.        x=x.left
 5.    else x=x.right
 6. return x         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值