笔记

在应用代入法求解递归式时,需要事先做出一个好的猜测。然而,有时候做出好的猜测是很困难的,此时可以考虑采用递归树方法。在递归树中,每个结点表示一个单一子问题的代价。创建递归树之后,对树的每层的各子问题的代价进行求和,得到每一层的代价,然后将所有层的代价加起来,得到整棵递归树的总代价,这个总代价就是递归式的解。当然,递归树方法是一种粗略的方法,因为递归树会引入一些“不精确”因素,这一点在后文再详细介绍。如果要精确求解递归式,还需要用代入法对递归树得到的解进行验证。
  以递归式T(n)=3T(⌊n/4⌋)+Θ(n2)T(n)=3T(⌊n/4⌋)+Θ(n^2)T(n)=3T(⌊n/4⌋)+Θ(n2)为例。为简化分析,我们将递归树中的Θ(n2)Θ(n^2)Θ(n2)这一渐近符号项替换为一个代数式cn2cn^2cn2。这里引入了第一个“不精确”因素,但是我们认为这不会影响最终结果。于是我们将递归树变为T(n)=3T(⌊n/4⌋)+cn2T(n)=3T(⌊n/4⌋)+cn^2T(n)=3T(⌊n/4⌋)+cn2。为方便起见,我们还假定nnn是444的幂。这里又引入了一个“不精确”因素,但我们同样认为这不会影响最终结果。现在可以创建递归树,如下图所示。
  
  可以看到,递归树每下降一层,子问题规模减少为上一层的1/41/41/4,因此深度为iii的结点,其子问题的规模为n/4in/4^in/4i。当到达叶结点时,子问题规模减为111。假设叶结点深度为kkk,那么有n/4k=1n/4^k = 1n/4k=1,得到k=log4nk={\rm log}_4nk=log4​n。所以叶结点深度为log4n{\rm log}_4nlog4​n,这也说明整棵递归树的高度为log4n{\rm log}_4nlog4​n。
  现在统计递归树每一层的代价。对深度为iii的非叶结点来说,每一个结点对应一个规模为n/4in/4^in/4i的子问题,每个子问题产生代价c(n/4i)2=cn2/16ic(n/4^i)^2 = cn^2/16^ic(n/4i)2=cn2/16i。从递归树可以看到,递归树每下降一层,结点数目变为上一层的333倍,因此深度为iii的结点一共有3i3^i3i个。于是可以得到,除叶结点那一层外,深度为iii的那一层的结点代价之和为3i•(cn2/16i)=(3/16)icn23^i•(cn^2/16^i) = (3/16)^icn^23i•(cn2/16i)=(3/16)icn2。
  现在考虑叶结点。一个叶结点对应规模为111的子问题,它产生的代价为T(1)T(1)T(1)。通常来说,T(1)T(1)T(1)为常数时间,即T(1)=Θ(1)T(1) = Θ(1)T(1)=Θ(1)。叶结点一共有3log4n=nlog433^{{\rm log}_4n}=n^{{\rm log}_43}3log4​n=nlog4​3个,所以叶结点那一层的代价为nlog43•T(1)=Θ(nlog43)n^{{\rm log}_43}•T(1)=Θ(n^{{\rm log}_43})nlog4​3•T(1)=Θ(nlog4​3)。
  现在将递归树每一层代价加起来,得到递归树的总代价为
  
  这样,对原始递归式T(n)=3T(⌊n/4⌋)+Θ(n2)T(n)=3T(⌊n/4⌋)+Θ(n^2)T(n)=3T(⌊n/4⌋)+Θ(n2),我们得到了一个猜测解T(n)=O(n2)T(n)=O(n^2)T(n)=O(n2)。由于根结点对总代价的贡献为cn2cn^2cn2,所以根结点的代价支配了整棵递归树的总代价。
  现在用代入法对猜测解进行验证。我们要证明的是:存在正常数ddd,使得T(n)≤dn2T(n) ≤ dn^2T(n)≤dn2对足够大的nnn都成立。将T(n)≤dn2T(n) ≤ dn^2T(n)≤dn2代入递归式得到
  
  当d≥1613cd ≥ \frac{16}{13}cd≥1316​c时,不等式316dn2+cn2≤dn2\frac{3}{16}dn^2+cn^2≤dn^2163​dn2+cn2≤dn2成立,此时T(n)≤dn2T(n) ≤ dn^2T(n)≤dn2成立。因此T(n)=O(n2)T(n)=O(n^2)T(n)=O(n2)得证。
  现在考察一个更复杂的递归式T(n)=T(n/3)+T(2n/3)+O(n)T(n)=T(n/3)+T(2n/3)+O(n)T(n)=T(n/3)+T(2n/3)+O(n)。与之前一样,将渐近项O(n)O(n)O(n)替换为代数式cncncn,递归式变为T(n)=T(n/3)+T(2n/3)+cnT(n)=T(n/3)+T(2n/3)+cnT(n)=T(n/3)+T(2n/3)+cn。现在创建递归树,如下图所示。
  
  由于每个结点的左右孩子的规模不一样,这意味着每个结点的左右子树的高度不一样,右子树比左子树要高,因此这棵树并不是一棵满二叉树。从根结点到叶结点的最长简单路径是n→(2/3)n→(2/3)2n→…→1n → (2/3)n → (2/3)^2n → … → 1n→(2/3)n→(2/3)2n→…→1。假设树的高度为hhh,那么有(2/3)h•n=1(2/3)^h•n = 1(2/3)h•n=1,得到h=log3/2nh={\rm log}_{3/2}nh=log3/2​n。
  在上图中,我们只画出了递归树的顶部几层,可以看到每层的代价都为cncncn。然而由于递归树并不是一棵满二叉树,所以并不是每层的代价都为cncncn。随着递归树的层级越往下降,缺失的结点会越来多,这些存在缺失结点的层级的代价小于cncncn。只有递归树靠顶部的那些不存在缺失结点的层级,它们的代价等于cncncn。由于我们只需要通过递归树获得一个猜测解,所以我们不考虑这些缺失结点的影响,于是我们猜测解为T(n)=O(cn•log3/2n)=O(nlgn)T(n)=O(cn•{\rm log}_{3/2}n)=O(n{\rm lg}n)T(n)=O(cn•log3/2​n)=O(nlgn)。注意,这里又引入了另一种形式的“不精确”因素。
  现在用代入法对猜测解进行验证。我们要证明的是:存在正常数ddd,使得T(n)≤dnlgnT(n) ≤ dn{\rm lg}nT(n)≤dnlgn对足够大的nnn都成立。将T(n)≤dnlgnT(n) ≤ dn{\rm lg}nT(n)≤dnlgn代入递归式得到
  
  只要取d≥clg3−2/3d≥\frac{c}{{\rm lg}3-2/3}d≥lg3−2/3c​,就能使得不等式dnlgn−dn(lg3−23)+cn≤dnlgndn{\rm lg}n-dn({\rm lg}3-\frac{2}{3})+cn≤dn{\rm lg}ndnlgn−dn(lg3−32​)+cn≤dnlgn成立,此时T(n)≤dnlgnT(n)≤dn{\rm lg}nT(n)≤dnlgn成立。因此T(n)=O(nlgn)T(n)=O(n{\rm lg}n)T(n)=O(nlgn)得证。

