本章通过扩张红黑树构造出两种数据结构:动态顺序统计和区间树。

1、动态顺序统计:查找倒数第i小的数据 复杂度为  lg(n)

为什么是扩张红黑树而不是搜索二叉树或者二叉树?

  相对于搜索二叉树,红黑树的平衡性更好,高度在lg(n) 。这样查找时的复杂度就是 lg(n)而不是n。在第9章顺序统计量的时候列出了运行时间期望为线性和最坏运行时间为线性的

算法(http://www.cnblogs.com/NeilZhang/p/5650226.html) 。

struct的结点的结构: 与一般的红黑树相比,增加了 size ,对于任意一个结点  p.size = p.left->size + p.right->size + 1

struct RBTreeNode
{int key;int color;struct RBTreeNode *parent;struct RBTreeNode *left;struct RBTreeNode *right;int size;
};

对于检索具有给定排序的元素:逐层查找

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=x.left.size +1 y=xwhile  y!=T.rootif y==y.p.rightr=r+y.p.left.size + 1y=y.p
return r

树的维护

  主要是针对 插入 和删除 操作的维护,在红黑树的插入删除的基础之上还要 在插入和删除之后 维护 size的大小,(需要从这个分支一直到root结点)复杂度为 lg(n)

对于红黑树的旋转操作也要在其中添加有关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]。

修改红黑树得到的区间树如下图所示:

从图可以看出,对区间树以每个节点的左端点值进行中序变量即可得到有序的序列。有了区间树的结果就很容易实现其相关操作。

转载于:https://www.cnblogs.com/NeilZhang/p/5659360.html

算法导论 第三部分——基本数据结构——第14章:数据结构的扩张相关推荐

  1. 算法导论第三版第十一章11.1-4

    算法导论第三版第十一章11.1-4 我们希望在一个非常大的数组上,通过利用直接寻址的方式来实现一个字典.开始时,该数组中可能包含一些无用信息,但要堆整个数组进行初始化时不太实际的,因为该数组的规模太大 ...

  2. 给出TREE_INSERT过程的非递归版本(算法导论第三版12.3-1)

    给出TREE_INSERT过程的非递归版本(算法导论第三版12.3-1) template<typename T> void insert_recursive(BinaryTree< ...

  3. 写出TREE-PREDECESSOR的伪代码(算法导论第三版12.2-3)

    写出TREE-PREDECESSOR的伪代码(算法导论第三版12.2-3) TREE-PREDECESSOR(x)if x.left != NILreturn TREE-MAXIMUM(x.left) ...

  4. 写出TREE-MINIMUM 和TREE-MAXIMUM的递归版本(算法导论第三版12.2-2)

    写出TREE-MINIMUM 和TREE-MAXIMUM的递归版本(算法导论第三版12.2-2) template<typename T> BinaryTreeNode<T>* ...

  5. 二叉树的中序遍历非递归方法(算法导论第三版12.1-3)

    二叉树的中序遍历非递归方法(算法导论第三版12.1-3) 1⃣️用栈实现 template<typename T> void inorder_tree_walk_non_recursion ...

  6. 二叉树的遍历(算法导论第三版12.1-4)(包含先序遍历,后序遍历和中序遍历)

    二叉树的遍历(算法导论第三版12.1-4) 1⃣️先序遍历 template<typename T> void preorder_tree_wald(BinaryTreeNode<T ...

  7. 利用链表实现可合并堆(算法导论第三版思考题10-2)

    利用链表实现可合并堆(算法导论第三版思考题10-2) a 链表已排序 创建一个空堆: Θ(1) 插入:Θ(n),插入后依然保持排序 最小值:Θ(1),第一位便是 取最小值:Θ(1) 合并:Θ(n),可 ...

  8. 非递归遍历二叉树(算法导论第三版第十章10.4-5)

    非递归遍历二叉树(算法导论第三版第十章10.4-5) template<typename T> void TraverseBinaryTreeNonRecursive(BinaryTree ...

  9. 给定一个n节点二叉树,写出一个O(n)时间的非递归的过程,将该树每个结点的关键字输出(算法导论第三版第十章10.4-5)

    给定一个n节点二叉树,写出一个O(n)时间的非递归的过程,将该树每个结点的关键字输出.要求除该树本树的存储空间外只能使用固定量的额外存储空间,且过程中不得修改该树,即使是暂时的修改也不允许. (算法导 ...

  10. Θ(n)反转单链表(算法导论第三版第十章10.2-7)

    Θ(n)反转单链表 (算法导论第三版第十章10.2-7) template<typename T> void reverses(Single_L<T> &l) {if( ...

最新文章

  1. TZOJ--3560: Ordered Fractions (枚举)
  2. DotNet4应用程序打包工具(把DotNet4安装程序打包进你的应用程序;WINAPI开发,无dotNet环境也可顺利执行)【一】整体思路...
  3. WEB通用网关接口:CGI简单教程
  4. LG-Transformer:全局和局部建模Transformer结构新作
  5. m不能被3整除c语言表达式,求mn-之间所有不能被3整除的整数之和求 – 手机爱问...
  6. linux CP命令覆盖不提示方法
  7. 游戏测试永乐大典——测试成就感
  8. C++ QQ游戏 连连看外挂 内存挂入门
  9. MongoDB 下载地址列表
  10. paint.net ps证件照背景色
  11. 固件版本区别:alpha版、beta版、rc版、stable版
  12. 英伟达最新驱动打开3d vision功能
  13. 工作态度决定了工作结果
  14. 防汛抗洪中,北峰应急通信小系统如何筑起通信防线
  15. 微信小程序之时间计算器
  16. webRTC H265浏览器播放器+metaRTC推流实现webRTC H265解决方案
  17. 数据库读写分离与分库分表
  18. 微信开通检测无需等待准确高的软件
  19. Android蓝牙打印机功能开发完整Demo
  20. 人脸识别门禁为何倍受青睐?

热门文章

  1. SQL创建表格——手写代码
  2. 类的特殊成员反射异常处理
  3. cojs 香蕉 解题报告
  4. 根据窗口名称查找关键字弹性域用到的表,列等信息
  5. kubectl get node运行时出现:Unable to connect to the server: x509: certificate signed by unknown authority
  6. STM32F103构建固件库模板(PS固件库文件树介绍)
  7. 什么是Cortex、ARMv8、arm架构、ARM指令集、soc
  8. java 注解数组初始化_Java 之 注解的定义
  9. c++ 冒泡排序_干货|python笔记1-冒泡排序
  10. php获取页面的可视内容高度,网页制作技巧:获取页面可视区域的高度_css