算法导论——二叉搜索树笔记


  1. 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不等式需要按照以下步骤

=======================================步骤一

  1. 凹函数:任意选择函数上两点p,q都满足,点p、q构成的线段在函数上面的。
  2. 所以任意选择p,q之间的一个点A,其下方一定存在一个对应的点B在凹函数上。
  3. 点B的参数化表示:横坐标xb=αx+βy,纵坐标f(xb), 其中α + β = 1,而且alpha ,beta >=0
  4. 点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不等式、递归式的求法(复习代换法)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值