练习

4.4-1 对递归式T(n)=3T(⌊n/2⌋)+nT(n)=3T(⌊n/2⌋)+nT(n)=3T(⌊n/2⌋)+n,利用递归树确定一个好的渐近上界,用代入法进行验证。
  
  创建递归树,如下图所示。
  
  在递归树中,深度为iii的结点对应规模为n/2in/2^in/2i的子问题。当n/2i=1n/2^i = 1n/2i=1时,即i=lgni = {\rm lg}ni=lgn时,子问题规模变为111,这对应于叶结点T(1)T(1)T(1),因此树的高度h=lgnh = {\rm lg}nh=lgn。
  每层的结点数都是上一层的333倍,因此深度为iii的结点数为3i3^i3i。深度为iii的结点对应的子问题规模为n/2in/2^in/2i,除叶结点外,深度为iii的每个结点的代价为n/2in/2^in/2i。因此,除叶结点外,深度为iii的所有结点的代价为3i•(n/2i)=(3/2)in3^i•(n/2^i )=(3/2)^in3i•(n/2i)=(3/2)in。叶结点一共有3lgn=nlg33^{{\rm lg}n}=n^{{\rm lg}3}3lgn=nlg3个,所以叶结点那一层的代价为Θ(nlg3)Θ(n^{{\rm lg}3})Θ(nlg3)。
  现在将每一层的代价加起来,得到
  
  下面用代入法验证这一结果。在做归纳假设时,需要减去一个低阶项,才能顺利完成证明。于是我们要证明的是:存在正常数ccc和ddd,使得T(n)≤cnlg3−dnT(n)≤cn^{{\rm lg}3}-dnT(n)≤cnlg3−dn对足够大的n都成立。
  取初始情况T(1)=1T(1) = 1T(1)=1。只要取c≥d+1c ≥ d + 1c≥d+1,就能使得T(1)≤c•1lg3−d•1=c−dT(1) ≤ c•1^{{\rm lg}3} − d•1 = c − dT(1)≤c•1lg3−d•1=c−d成立。
  现在考虑n≥2n ≥ 2n≥2的情况。假设T(n)≤cnlg3−dnT(n)≤cn^{{\rm lg}3}-dnT(n)≤cnlg3−dn对1,2,…,n−11, 2, …, n−11,2,…,n−1都成立,于是有
  T(n)=3T(⌊n/2⌋)+n≤3c(n2)lg3−3d•n2+n=cnlg3−(32d−1)nT(n)=3T(⌊n/2⌋)+n≤3c(\frac{n}{2})^{{\rm lg}3}-3d•\frac{n}{2}+n=cn^{{\rm lg}3}-(\frac{3}{2}d-1)nT(n)=3T(⌊n/2⌋)+n≤3c(2n​)lg3−3d•2n​+n=cnlg3−(23​d−1)n
  现在要选取合适的ccc和ddd,使得不等式cnlg3−(32d−1)n≤cnlg3−dncn^{{\rm lg}3}-(\frac{3}{2}d-1)n≤cn^{{\rm lg}3}-dncnlg3−(23​d−1)n≤cnlg3−dn成立。对该不等式做一下变换。
  cnlg3−(32d−1)n≤cnlg3−dncn^{{\rm lg}3}-(\frac{3}{2}d-1)n≤cn^{{\rm lg}3}-dncnlg3−(23​d−1)n≤cnlg3−dn  ⇔  (32d−1)n≥dn(\frac{3}{2}d-1)n≥dn(23​d−1)n≥dn  ⇔  d≥2d≥2d≥2
  因此,只要取d≥2d ≥ 2d≥2,并且ccc取任意值,就能使能不等式cnlg3−(32d−1)n≤cnlg3−dncn^{{\rm lg}3}-(\frac{3}{2}d-1)n≤cn^{{\rm lg}3}-dncnlg3−(23​d−1)n≤cnlg3−dn成立,此时T(n)≤cnlg3−dnT(n)≤cn^{{\rm lg}3}-dnT(n)≤cnlg3−dn成立。
  综合考虑初始情况T(1)T(1)T(1),我们最终要取d≥2d ≥ 2d≥2并且c≥d+1c ≥ d + 1c≥d+1。于是T(n)=O(nlg3)T(n)=O(n^{{\rm lg}3})T(n)=O(nlg3)得证。

