算法导论笔记——第十二~十四章 数据结构(二)树
第十二章 二叉搜索树
>=左子树的所有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重叠。