算法打基础——二叉查找树Ⅱ

时间:2021-07-03 20:07:46

这一讲主要是介绍随机化版本的二叉查找树。BST I中也介绍了查找树的效率的关键就是树的高度,而这里想通过

随机化来使二叉查找树更加平衡,我们也将在数学上进行分析。

这一讲的主要内容是:1. BST sort与quicksort 的关系 2.二叉树的随机化版本 3.随机BST depth的分析

 

1. BST sort与quicksort 的关系

首先要讲的这个问题非常有意思,BST与quicksort一直存在着默默的关系,Ta俩本可以做情侣,最后却发现互相

是失散多年的兄妹关系。让我们首先考虑BST sort的过程:

BST SORT(A)

1  T <- Ø   // Create an empty BST

2  for i=1 to n

3    do Tree-Insert(T,A[i])

4  Perform an inorder tree walk of T

让我们来考虑一个例子,并分析一下整个过程。 A=[3 1 8 2 6 7 5]; 建好树后的结构是:

算法打基础——二叉查找树Ⅱ

分析时间复杂度: 对Tree-walk来说,时间复杂度就是Θ(n); 对于插入元素的过程,可以分别分析出现的最好的

情况和最差的情况。 最好情况是完全二叉树,树完全是平衡的,高度也达到最小。 对满二叉树,因为其高度为

lgn的个数是n/2,所以我们可以知道其复杂度是Θ(nlgn)。 当考虑最差情况,即元素时顺序或逆序是,生成的数就

是一个链表,其复杂度是Θ(n^2)。

根据上面的两个复杂度,我们很自然的想到了快排。 而实际上,BST sort和基本快排(即把第一个元素当分割点)

执行了相同的比较,但是按照不同的顺序。  然后由基本快排的优化方案,我们自然就想到了随机化版本的BST

sort。  

 

 2.二叉树的随机化版本

随机化BST sort的主要方法是先随机化的重新排列数组,然后再执行BST sort. 根据快排的时间复杂度我们知道

\[T(BSTsort)=\sum_{x\in T}depth(x)=\Theta(nlgn)\] 所以我们可以得到树的平均深度的期望:\[E[\frac{1}{n}\sum_{x\in T}depth(x)]=\Theta(lgn)\]

所以说,我们关注的是平均高度而不是实际高度,即每个节点的高度和的平均值。而实际上,树的实际高度可能

远大于logn.  比如下面这个例子中,平均高度是lgn,但是实际高度是\(\sqrt[2]{n}\)

算法打基础——二叉查找树Ⅱ

 

3.随机BST depth的分析

上面提到,随机化建立的树的高度可能不是lgn,而是节点的平均高度是lgn. 现在我们要证明的定理是随机化BST

建立的树的高度的期望确实是lgn(一定注意和上面的区别!我还没太想明白)

定理: E[height of rand built BST] = O(lgn)

这里先给出证明提纲,明确思路!

1 证明Jensen's 不等式 即 \(f(E[x])≤E[f(x)]\) for convex function f

2 假设Xn是n个节点时树的高度的随机变量,我们考虑Xn的一个凸函数\(Y_n = 2^{X_n}\)

3 证明 \(E[Y_n] = O(n^3)\)

4 根据3的结论, \(O(n_3)=E[Y_n]≥2^{E[X_n]}\),即可得到\(E[X]=O(lgn)\)

定理具体的证明因为我实在不太会用自带的这个latex,所以我还是写到自己的算法笔记里面了。这里就给出上面的这些证明思路。