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