算法打基础——二叉查找树Ⅱ
这一讲主要是介绍随机化版本的二叉查找树。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,所以我还是写到自己的算法笔记里面了。这里就给出上面的这些证明思路。