4.4-2 对递归式T(n)=T(n/2)+n2T(n)=T(n/2)+n^2T(n)=T(n/2)+n2,利用递归树确定一个好的渐近上界,用代入法进行验证。
  
  创建递归树,如下图所示。  
  
  在递归树中,深度为iii的结点对应规模为n/2in/2^in/2i的子问题。当n/2i=1n/2^i = 1n/2i=1时,即i=lgni = {\rm lg}ni=lgn时,子问题规模变为111,这对应于叶结点T(1)T(1)T(1),因此树的高度h=lgnh = {\rm lg}nh=lgn。
  每层只有一个结点。除叶结点外,深度为iii的结点的代价为(n/2i)2=n2/4i(n/2^i)^2 = n^2/4^i(n/2i)2=n2/4i。叶结点的代价为T(1)=Θ(1)T(1) = Θ(1)T(1)=Θ(1)。现在将每一层的代价加起来,得到
  
  用代入法验证这一结果比较简单,这里省略具体过程。
  
4.4-3 对递归式T(n)=4T(n/2+2)+nT(n)=4T(n/2+2)+nT(n)=4T(n/2+2)+n,利用递归树确定一个好的渐近上界,用代入法进行验证。
  
  直接对递归式T(n)=4T(n/2+2)+nT(n)=4T(n/2+2)+nT(n)=4T(n/2+2)+n创建递归树很困难。将递归式变换为T(n)=4T(n/2)+nT(n)=4T(n/2)+nT(n)=4T(n/2)+n,因为当nnn足够大时n/2+2n/2+2n/2+2和n/2n/2n/2很接近,我们预计这样做不会影响最终结果。现在创建递归树,如下图所示。
  
  在递归树中,深度为iii的结点对应规模为n/2in/2^in/2i的子问题。当n/2i=1n/2^i = 1n/2i=1时,即i=lgni = {\rm lg}ni=lgn时,子问题规模变为111,这对应于叶结点T(1)T(1)T(1),因此树的高度h=lgnh = {\rm lg}nh=lgn。
  每层的结点数都是上一层的444倍,因此深度为iii的结点数为4i4^i4i。深度为iii的结点对应的子问题规模为n/2in/2^in/2i,除叶结点外,深度为iii的每个结点的代价为n/2in/2^in/2i。因此,除叶结点外,深度为iii的所有结点的代价为4i•(n/2i)=2i•n4^i•(n/2^i)=2^i•n4i•(n/2i)=2i•n。叶结点一共有4lgn=n24^{{\rm lg}n}=n^24lgn=n2个,所以叶结点那一层的代价为Θ(n2)Θ(n^2)Θ(n2)。
  现在将每一层的代价加起来,得到
  
  下面用代入法验证这一结果。我们没有办法直接证明T(n)≤cn2T(n)≤cn^2T(n)≤cn2,不妨证明:存在正常数ccc和ddd,使得T(n)≤c(n−4)2−d(n−4)T(n)≤c(n-4)^2-d(n-4)T(n)≤c(n−4)2−d(n−4)对足够大的nnn都成立。
  要使原递归式T(n)=4T(n/2+2)+nT(n)=4T(n/2+2)+nT(n)=4T(n/2+2)+n有意义,必须有n>n/2+2n > n/2 + 2n>n/2+2,得到n>4n > 4n>4,即n≥5n ≥ 5n≥5。所以取初始情况T(5)=1T(5) = 1T(5)=1。只要取c≥d+1c ≥ d + 1c≥d+1,就能使得T(5)≤c•(5−4)2−d•(5−4)=c−dT(5) ≤ c•(5−4)^2 − d•(5−4) = c − dT(5)≤c•(5−4)2−d•(5−4)=c−d成立。
  现在考虑n≥6n ≥ 6n≥6的情况。假设T(n)≤c(n−4)2−d(n−4)T(n)≤c(n-4)^2-d(n-4)T(n)≤c(n−4)2−d(n−4)对5,6,…,n−15, 6, …, n−15,6,…,n−1都成立,于是有
  
  现在要选取合适的ccc和ddd,使得不等式c(n−4)2−d(2n−8)+n≤c(n−4)2−d(n−4)c(n-4)^2-d(2n-8)+n≤c(n-4)^2-d(n-4)c(n−4)2−d(2n−8)+n≤c(n−4)2−d(n−4)成立。对这个不等式做一下变换。
  
  当n≥6n ≥ 6n≥6时,1/(1−4/n)1/(1-4/n)1/(1−4/n)是单调递减的,并且在n=6n = 6n=6时取得最大值为333。因此,只要取d≥3d ≥ 3d≥3,就能使得不等式c(n−4)2−d(2n−8)+n≤c(n−4)2−d(n−4)c(n-4)^2-d(2n-8)+n≤c(n-4)^2-d(n-4)c(n−4)2−d(2n−8)+n≤c(n−4)2−d(n−4)成立,此时T(n)≤c(n−4)2−d(n−4)T(n)≤c(n-4)^2-d(n-4)T(n)≤c(n−4)2−d(n−4)成立。
  综合考虑初始情况T(5)T(5)T(5),我们最终要取d≥3d ≥ 3d≥3并且c≥d+1c ≥ d + 1c≥d+1。于是T(n)=O(n2)T(n)=O(n^2)T(n)=O(n2)得证。

