【Chapter 4】Divide and Conquer(使用递归树求解递归式)

Divide and Conquer

由于最后一节课明确提出,最后的考试只考察“给定递归式,画出它的递归树并分析递归树的性质”这一部分的内容,因此以blog的形式专门对这部分内容进行记录,以作复习之用。
【Chapter 4】Divide and Conquer(使用递归树求解递归式)_第1张图片

图片转载自网络

用递归树法求解递归式

递归树中,每个结点表示一个单一子问题的代价,子问题对应某次递归函数的调用。我们将书中每层中的代价求和,得到每层的代价,然后将所有层的代价求和,得到所有层次的递归调用的总代价。

以递归式 T ( n ) = 3 T ( [ n / 4 ] ) + Θ ( n 2 ) T(n)=3T([n/4])+\Theta(n^2) T(n)=3T([n/4])+Θ(n2)为例构造递归树,并分析递归树的性质:
【Chapter 4】Divide and Conquer(使用递归树求解递归式)_第2张图片
因递归树得知,子问题的规模每一步减少为上一步的 1 4 1\over4 41,所以最终必然达到边界条件。设在第i层达到边界条件,即子问题的规模降到1,令 n 4 i = 1 {n\over{4^i}}=1 4in=1,解得 i = log ⁡ 4 n i=\log_4n i=log4n。因此,递归树有 log ⁡ 4 n + 1 \log_4n+1 log4n+1层(深度为 0 , 1 , 2 , . . . , log ⁡ 4 n 0,1,2,...,\log_4n 0,1,2,...,log4n,树高即为 log ⁡ 4 n + 1 \log_4n+1 log4n+1

接下来确定每一层的代价。每层的节点数是上一层的3倍(因为 T ( n ) = 3 T ( [ n / 4 ] ) + Θ ( n 2 ) T(n)=3T([n/4])+\Theta(n^2) T(n)=3T([n/4])+Θ(n2),每一个主问题可以分解为三个子问题),因此最底层有 3 log ⁡ 4 n = n log ⁡ 4 3 3^{\log_4n}=n^{\log_43} 3log4n=nlog43个节点,每个结点的代价为 T ( 1 ) T(1) T(1),因此最底层的总代价为 n log ⁡ 4 3 T ( 1 ) = Θ ( n log ⁡ 4 3 ) n^{\log_43}T(1)=\Theta(n^{\log_43}) nlog43T(1)=Θ(nlog43)。深度为 i i i的结点的代价为 c ( n 4 i ) 2 c({n\over{4^i}})^2 c(4in)2,结点数为 3 i 3^i 3i,故深度为 i i i的这一层的总代价为 3 i c ( n 4 i ) 2 = ( 3 16 ) i c n 2 3^ic({n\over{4^i}})^2=({3\over16})^icn^2 3ic(4in)2=(163)icn2

现在求所有层次的代价之和,以确定整棵树的代价:
T ( n ) = c n 2 + 3 16 c n 2 + ( 3 16 ) 2 c n 2 + . . . + ( 3 16 ) log ⁡ 3 4 − 1 c n 2 + Θ ( n log ⁡ 4 3 ) T(n)=cn^2+{3\over16}cn^2+({3\over16})^2cn^2+...+({3\over16})^{\log_34-1}cn^2+\Theta(n^{\log_43}) T(n)=cn2+163cn2+(163)2cn2+...+(163)log341cn2+Θ(nlog43)
化简之,得到:
T ( n ) = ∑ i = 0 log ⁡ 4 n − 1 ( 3 16 ) i c n 2 + Θ ( n l o g 4 3 ) < ∑ i = 0 ∞ ( 3 16 ) i c n 2 + Θ ( n l o g 4 3 ) = 1 1 − 3 16 c n 2 + Θ ( n log ⁡ 4 3 ) = 16 13 c n 2 + Θ ( n log ⁡ 4 3 ) = O ( n 2 ) T(n)=\sum^{\log_4n-1}_{i=0}({3\over16})^icn^2+\Theta(n^{log_43})\lt\sum^{\infty}_{i=0}({3\over16})^icn^2+\Theta(n^{log_43})={1\over{1-{3\over16}}}cn^2+\Theta(n^{\log_43})={16\over13}cn^2+\Theta(n^{\log_43})=O(n^2) T(n)=i=0log4n1(163)icn2+Θ(nlog43)<i=0(163)icn2+Θ(nlog43)=11631cn2+Θ(nlog43)=1316cn2+Θ(nlog43)=O(n2)

下面使用代入法进行验证。希望证明 T ( n ) ≤ d n 2 T(n)\leq{dn^2} T(n)dn2对某个常数 d > 0 d\gt0 d>0成立。与之前一样,使用常数 c > 0 c\gt0 c>0,有:
T ( n ) ≤ 3 T ( ⌊ n 4 ⌋ ) + c n 2 ≤ 3 d ⌊ n 4 ⌋ 2 + c n 2 ≤ 3 d ( n 4 ) 2 + c n 2 = 3 16 d n 2 + c n 2 ≤ d n 2 T(n)\leq3T(\lfloor{n\over4}\rfloor)+cn^2\leq3d{\lfloor{n\over4}\rfloor}^2+cn^2\leq3d({n\over4})^2+cn^2={3\over16}dn^2+cn^2\leq{dn^2} T(n)3T(⌊4n⌋)+cn23d4n2+cn23d(4n)2+cn2=163dn2+cn2dn2
d ≥ ( 16 13 ) c d\geq({16\over13})c d(1316)c时,最后一步推导成立。

总结一下如何根据上述递归式画出递归树,进而得到树的性质:

首先,递归调用顶层的代价为 c n 2 cn^2 cn2,即根节点的代价,根的三棵子树表示规模为 n 4 n\over4 4n的子问题的代价。进而进行进一步的扩展,每棵子树可以继续展开为三个代价为当前子问题 1 4 1\over4 41的子问题。子问题的规模逐渐缩减为原来的 1 4 1\over4 41,最终必然会达到问题规模为 T ( 1 ) T(1) T(1)的边界条件。假设在第 i i i层到达边界,即第 i i i层的代价为1,有 n 4 i = 1 {n\over4^i}=1 4in=1,解得 i = log ⁡ 4 n i=\log_4n i=log4n,故而总的树高为 log ⁡ 4 n + 1 \log_4n+1 log4n+1

其次,对于第 i i i层,共有 3 i 3^i 3i个节点,每个节点是对应一个子问题,子问题的求解代价为 c ( n 4 i ) 2 c({n\over4^i})^2 c(4in)2,因此每一层的求解代价为 ( 3 16 ) 2 c n 2 ({3\over16})^2cn^2 (163)2cn2,算上最底层 i = log ⁡ 4 n i=\log_4n i=log4n,它的代价为 T ( 1 ) T(1) T(1),结点个数为 3 log ⁡ 4 n = n log ⁡ 4 3 3^{\log_4n}=n^{\log_43} 3log4n=nlog43,最后一层的代价为 n log ⁡ 4 3 T ( 1 ) = Θ ( n log ⁡ 4 3 ) n^{\log_43}T(1)=\Theta(n^{\log_43}) nlog43T(1)=Θ(nlog43)

整棵树的代价为 每一层的代价 + 最后一层(边界)的代价 每一层的代价 + 最后一层(边界)的代价 每一层的代价+最后一层(边界)的代价,其值为:
T ( n ) = c n 2 + 3 16 c n 2 + ( 3 16 ) 2 c n 2 + . . . + ( 3 16 ) n log ⁡ 4 3 − 1 c n 2 + Θ ( n log ⁡ 4 3 ) T(n)=cn^2+{3\over16}cn^2+({3\over16})^2cn^2+...+({3\over16})^{n^{\log_43}-1}cn^2+\Theta(n^{\log_43}) T(n)=cn2+163cn2+(163)2cn2+...+(163)nlog431cn2+Θ(nlog43)
可以使用放缩以及等比数列、幂级数的知识对上式进行化简,最终得到 T ( n ) = O ( n 2 ) T(n)=O(n^2) T(n)=O(n2)

一些算法导论课后题当中简单的例子

答案参考自:https://zhuanlan.zhihu.com/p/35850085

4.4-1

问题描述: 对递归式 T ( n ) = 3 T ( ⌊ n 2 ⌋ ) + n T(n)=3T(\lfloor{n\over2}\rfloor)+n T(n)=3T(⌊2n⌋)+n,利用递归树确定一个好的渐进上界,用代入法进行验证。

解答:
【Chapter 4】Divide and Conquer(使用递归树求解递归式)_第3张图片
勘误:树高是 log ⁡ 2 n + 1 \log_2n+1 log2n+1
使用代入法进行推测:
推测 T ( n ) ≤ c n l o g 2 3 − d n T(n)\leq{cn^{log_23}-dn} T(n)cnlog23dn,有:
T ( n ) = 3 T ( ⌊ n 2 ⌋ ) + n ≤ 3 ⋅ ( c ( n 2 ) l o g 2 3 − d n 2 ) + n = c n log ⁡ 2 3 + ( 1 − 3 d 2 ) n ≤ c n l o g 2 3 − d n \begin{align*} T(n) & = 3T(\lfloor{n\over2}\rfloor)+n \\ & \leq 3\cdot({c({n\over2})^{log_23}-d{n\over2}})+n \\ & = cn^{\log_23} + (1-{3d\over2})n \\ & \leq {cn^{log_23}-dn} \end{align*} T(n)=3T(⌊2n⌋)+n3(c(2n)log23d2n)+n=cnlog23+(123d)ncnlog23dn
对最后一个不等式之前的 ( 1 − 3 d 2 ) n (1-{3d\over2})n (123d)n进行拆解,得到 c n l o g 2 3 − d n + ( n − 1 2 d n ) {cn^{log_23}-dn+(n-{1\over2}dn)} cnlog23dn+(n21dn),因此只需要保证 ( n − 1 2 d n ) ≤ 0 (n-{1\over2}dn) \leq0 (n21dn)0,就有上述不等式成立,即 d ≥ 2 d\geq2 d2

4.4-2

问题描述: 对递归式 T ( n ) = T ( n 2 ) + n 2 T(n)=T({n\over2})+n^2 T(n)=T(2n)+n2,利用递归树确定一个好的渐进上界,用代入法进行验证。

解答:
【Chapter 4】Divide and Conquer(使用递归树求解递归式)_第4张图片

4.4-7

问题描述: 对递归式 T ( n ) = 4 T ( ⌊ n 2 ⌋ ) + c n T(n)=4T(\lfloor{n\over2}\rfloor)+cn T(n)=4T(⌊2n⌋)+cn,画出递归树,并给出其解的一个渐进紧确界。用代入法验证。

解答:
【Chapter 4】Divide and Conquer(使用递归树求解递归式)_第5张图片

一些其它的例子

例1

问题描述: 画出 T ( n ) = 3 T ( n 4 ) + Θ ( n 2 ) T(n)=3T({n\over4})+\Theta(n^2) T(n)=3T(4n)+Θ(n2)的递归树,分析递归树的性质(包括树的高度、叶子结点的数量、递归树的总代价等),利用递归树确定一个好的渐进上界,并使用代入法证明。

解答:
【Chapter 4】Divide and Conquer(使用递归树求解递归式)_第6张图片

例2

问题描述: 画出 T ( n ) = 2 T ( n 2 ) + n 2 T(n)=2T({n\over2})+n^2 T(n)=2T(2n)+n2的递归树,分析递归树的性质(包括树的高度、叶子结点的数量、递归树的总代价等),利用递归树确定一个好的渐进上界,并使用代入法证明。

解答:
【Chapter 4】Divide and Conquer(使用递归树求解递归式)_第7张图片

你可能感兴趣的:(算法设计与分析,算法)