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

第十二章 二叉搜索树

>=左子树的所有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重叠。

posted on 2017-08-17 12:56  胖子一刚  阅读(279)  评论(0编辑  收藏  举报

导航