4.4-4 对递归式T(n)=2T(n−1)+1T(n)=2T(n-1)+1T(n)=2T(n−1)+1,利用递归树确定一个好的渐近上界,用代入法进行验证。
  
  创建递归树,如下图所示。
  
  在递归树中,深度为iii的结点对应规模为n−in − in−i的子问题。当n−i=1n − i = 1n−i=1时,即i=n−1i = n − 1i=n−1时,子问题规模变为111,这对应于叶结点T(1)T(1)T(1),因此树的高度h=n−1h = n − 1h=n−1。
  每层的结点数都是上一层的222倍,因此深度为iii的结点数为2i2^i2i。除叶结点外,每个结点的代价都为111。因此,除叶结点外,深度为i的所有结点的代价为2i•1=2i2^i•1=2^i2i•1=2i。叶结点一共有2n−12^{n-1}2n−1个,所以叶结点那一层的代价为Θ(2n)Θ(2^n)Θ(2n)。
  现在将每一层的代价加起来,得到
  
  下面用代入法验证这一结果。在做归纳假设时,需要减去一个低阶项,才能顺利完成证明。我们要证明的是:存在正常数ccc和ddd,使得T(n)≤c•2n−dT(n)≤c•2^n-dT(n)≤c•2n−d对足够大的nnn都成立。
  取初始情况T(1)=1T(1) = 1T(1)=1。只要取c≥(d+1)/2c ≥ (d+1)/2c≥(d+1)/2,就能使得T(1)≤c•21–d=2c–dT(1) ≤ c•2^1 – d = 2c – dT(1)≤c•21–d=2c–d成立。
  现在考虑n≥2n ≥ 2n≥2的情况。假设T(n)≤c•2n−dT(n)≤c•2^n-dT(n)≤c•2n−d对1,2,…,n−11, 2, …, n−11,2,…,n−1都成立,于是有
  T(n)=2T(n−1)+1≤2c•2n−1−2d+1=c•2n−2d+1T(n)=2T(n-1)+1≤2c•2^{n-1}-2d+1=c•2^n-2d+1T(n)=2T(n−1)+1≤2c•2n−1−2d+1=c•2n−2d+1
  只要取d≥1d ≥ 1d≥1,就能使得c•2n−2d+1≤c•2n−dc•2^n-2d+1≤c•2^n-dc•2n−2d+1≤c•2n−d成立,此时T(n)≤c•2n−dT(n)≤c•2^n-dT(n)≤c•2n−d成立。
  综合考虑初始情况T(1)T(1)T(1),我们最终要取d≥1d ≥ 1d≥1并且c≥(d+1)/2c ≥ (d+1)/2c≥(d+1)/2。于是T(n)=O(2n)T(n)=O(2^n)T(n)=O(2n)得证。

