算法学习03——树(三)二叉树的平均情况分析

树(三)——二叉树的平均情况分析

显而易见,一个二叉树所支持的操作时间复杂度取决于操作项所在的节点深度,即O(d),d是节点的深度。因此计算二叉树所支持的操作的时间复杂度需要求解一个树的所有节点的平均深度。
一棵树的所有节点深度的和称为内部路径长,即D(N),而D(1)=0,因为只有根节点的路径为0。一颗N个节点的树由一个i个节点的左子树和N-i-1个节点的右子树以及一个根节点组成。i个节点的左子树的内部路径长为D(i),同理N-i-1个节点的右子树的内部路径长为D(N-i-1)。而在原树中,左右子树的路径都要再经过根节点,因此内部路径长需要增加N-1。即:

D ( N ) = D ( i ) + D ( N − i − 1 ) + N − 1 D ( N ) = D( i ) + D( N-i-1 ) + N - 1 D(N)=D(i)+D(Ni1)+N1

假设字数的大小都是等可能出现的,那么D(N)的期望是:

$$
D( N ) = N \sum^{N-1}_ {i=0} ( D(i) + D( N- i -1 ) ) + N - 1

= \frac{2}{N} \sum^{N-1}_ {i=0}D( i ) +N
$$
计算可得 D ( N ) = O ( N l o g N ) D (N) = O( NlogN ) D(N)=O(NlogN)。计算过程如下:

D ( N ) = 2 N ∑ i = 0 N − 1 D ( i ) + N D ( N + 1 ) = 2 N + 1 ∑ i = 0 N D ( i ) + N + 1 \begin{aligned} D( N )&=& \frac{2}{N} \sum^{N-1}_ {i=0}D( i ) +N\\ D( N+1 )&=& \frac{2}{N+1} \sum^{N}_ {i=0}D( i ) +N + 1 \end{aligned} D(N)D(N+1)==N2i=0N1D(i)+NN+12i=0ND(i)+N+1

两式分别乘以N和N+1约掉分母再相减得:
( N + 1 ) D ( N + 1 ) − ( N ) D ( N ) = 2 D ( N ) + 2 N = > ( N + 1 ) D ( N + 1 ) = ( N + 2 ) D ( N ) + 2 N = > D ( N + 1 ) N + 2 = D ( N ) N + 1 + 2 N N + 1 − 2 N N + 2 \begin{aligned} (N+1) D(N+1) - (N)D(N)&=&2D(N)+2N\\ =>(N+1) D(N+1)&=&(N+2)D(N)+2N\\ => \frac{D(N+1)}{N+2} &=& \frac{D(N)}{N+1} + \frac{2N}{N+1} - \frac{2N}{N+2} \end{aligned} (N+1)D(N+1)(N)D(N)=>(N+1)D(N+1)=>N+2D(N+1)===2D(N)+2N(N+2)D(N)+2NN+1D(N)+N+12NN+22N

D ( N + 1 ) N + 2 = D ( N ) N + 1 + 2 N N + 1 − 2 N N + 2 \frac{D(N+1)}{N+2}=\frac{D(N)}{N+1} + \frac{2N}{N+1} - \frac{2N}{N+2} N+2D(N+1)=N+1D(N)+N+12NN+22N进行N+1项到2项的叠缩取得结果:
D ( N + 1 ) = 2 ( N + 2 ) ∑ i = 3 N + 1 1 i + 2 − N D(N+1)=2(N+2)\sum^{N+1}_ {i=3} \frac{1}{i} +2 -N D(N+1)=2(N+2)i=3N+1i1+2N
当N趋于无穷的时候,1/i的和趋于ln(N+1),所以 D ( N ) = 2 ( N + 1 ) ( l n ( N + 1 ) − 3 2 ) + 1 − N D(N)=2(N+1)( ln(N+1) - \frac{3}{2} )+1-N D(N)=2(N+1)(ln(N+1)23)+1N,即结果 D ( N ) = O ( N l o g N ) D (N) = O( NlogN ) D(N)=O(NlogN)。因此平均路径长度为 D ( N ) / N = O ( l o g N ) D (N) / N= O( logN ) D(N)/N=O(logN)

你可能感兴趣的:(算法学习,java学习,java学习,算法学习)