当前位置: 首页 > news >正文

算法导论笔记——第十二~十四章 数据结构(二)树

第十二章 二叉搜索树

>=左子树的所有key,<=右子树的所有key

在一棵高度为h的二叉搜索树上,动态集合上的操作SEARCH,MINIMUM,MAXIMUM,SUCCESSOR,PREDECESSOR,INSERT和DELETE可以在O(h)时间内完成。

h>=(lgn向下取整)

和快速排序算法一样,其平均性能更接近于最好情形。

随机构建二叉搜索树期望高度为O(lgn).

 

各种操作请自行查阅。

 

第十三章 红黑树

是一种(近似)平衡的二叉搜索树。可以保证在最坏情况下基本动态集合操作的时间复杂度为O(lgn).

保证没有一条路径会比其他路径长出两倍。

1 每个结点或是红色的,或是黑色的。

2 根节点是黑色的。

3 每个叶节点(NIL)是黑色的。

4 如果一个结点是红色的,则它的两个子节点都是黑色的。

5 对每个结点,从该结点到其所有后代结点的简单路径上,均包含相同数目的黑色结点。

黑高bh(x):从某个结点x出发(不含该结点)到达一个叶节点的任意一条简单路径上的黑色结点个数.

 

引理13.1 一棵有n个内部结点的红黑树的高度至多为2lg(n+1)。

 

各种操作请自行查阅。

 

第十四章 数据结构的扩张

14.1 动态顺序统计

快速找到一个集合中的第i小的数,或给出一个指定元素在集合的全序中的位置。

顺序统计树:修改红黑树使之包括以此结点为根的子树的大小。

第九章的方法O(n)。顺序统计树可达到O(lgn)。当然需要先建立红黑树花费时间O(n)。

增加以x为根的子树(除哨兵外)的结点个数。

插入删除元素时,维护红黑树的时间是O(lgn)。

 

14.2 如何扩张数据结构

四个步骤:

1 选择一种基础数据结构

2 确定基础数据结构中要维护的附加信息

3 检验基础数据结构上的基本修改操作能否维护附加信息

4 设计一些新操作

对红黑树的扩张:

定理14.1(红黑树的扩张) 设f是n个结点的红黑树T扩张的属性,且假设对任一结点x,f的值仅依赖于结点x、x.left和x.right的信息,还可能包含x.left.f和x.right.f。那么我们可以在插入和删除操作期间对T的所有结点的f值进行维护,并且不影响这两个操作O(lgn)渐进时间性能。

 

14.3 区间树

步骤1 基础数据结构

  红黑树,每个结点x包含一个区间属性x.int,且x的关键字为区间的低端点x.int.low。

步骤2 附加信息

  x.max表示以x为根的子树中所有区间的高端点最大值。

步骤3 维护附加信息

  x.max = max(x.int.high, x.left.max, x.right.max)

步骤4 设计新操作

INTERVAL-SEARCH(T,i)
  x = T.root
  while x != T.nil and i does not overlap x. int
    if x. left != T.nil and x. left.max >= i. low
      x = x. left
    else x = x.right
  return x

定理14.2 INTERVAL-SEARCH(T,i)的任意一次执行,或者返回一个其区间与i重叠的结点,或者返回T.nil,此时树T中没有任何结点的区间与i重叠。

转载于:https://www.cnblogs.com/justinh/p/6565735.html

相关文章:

  • 招Java工程师一名
  • React Native商城项目实战10 - 个人中心中间内容设置
  • shell中的并且、和、或者
  • 时间控件-pikaday.js
  • POJ 1328 Radar Installation贪心算法
  • 分享我的第一次Selenium自动化测试框架开发过程
  • Android 透明度对照表
  • git命令
  • 高级查询
  • Scott Guthrie访谈:定制仪表板与Azure Monitor
  • 打包新版本上传到AppStore时报错 ERROR ITMS-90034:
  • Eclipse导入项目:No projects are found to import
  • SLF4J - 借助SLF4J, 统一适配所有日志实现为logback日志实现的实践
  • js作用域和this的理解
  • 关于通知方法递增式调用解决方案
  • JavaScript-如何实现克隆(clone)函数
  • JS 中的深拷贝与浅拷贝
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 30秒的PHP代码片段(1)数组 - Array
  • 77. Combinations
  • Angular 响应式表单 基础例子
  • docker-consul
  • Laravel 菜鸟晋级之路
  • Otto开发初探——微服务依赖管理新利器
  • python学习笔记 - ThreadLocal
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 开发基于以太坊智能合约的DApp
  • 前端之Sass/Scss实战笔记
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 选择阿里云数据库HBase版十大理由
  • ​queue --- 一个同步的队列类​
  • #etcd#安装时出错
  • #include到底该写在哪
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2)(2.10) LTM telemetry
  • (3)nginx 配置(nginx.conf)
  • (bean配置类的注解开发)学习Spring的第十三天
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .NET建议使用的大小写命名原则
  • .stream().map与.stream().flatMap的使用
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • @Autowired标签与 @Resource标签 的区别
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [C++]Leetcode17电话号码的字母组合