4.4-5 对递归式T(n)=T(n−1)+T(n/2)+nT(n)=T(n-1)+T(n/2)+nT(n)=T(n−1)+T(n/2)+n,利用递归树确定一个好的渐近上界,用代入法进行验证。
  
  创建递归树,如下图所示。
  
  该递归树显然不是一棵满二叉树。从根结点到叶结点的最短简单路径是n→n/2→n/4→…→1n → n/2 → n/4 → … → 1n→n/2→n/4→…→1。假设这一最短简单路径上叶结点深度为kkk,那么有(1/2)k•n=1(1/2)k•n = 1(1/2)k•n=1,得到k=lgnk={\rm lg}nk=lgn。从根结点到叶结点的最短简单路径是n→n−1→n−2→…→1n → n−1 → n−2 → … → 1n→n−1→n−2→…→1。假设这一最短简单路径上叶结点深度为lll,那么有n−l=1n − l = 1n−l=1,得到l=n−1l=n-1l=n−1。
  从递归树可以看到,第i层的代价为(3/2)i•n–e(3/2)^i•n – e(3/2)i•n–e,其中eee为低阶项。我们要确定T(n)T(n)T(n)的渐近上界,为方便起见,忽略每一层代价中的低阶项eee,统计第000层到第n−1n − 1n−1层的代价之和,得到
  
  当nnn足够大时,有2•(3/2)n•n<2n2•(3/2)^n•n<2^n2•(3/2)n•n<2n,因此得到T(n)=O(2n)T(n) = O(2^n)T(n)=O(2n)。
  下面用代入法验证这一结果。在做归纳假设时,需要减去一个低阶项,才能顺利完成证明。我们要证明的是:存在正常数ccc和ddd,使得T(n)≤c•2n−dnT(n)≤c•2^n-dnT(n)≤c•2n−dn对足够大的n都成立。
  取初始情况T(1)=1T(1) = 1T(1)=1。只要取c≥(d+1)/2c ≥ (d+1)/2c≥(d+1)/2,就能使得T(1)≤c•21–d•1=2c–dT(1) ≤ c•2^1 – d•1 = 2c – dT(1)≤c•21–d•1=2c–d成立。
  现在考虑n≥2n ≥ 2n≥2的情况。假设T(n)≤c•2n−dnT(n)≤c•2^n-dnT(n)≤c•2n−dn对1,2,…,n−11, 2, …, n−11,2,…,n−1都成立,于是有
  
  现在要选取合适的ccc和ddd,使得不等式c•2n−(3d2−1)n≤c•2n−dnc•2^n-(\frac{3d}{2}-1)n≤c•2^n-dnc•2n−(23d​−1)n≤c•2n−dn成立。对该不等式做一下变换。
  
  显然,只要取d≥2d ≥ 2d≥2,就能使得c•2n−(3d2−1)n≤c•2n−dnc•2^n-(\frac{3d}{2}-1)n≤c•2^n-dnc•2n−(23d​−1)n≤c•2n−dn成立,此时T(n)≤c•2n−dnT(n)≤c•2^n-dnT(n)≤c•2n−dn成立。
  综合考虑初始情况T(1)T(1)T(1),我们最终要取d≥2d ≥ 2d≥2并且c≥(d+1)/2c ≥ (d+1)/2c≥(d+1)/2。于是T(n)=O(2n)T(n)=O(2^n)T(n)=O(2n)得证。

4.4-6 对递归式T(n)=T(n/3)+T(2n/3)+cnT(n)=T(n/3)+T(2n/3)+cnT(n)=T(n/3)+T(2n/3)+cn,利用递归树论证其解为Ω(nlgn)Ω(n{\rm lg}n)Ω(nlgn),其中ccc为常数。
  
  创建递归树,如下图所示。
  
  由于每个结点的左右孩子的规模不一样,这意味着每个结的左右子树的高度不一样,右子树比左子树要高,因此这棵树并不是一棵满二叉树。从根结点到叶结点的最短简单路径是n→(1/3)n→(1/3)2n→…→1n → (1/3)n → (1/3)^2n → … → 1n→(1/3)n→(1/3)2n→…→1。假设这一最短简单路径上叶结点深度为kkk,那么有(1/3)k•n=1(1/3)^k•n = 1(1/3)k•n=1,得到k=log3nk={\rm log}_3nk=log3​n。这意味着递归树中第log3n{\rm log}_3nlog3​n层及以上的层级都是满的,这些层级的每一层的代价都为cncncn。
  我们求的是T(n)T(n)T(n)的渐近下界,因此可以只统计递归树中第log3n{\rm log}_3nlog3​n层及以上的层级的代价。于是得到
  
  用代入法验证这一结果比较简单,这里省略具体过程。

