由于最后一节课明确提出,最后的考试只考察“给定递归式,画出它的递归树并分析递归树的性质”这一部分的内容,因此以blog的形式专门对这部分内容进行记录,以作复习之用。
在递归树中,每个结点表示一个单一子问题的代价,子问题对应某次递归函数的调用。我们将书中每层中的代价求和,得到每层的代价,然后将所有层的代价求和,得到所有层次的递归调用的总代价。
以递归式 T ( n ) = 3 T ( [ n / 4 ] ) + Θ ( n 2 ) T(n)=3T([n/4])+\Theta(n^2) T(n)=3T([n/4])+Θ(n2)为例构造递归树,并分析递归树的性质:
因递归树得知,子问题的规模每一步减少为上一步的 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)log34−1cn2+Θ(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=0log4n−1(163)icn2+Θ(nlog43)<∑i=0∞(163)icn2+Θ(nlog43)=1−1631cn2+Θ(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⌋)+cn2≤3d⌊4n⌋2+cn2≤3d(4n)2+cn2=163dn2+cn2≤dn2
当 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)nlog43−1cn2+Θ(nlog43)
可以使用放缩以及等比数列、幂级数的知识对上式进行化简,最终得到 T ( n ) = O ( n 2 ) T(n)=O(n^2) T(n)=O(n2)。
答案参考自:https://zhuanlan.zhihu.com/p/35850085
问题描述: 对递归式 T ( n ) = 3 T ( ⌊ n 2 ⌋ ) + n T(n)=3T(\lfloor{n\over2}\rfloor)+n T(n)=3T(⌊2n⌋)+n,利用递归树确定一个好的渐进上界,用代入法进行验证。
解答:
勘误:树高是 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)≤cnlog23−dn,有:
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⌋)+n≤3⋅(c(2n)log23−d2n)+n=cnlog23+(1−23d)n≤cnlog23−dn
对最后一个不等式之前的 ( 1 − 3 d 2 ) n (1-{3d\over2})n (1−23d)n进行拆解,得到 c n l o g 2 3 − d n + ( n − 1 2 d n ) {cn^{log_23}-dn+(n-{1\over2}dn)} cnlog23−dn+(n−21dn),因此只需要保证 ( n − 1 2 d n ) ≤ 0 (n-{1\over2}dn) \leq0 (n−21dn)≤0,就有上述不等式成立,即 d ≥ 2 d\geq2 d≥2。
问题描述: 对递归式 T ( n ) = T ( n 2 ) + n 2 T(n)=T({n\over2})+n^2 T(n)=T(2n)+n2,利用递归树确定一个好的渐进上界,用代入法进行验证。
问题描述: 对递归式 T ( n ) = 4 T ( ⌊ n 2 ⌋ ) + c n T(n)=4T(\lfloor{n\over2}\rfloor)+cn T(n)=4T(⌊2n⌋)+cn,画出递归树,并给出其解的一个渐进紧确界。用代入法验证。
问题描述: 画出 T ( n ) = 3 T ( n 4 ) + Θ ( n 2 ) T(n)=3T({n\over4})+\Theta(n^2) T(n)=3T(4n)+Θ(n2)的递归树,分析递归树的性质(包括树的高度、叶子结点的数量、递归树的总代价等),利用递归树确定一个好的渐进上界,并使用代入法证明。
问题描述: 画出 T ( n ) = 2 T ( n 2 ) + n 2 T(n)=2T({n\over2})+n^2 T(n)=2T(2n)+n2的递归树,分析递归树的性质(包括树的高度、叶子结点的数量、递归树的总代价等),利用递归树确定一个好的渐进上界,并使用代入法证明。