动态数据统计:顺序统计树(Order-statistic tree)
数据结构:
红黑树+每个结点保存子树的大小
基本操作:
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关键字小,则在其右子树查找
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;
OS树的维护(插入、删除):
①修改经过结点的size属性
②维护红黑树过程中,旋转时改变结点的size属性
区间树(Interval tree)
数据结构:
红黑树+每个结点保存区间[low, high]+每个结点保存子树中区间端点的最大值
新增操作:找到一个与区间i重叠的区间
①如果向右递归,说明左边没有符合条件的
因为如果向右递归,说明left.max > i.low
②如果左边没有找到符合条件的,那么右边肯定也没有
设拥有left.max的那个区间为j。这说明i.high < j.low,所以右边也没有
区间树的维护(插入、删除):
维护max值,维护红黑树旋转操作维护max值