4.4-7 对递归式T(n)=4T(⌊n/2⌋)+cnT(n)=4T(⌊n/2⌋)+cnT(n)=4T(⌊n/2⌋)+cn(ccc为常数),画出递归树,并给出其解的一个渐近紧确界。用代入法进行验证。
  
  本题的递归树与练习4.4-3的递归树几乎一样,如下图所示。
  
  将每一层的代价加起来,得到
  
  下面用代入法验证这一结果。在做归纳假设时,需要减去一个低阶项,才能顺利完成证明。于是我们要证明的是:存在正常数d1d_1d1​、d2d_2d2​和eee,使得d1(n2−en)≤T(n)≤d2(n2−en)d_1(n^2-en)≤T(n)≤d_2(n^2-en)d1​(n2−en)≤T(n)≤d2​(n2−en)对足够大的nnn都成立。需要分两步证明。
  (1) 证明存在正常数d1d_1d1​和eee,使得T(n)≥d1(n2−en)T(n)≥d_1(n^2-en)T(n)≥d1​(n2−en)对足够大的n都成立
  取初始情况T(1)=1T(1) = 1T(1)=1。只要取d1≤1/(1−e)d_1 ≤ 1/(1−e)d1​≤1/(1−e)并且e<1e < 1e<1,就能使得T(1)≥d1(12−e•1)=d1(1−e)T(1) ≥ d_1(1^2 − e•1) = d_1(1 − e)T(1)≥d1​(12−e•1)=d1​(1−e)成立。
  现在考虑n≥2n ≥ 2n≥2的情况。假设T(n)≥d1(n2−en)T(n)≥d_1(n^2-en)T(n)≥d1​(n2−en)对1,2,…,n−11, 2, …, n−11,2,…,n−1都成立,于是有
  
  现在要选取合适的d1d_1d1​和eee,使得不等式d1(n2−2n+1−2en)+cn≥d1(n2−en)d_1(n^2-2n+1-2en)+cn≥d_1(n^2-en)d1​(n2−2n+1−2en)+cn≥d1​(n2−en)成立。对该不等式做一下变换。
  
  当n≥2n ≥ 2n≥2时,c(e+2)−1/n\frac{c}{(e+2)-1/n}(e+2)−1/nc​是单调递减的,并且在n=∞n = ∞n=∞时取得最小值为ce+2\frac{c}{e+2}e+2c​。因此,只要取d1≤ce+2d_1 ≤ \frac{c}{e+2}d1​≤e+2c​,就能使得不等式d1(n2−2n+1−2en)+cn≥d1(n2−en)d_1(n^2-2n+1-2en)+cn≥d_1(n^2-en)d1​(n2−2n+1−2en)+cn≥d1​(n2−en)成立,此时T(n)≥d1(n2−en)T(n)≥d_1(n^2-en)T(n)≥d1​(n2−en)成立。
  综合考虑初始情况T(1)T(1)T(1),我们最终要取e<1e < 1e<1并且d1≤min{11−e,ce+2}d_1 ≤ min\{\frac{1}{1−e}, \frac{c}{e+2}\}d1​≤min{1−e1​,e+2c​}。于是T(n)≥d1(n2−en)T(n)≥d_1(n^2-en)T(n)≥d1​(n2−en)得证。
  (2) 证明存在正常数d2d_2d2​和eee,使得T(n)≤d2(n2−en)T(n)≤d_2(n^2-en)T(n)≤d2​(n2−en)对足够大的nnn都成立
  取初始情况T(1)=1T(1) = 1T(1)=1。只要取d2≥1/(1−e)d_2 ≥ 1/(1−e)d2​≥1/(1−e)并且e<1e < 1e<1,就能使得T(1)≤d2(12−e•1)=d2(1−e)T(1) ≤ d_2(1^2 − e•1) = d_2(1 − e)T(1)≤d2​(12−e•1)=d2​(1−e)成立。
  现在考虑n≥2n ≥ 2n≥2的情况。假设T(n)≤d2(n2−en)T(n)≤d_2(n^2-en)T(n)≤d2​(n2−en)对1,2,…,n−11, 2, …, n−11,2,…,n−1都成立,于是有
  
  现在要选取合适的d2d_2d2​和eee,使得不等式d2(n2−2en)+cn≤d2(n2−en)d_2(n^2-2en)+cn≤d_2(n^2-en)d2​(n2−2en)+cn≤d2​(n2−en)成立。对该不等式做一下变换。
  
  因此,只要取d2≥c/ed_2 ≥ c/ed2​≥c/e,就能使能不等式d2(n2−2en)+cn≤d2(n2−en)d_2(n^2-2en)+cn≤d_2(n^2-en)d2​(n2−2en)+cn≤d2​(n2−en)成立,此时T(n)≤d2(n2−en)T(n)≤d_2(n^2-en)T(n)≤d2​(n2−en)成立。
  综合考虑初始情况T(1)T(1)T(1),我们最终要取e<1e < 1e<1并且d2≤max{11−e,ce}d_2 ≤ max\{\frac{1}{1−e}, \frac{c}{e}\}d2​≤max{1−e1​,ec​}。于是T(n)≤d2(n2−en)T(n)≤d_2(n^2-en)T(n)≤d2​(n2−en)得证。
  综合(1)和(2),只要取e<1e < 1e<1、d1≤min{11−e,ce+2}d_1 ≤ min\{\frac{1}{1−e}, \frac{c}{e+2}\}d1​≤min{1−e1​,e+2c​}并且d2≤max{11−e,ce}d_2 ≤ max\{\frac{1}{1−e}, \frac{c}{e}\}d2​≤max{1−e1​,ec​},就能使得d1(n2−en)≤T(n)≤d2(n2−en)d_1(n^2-en)≤T(n)≤d_2(n^2-en)d1​(n2−en)≤T(n)≤d2​(n2−en)成立。因此,T(n)=Θ(n2)T(n)=Θ(n^2)T(n)=Θ(n2)得证。

