用递归树方法求解递归式
[备注:需要修改]
一个递归算法的递归式: T ( n ) = 3 T ( n / 4 ) + c n 2 T\left(n\right)=3T\left(n/4\right)+cn^2 T(n)=3T(n/4)+cn2
我们先来了解一下这个递归式什么意思:
- 3 3 3 表示我们将一个问题分解为 3 3 3个子问题;
- n / 4 n/4 n/4 则表明每个子问题的规模是原问题的 1 / 4 1/4 1/4;
- T ( ) T\left(\right) T() 表明的为递归形式;
- c n 2 cn^2 cn2 表明为合并需要的时间,其中 c c c为常数系数 c > 0 c>0 c>0。其实也就是算法度 Θ ( n 2 ) Θ\left(n^2\right) Θ(n2)。
好嘞~,现在来看递归树:
我们可以从上图中得出:
-
该树的长度为: l o g 4 n log_{4}n log4n。理由为:
原本问题的规模为 n n n,到了树的最底层,则为 1 1 1了,也就是说,每往下一层,则规模为 1 / 4 1/4 1/4,我们假设它除去了 i i i个 4 4 4( i i i个结点),也就是说, n ÷ 4 1 ÷ 4 2 ÷ . . ÷ 4 i = 1 n\div4_{1}\div4_{2}\div..\div4_{i}=1 n÷41÷42÷..÷4i=1,换个思维,可以说是: 4 i = n 4^i=n 4i=n,换算一下也就是 i = l o g 4 n i=log_{4}n i=log4n -
每往下一层,其子问题得规模为原问题 1 / 4 1/4 1/4,也可以说是根据其结点,也就是结点每往下一层,其规模减少 1 / 4 1/4 1/4,我们设置结点为 i i i,就可以得到第 i i i层的规模将减少至原规模的 1 4 i \dfrac {1}{4^{i}} 4i1,又因为 n n n为原规模,所以可以得出:
当结点为 i i i的时候,得出规模为: n 4 i \dfrac {n}{4^{i}} 4in -
每层的节点数都是上层的 3 3 3倍,所以,当结点为 i i i时,因此深度为 i i i的结点数为 3 i 3^i 3i
-
我们可以看到递归树的最上面那层,表示一开始的代价为 c n 2 cn^2 cn2,我们上面求出了结点为 i i i的时候,规模为: n 4 i \dfrac {n}{4^{i}} 4in,我现在将其转为代价,结点为 i i i的时候,代价为 c ( n 4 i ) 2 c\left(\dfrac {n}{4^{i}}\right)^2 c(4in)2,我们需要把结点数也算上,结点为 i i i时,有 3 i 3^i 3i个结点,最后乘起来,得到:
3 i ⋅ c ( n 4 i ) 2 = ( 3 16 ) i c n 2 3^i\cdot c\left(\dfrac {n}{4^{i}}\right)^2=\left(\dfrac {3}{16}\right)^{i}cn^{2} 3i⋅c(4in)2=(163)icn2
现在我们可以用级和去求总代价:
T ( n ) = ∑ i = 0 l o g 4 n ( 3 16 ) i c n 2 T\left(n\right)=\sum ^{log_{4}n}_{i=0}\left(\dfrac {3}{16}\right)^{i}cn^{2} T(n)=∑