- BST(Binary Search Tree)(1)二叉树
- 二叉树的高度在[logn,n]只见,一个最好,一个最坏
- 二叉树可以用在排序中,常见的方法就是为数组构造一个二叉树,然后中序遍历它
- 算法如下
T <- NULL for i:1 to n do Tree-Insert(T, A[i]) InOrder-Tree-Walk(T); 建立空树 对于所有第1个到n个的数字 树插入数字 按照中序遍历这棵树
中序遍历,就是按照左子树,根节点,右子树的顺序进行遍历,上图就是,
-
2,3,4,7,9,10
-
这个算法的时间复杂度是多少???
-
我们知道中序遍历只要遍历一趟数组,就是n次,O(n)
-
然后树插入数字需要多久?我们需要找到数字在树的哪个位置,也就是在树的第几层。
-
下界:Ω(nlogn)——all the time(因为最好的情况下是满二叉树,n/2个节点在第logn层,所以最差情况都是c*nlogn)
-
上界: O(n*n) ,一定小于c*n*n,最差情况是碰到有序的元素,所有节点都是沿一个方向的,Time =所有深度之和=1 + 2 +3+...+n =1/2*n*n。
-
幸运的是,balanced BST(平衡二叉树)可以使得节点层数不超过logn,所以最好情况下的是O(nlogn)
-
我们注意到二叉树和QuickSort具有一样的上限和下限,而且做的比较也是相同的,都是划分成比x大和比x小的情况
-
事实上,他们是失散多年的亲兄弟!(字幕组太调皮)
-
QuickSort:
-
实际上快排也就是二叉树相似的过程,选择数字9作为第一个数字,比他小的去左边的小组,比他大的去右边的小组
-
然后小组内继续划分,比7小的4,3,2去小小组,比7大的去小大组,但没有元素,后面以此类推,仔细看看和树没啥区别
进阶:我们需要的其实是随机化的二叉搜索树,这个树效率比较高的,生成随机算法树如下
随机化BST
(1)随机化数组,让数组变得随机的顺序
(2)用上面的二叉树算法对A排序
BST sort(A)
时间复杂度=随机化快排的时间复杂度
定理:一棵随机化的BST的高度的期望值是logn
证明:
(1)Proof
首先用到一个概率相关的公式,叫Jensen`s unquality,如下
假设,有个凹函数f(x),则有
f(E[X]) <= E[f(X)]
(2)并不是直接分析那个表示高度的随机变量Xn,而是分析Yn = 2^Xn,也就是Math.pow(2,Xn)
Xn=节点在树上的高度。
(3)证明E[Yn] = O(n^3)
(4)把(3)带入(1)的公式,得到
2^(Xn) <= E(Yn) = O(n^3)
节点高度Xn <= logO(n^3)
=3logn + O(1)
所以二叉搜索树的节点高度的期望值是O(logn)...
要证明第一步的Jenson不等式需要按照以下步骤
=======================================步骤一
- 凹函数:任意选择函数上两点p,q都满足,点p、q构成的线段在函数上面的。
- 所以任意选择p,q之间的一个点A,其下方一定存在一个对应的点B在凹函数上。
- 点B的参数化表示:横坐标xb=αx+βy,纵坐标f(xb), 其中α + β = 1,而且alpha ,beta >=0
- 点A对应为:横坐标xa = xb,纵坐标 αf(p) +βf(q)
- 综上,
- 对于任意x,y属于R,任意α,β >= 0,且α + β = 1,
- 都有
- f(αx + βy) <= αf(x) +βf(y)
===================================步骤二
证明凹函数的引理
适用于凹函数上的n个点,假设任意n个x∈R,任意α1,α2,...,αn >= 0,而且
∑αi=1(对于所有的α求和,i=1,2,...,n),那么
(1)
其实就是上面步骤1的公式从2维变成n维。
所以我们采用数学归纳法,证明如下,
(1)n = 1时,满足条件f(1*x1)<= 1 * f(x1)
(2)n = 2时,满足条件
(2)n>2时,假设对于n = k,满足不等式(1)成立,那么对于n=k+1,
原式左边= f(∑αk*xk + α(k+1)*x(k+1))=下面的公式
解释一下,∑αi*xi里面外面同除以(1-α(k+1)),这样可以构造出两项之和等于1 ,构造α + β = 1,的条件
原式右边= ∑αi*f(xi) + f(α(k+1)*x(k+1))=下面的公式
因为 f(αx + βy) <= αf(x) +βf(y),而且 ,所以左边<=右边,原不等式得证
=======================这样第二步的证明结束了=====================================
第三步,所以回到Jensor不等式,
f(E[X]) <= E[f(X)]
f(E(X)) =
把α_i看做P{x_i},那么就满足
=E(f(x))
BST的期望高度为?
已知Xn = 随机化树的高度,Yn= 2^Xn
假设构建这么一棵树,根节点是r,假设r排在数组的第k位
Xn = 1+max{X(k-1) ,X(n-k)},
Yn = 2 *max{Y(k-1) , Y(n-k)}
不妨设
Z_nk = {1 ,if 根节点是第k位
{0, otherwises
因为对于每个子树,都有根节点,如果满足条件,Z_nk是1,否则继续递归。
Z_nk和Yn是相互独立的,
Y(k-1) , Y(n-k)其实是一样的。。。。
取任意的k值,Yn=∑ Z_nk*(2 max{Y(k-1) , Y(n-k)}),
E(Yn) = E(∑ Z_nk*(2 max{Y(k-1) , Y(n-k)}))=
∑E( Z_nk*(2 max{Y(k-1) , Y(n-k)}))=∑E( Z_nk)*E(2 max{Y(k-1) , Y(n-k)})
=∑1/n * E(2 max{Y(k-1) , Y(n-k)}) <= 2/n *∑(E[Yk-1]+E[Yn-k])= 4/n * ∑E[Yk](k=0:n-1)
上式表达为E(Yn) <= 4/n * ∑E[Yk](k=0:n-1)
使用代换法,猜想E(Yn) = O(n^3)
Base case:Y(1) = O(1)
E(Yn) <= 4/n * ∑ ck^3 (k=0:n-1)
<= 4c/n*(n^4/4)=cn^3
第三步证明完毕,回到第四步
(4)把(3)带入(1)的公式,得到
2^(Xn) <= E(Yn) = O(n^3)
节点高度Xn <= logO(n^3)
=3logn + O(1)
总结一下,这节课主要介绍了二叉搜索树的算法,先要建立一棵树,再中序遍历,其时间复杂度的下界是Ω(nlogn),上界是O(n^3),树的高度在[logn,n]之间,随机BST的深度的数学期望是O(logn),主要讲了证明,需要注意的是随机指示变量(Indicator Random Variables)、Jensor不等式、递归式的求法(复习代换法)。