4.4-8 对递归式T(n)=T(n−a)+T(a)+cnT(n)=T(n-a)+T(a)+cnT(n)=T(n−a)+T(a)+cn,利用递归树给出一个渐近紧确解,其中a≥1a ≥ 1a≥1和c>0c > 0c>0是常数。
  
  创建递归树,如下图所示。
  
  在递归树中,每个结点均有222个孩子,其中右孩子都为T(a)T(a)T(a)。所以除根结点外,每一层都只有222个结点。深度为iii的结点其中一个对应规模为n−ain−ain−ai的子问题,另一个对应规模为aaa的子问题。当n−ai=an − ai = an−ai=a时,即i=(n/a)−1i = (n/a) − 1i=(n/a)−1时,子问题规模变为aaa,这对应于最底层的叶结点T(a)T(a)T(a),因此树的高度h=(n/a)−1h = (n/a) − 1h=(n/a)−1。
  除叶结点外,深度为iii的结点其中一个对应规模为n−ain−ain−ai的子问题,它的代价为c(n−ai)c(n−ai)c(n−ai);另一个对应规模为aaa的子问题,它的代价为T(a)T(a)T(a)。因此,除叶结点外,深度为iii的所有结点的代价为c(n−ai)+T(a)c(n−ai) + T(a)c(n−ai)+T(a)。叶结点一共有222个,所以叶结点那一层的代价为2T(a)2T(a)2T(a)。
  现在将每一层的代价加起来,得到
  
  
4.4-9 对递归式T(n)=T(αn)+T((1−α)n)+cnT(n)=T(αn)+T((1-α)n)+cnT(n)=T(αn)+T((1−α)n)+cn,利用递归树给出一个渐近紧确解,其中0<α<10 < α < 10<α<1和c>0c > 0c>0是常数。
  
  创建递归树,如下图所示。
  
  为方便起见,假设0<α≤1/20 < α ≤ 1/20<α≤1/2。1/2<α<11/2 < α < 11/2<α<1是对称的情况。从根结点到叶结点的最短简单路径是n→αn→α2n→…→1n → αn → α2n → … → 1n→αn→α2n→…→1。假设这一最短简单路径上叶结点深度为kkk,那么有αk•n=1α^k•n = 1αk•n=1,得到k=log1/αnk={\rm log}_{1/α}nk=log1/α​n。从根结点到叶结点的最短简单路径是n→(1−α)n→(1−α)2n→…→1n → (1−α)n → (1−α)2n → … → 1n→(1−α)n→(1−α)2n→…→1。假设这一最短简单路径上叶结点深度为lll,那么有(1−α)l•n=1(1−α)^l•n = 1(1−α)l•n=1,得到l=log1/(1−α)nl={\rm log}_{1/(1-α)} nl=log1/(1−α)​n。
  上图画出了递归树的顶部几层,顶部几层的代价都等于cncncn,严格来说,从根结点到第log1/αn{\rm log}_{1/α}nlog1/α​n层,每一层的代价都为cncncn。只统计根结点到第log1/αn{\rm log}_{1/α}nlog1/α​n层的代价,就可以得到T(n)T(n)T(n)的下界,于是有
  
  随着递归树层级往下降,缺失的内部结点越来越多,因此底部几层的代价都不超过cncncn。于是有
  
  综合以上分析,得到T(n)=Θ(nlgn)T(n) = Θ(n{\rm lg}n)T(n)=Θ(nlgn)。

