算法导论(六)——扩充的数据结构的应用

来源:互联网 发布:软件授权码破解 编辑:程序博客网 时间:2024/06/07 06:57

算法导论(六)——扩充的数据结构的应用

 

选择数据结构(红黑树);决定附加信息(计算节点子树大小);验证数据结构不受修改操作影响(插入删除后需旋转);在新的结构上进行新的操作

 

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

阅读全文
0 0
原创粉丝点击