算法导论 — 4.4 用递归树方法求解递归式相关推荐

  1. 用递归树方法求解递归式

    用递归树方法求解递归式 [备注:需要修改] 一个递归算法的递归式:T(n)=3T(n/4)+cn2T\left(n\right)=3T\left(n/4\right)+cn^2T(n)=3T(n/4) ...

  2. 第四章 分治策略 4.4 用递归树方法求解递归式

    4.4 用递归数方法求解递归式 一. 1.   在递归树中,每个结点表示一个单一子问题的代价,子问题对应某次递归函数调用.我们将树中每层中的代价求和,得到每层代价,然后将所有层的代价求和,得到所有层次 ...

  3. 【算法导论-主定理】用主方法求解递归式 学练结合版

    问题:若某算法的计算时间表示为递推关系式:T(N)=2T(N/2)+NlogN 且 T(1)=1 则该算法的时间复杂度为( ). O(Nsqrt(N)) O(NlogN) O(N(logN)^2) O ...

  4. 算法导论习题—主方法求渐进紧确界、递归树方法

    算法导论习题-主方法求渐进紧确界.递归树方法 4.5-1 a. T(n)=2T(n/4)+1T ( n ) = 2 T ( n / 4 ) + 1T(n)=2T(n/4)+1 b. T(n)=2T(n ...

  5. 笔试题:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。该题有三种解法:递归的方法求解斐波那契数列、用概率与统计的数学方法解决,3.动态规划

    笔试题 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法.该题有三种解法:1.递归的方法求解斐波那契数列.2.用概率与统计的数学方法解决,3.动态规划 ...

  6. 算法:递归(借助递归树来求解分析递归算法的时间复杂度)

    递归代码的时间复杂度分析起来非常麻烦,今天我们尝试来借助递归树分析递归算法的时间复杂度. 1. 递归树与时间复杂度分析 递归的思想就是将大问题一层一层地分解为小问题来求解,如果我们把这个分解过程画成图 ...

  7. 用递归和非递归的方法求解n的k次方

    递归的方法 #include<stdio.h>int my_power(int n,int k) {if (k-- > 1)n*=my_power(n, k);return n; } ...

  8. java 末级递归树_如何递归获取json里末级章节名称

    漂流的河 发布于 2016/01/26 10:56 阅读 326 收藏 0 这是我获取到的一个大JSON,里面有7个大章节,现在我要获取每个大章节里的末级章节名称,如何获取?递归吗? [{ " ...

  9. 《算法导论(原书第3版)》pdf

    下载地址:网盘下载 内容简介  · · · · · · 在有关算法的书中,有一些叙述非常严谨,但不够全面:另一些涉及了大量的题材,但又缺乏严谨性.本书将严谨性和全面性融为一体,深入讨论各类算法,并着力 ...

最新文章

  1. Java学习总结:7
  2. Spring boot属性松散绑定
  3. 标准C++中的string类的用法总结(转)
  4. 《TCP/IP详解》学习笔记(一):基本概念
  5. UI设计干货素材|教你正确使用浮动按钮
  6. python语言程序设计实践教程实验八答案_清华大学出版社-图书详情-《Java程序设计教程及实验指导》...
  7. HDOJ(HDU) 1563 Find your present!(异或)
  8. 六行shell脚本实现Android手机自动刷抖音极速版
  9. imx6ull linux 内核编译
  10. 知识图谱从0到-1的笔记——6.知识推理
  11. C#搞工控的一些代码
  12. Android 导出PDF PdfDocument
  13. 安全芯片的用途及新场景
  14. 中文乱码——编码问题
  15. 优先级倒挂(priority inversion)
  16. [Spark进阶]-- Spark Dataframe操作
  17. 浅显的谈谈证券公司的信息化
  18. 如何使用Createjs来编写HTML5游戏(二)使用EaselJS处理图片
  19. P****cms简单去版权,不逆向dll,只是简单的隐藏掉而已
  20. LTE调度算法(下行)

热门文章

  1. java动态心形程序_java swing实现动态心形图案的代码下载
  2. IDEA 一直卡在Buil(编译 write classes)报错资源不足
  3. 【Unity性能优化】静态资源优化——Audio优化
  4. 计算机专业考研上岸率,考研“寒冬年”?2020考研上岸几率到底有多大?
  5. LayUi集成下载Excel、word、PDF、CSV扩展
  6. web前端学习(三):微信小程序基于H5规范,开发Android应用程序
  7. NT Server无盘站配置技术详解
  8. Chrome Extension 介绍
  9. 云服务器体验——搭建简单私人网盘
  10. 模式识别基本概念小结(学习笔记)