算法导论 — 4.4 用递归树方法求解递归式

本文探讨了递归式求解的两种方法:代入法和递归树法。通过多个实例,详细解析了如何使用递归树法来猜测递归式的解,以及如何运用代入法验证解的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

笔记

在应用代入法求解递归式时,需要事先做出一个好的猜测。然而,有时候做出好的猜测是很困难的,此时可以考虑采用递归树方法。在递归树中,每个结点表示一个单一子问题的代价。创建递归树之后,对树的每层的各子问题的代价进行求和,得到每一层的代价,然后将所有层的代价加起来,得到整棵递归树的总代价,这个总代价就是递归式的解。当然,递归树方法是一种粗略的方法,因为递归树会引入一些“不精确”因素,这一点在后文再详细介绍。如果要精确求解递归式,还需要用代入法对递归树得到的解进行验证。
  以递归式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。为方便起见,我们还假定nnn444的幂。这里又引入了一个“不精确”因素,但我们同样认为这不会影响最终结果。现在可以创建递归树,如下图所示。
  在这里插入图片描述
  可以看到,递归树每下降一层,子问题规模减少为上一层的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=log4n。所以叶结点深度为log4n{\rm log}_4nlog4n,这也说明整棵递归树的高度为log4n{\rm log}_4nlog4n
  现在统计递归树每一层的代价。对深度为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}3log4n=nlog43个,所以叶结点那一层的代价为nlog43•T(1)=Θ(nlog43)n^{{\rm log}_43}•T(1)=Θ(n^{{\rm log}_43})nlog43T(1)=Θ(nlog43)
  现在将递归树每一层代价加起来,得到递归树的总代价为
  在这里插入图片描述
  这样,对原始递归式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}cd1316c时,不等式316dn2+cn2≤dn2\frac{3}{16}dn^2+cn^2≤dn^2163dn2+cn2dn2成立,此时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)2n1。假设树的高度为hhh,那么有(2/3)h•n=1(2/3)^h•n = 1(2/3)hn=1,得到h=log3/2nh={\rm log}_{3/2}nh=log3/2n
  在上图中,我们只画出了递归树的顶部几层,可以看到每层的代价都为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(cnlog3/2n)=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}dlg32/3c,就能使得不等式dnlgn−dn(lg3−23)+cn≤dnlgndn{\rm lg}n-dn({\rm lg}3-\frac{2}{3})+cn≤dn{\rm lg}ndnlgndn(lg332)+cndnlgn成立,此时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)
  现在将每一层的代价加起来,得到
  在这里插入图片描述
  下面用代入法验证这一结果。在做归纳假设时,需要减去一个低阶项,才能顺利完成证明。于是我们要证明的是:存在正常数cccddd,使得T(n)≤cnlg3−dnT(n)≤cn^{{\rm lg}3}-dnT(n)cnlg3dn对足够大的n都成立。
  取初始情况T(1)=1T(1) = 1T(1)=1。只要取c≥d+1c ≥ d + 1cd+1,就能使得T(1)≤c•1lg3−d•1=c−dT(1) ≤ c•1^{{\rm lg}3} − d•1 = c − dT(1)c1lg3d1=cd成立。
  现在考虑n≥2n ≥ 2n2的情况。假设T(n)≤cnlg3−dnT(n)≤cn^{{\rm lg}3}-dnT(n)cnlg3dn1,2,…,n−11, 2, …, n−11,2,,n1都成立,于是有
  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)+n3c(2n)lg33d2n+n=cnlg3(23d1)n
  现在要选取合适的cccddd,使得不等式cnlg3−(32d−1)n≤cnlg3−dncn^{{\rm lg}3}-(\frac{3}{2}d-1)n≤cn^{{\rm lg}3}-dncnlg3(23d1)ncnlg3dn成立。对该不等式做一下变换。
  cnlg3−(32d−1)n≤cnlg3−dncn^{{\rm lg}3}-(\frac{3}{2}d-1)n≤cn^{{\rm lg}3}-dncnlg3(23d1)ncnlg3dn  ⇔  (32d−1)n≥dn(\frac{3}{2}d-1)n≥dn(23d1)ndn  ⇔  d≥2d≥2d2
  因此,只要取d≥2d ≥ 2d2,并且ccc取任意值,就能使能不等式cnlg3−(32d−1)n≤cnlg3−dncn^{{\rm lg}3}-(\frac{3}{2}d-1)n≤cn^{{\rm lg}3}-dncnlg3(23d1)ncnlg3dn成立,此时T(n)≤cnlg3−dnT(n)≤cn^{{\rm lg}3}-dnT(n)cnlg3dn成立。
  综合考虑初始情况T(1)T(1)T(1),我们最终要取d≥2d ≥ 2d2并且c≥d+1c ≥ d + 1cd+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+2n/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)=2in。叶结点一共有4lgn=n24^{{\rm lg}n}=n^24lgn=n2个,所以叶结点那一层的代价为Θ(n2)Θ(n^2)Θ(n2)
  现在将每一层的代价加起来,得到
  在这里插入图片描述
  下面用代入法验证这一结果。我们没有办法直接证明T(n)≤cn2T(n)≤cn^2T(n)cn2,不妨证明:存在正常数cccddd,使得T(n)≤c(n−4)2−d(n−4)T(n)≤c(n-4)^2-d(n-4)T(n)c(n4)2d(n4)对足够大的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 ≥ 5n5。所以取初始情况T(5)=1T(5) = 1T(5)=1。只要取c≥d+1c ≥ d + 1cd+1,就能使得T(5)≤c•(5−4)2−d•(5−4)=c−dT(5) ≤ c•(5−4)^2 − d•(5−4) = c − dT(5)c(54)2d(54)=cd成立。
  现在考虑n≥6n ≥ 6n6的情况。假设T(n)≤c(n−4)2−d(n−4)T(n)≤c(n-4)^2-d(n-4)T(n)c(n4)2d(n4)5,6,…,n−15, 6, …, n−15,6,,n1都成立,于是有
  在这里插入图片描述
  现在要选取合适的cccddd,使得不等式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(n4)2d(2n8)+nc(n4)2d(n4)成立。对这个不等式做一下变换。
  在这里插入图片描述
  当n≥6n ≥ 6n6时,1/(1−4/n)1/(1-4/n)1/(14/n)是单调递减的,并且在n=6n = 6n=6时取得最大值为333。因此,只要取d≥3d ≥ 3d3,就能使得不等式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(n4)2d(2n8)+nc(n4)2d(n4)成立,此时T(n)≤c(n−4)2−d(n−4)T(n)≤c(n-4)^2-d(n-4)T(n)c(n4)2d(n4)成立。
  综合考虑初始情况T(5)T(5)T(5),我们最终要取d≥3d ≥ 3d3并且c≥d+1c ≥ d + 1cd+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(n1)+1,利用递归树确定一个好的渐近上界,用代入法进行验证。
  
  创建递归树,如下图所示。
  在这里插入图片描述
  在递归树中,深度为iii的结点对应规模为n−in − ini的子问题。当n−i=1n − i = 1ni=1时,即i=n−1i = n − 1i=n1时,子问题规模变为111,这对应于叶结点T(1)T(1)T(1),因此树的高度h=n−1h = n − 1h=n1
  每层的结点数都是上一层的222倍,因此深度为iii的结点数为2i2^i2i。除叶结点外,每个结点的代价都为111。因此,除叶结点外,深度为i的所有结点的代价为2i•1=2i2^i•1=2^i2i1=2i。叶结点一共有2n−12^{n-1}2n1个,所以叶结点那一层的代价为Θ(2n)Θ(2^n)Θ(2n)
  现在将每一层的代价加起来,得到
  在这里插入图片描述
  下面用代入法验证这一结果。在做归纳假设时,需要减去一个低阶项,才能顺利完成证明。我们要证明的是:存在正常数cccddd,使得T(n)≤c•2n−dT(n)≤c•2^n-dT(n)c2nd对足够大的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)c21d=2cd成立。
  现在考虑n≥2n ≥ 2n2的情况。假设T(n)≤c•2n−dT(n)≤c•2^n-dT(n)c2nd1,2,…,n−11, 2, …, n−11,2,,n1都成立,于是有
  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(n1)+12c2n12d+1=c2n2d+1
  只要取d≥1d ≥ 1d1,就能使得c•2n−2d+1≤c•2n−dc•2^n-2d+1≤c•2^n-dc2n2d+1c2nd成立,此时T(n)≤c•2n−dT(n)≤c•2^n-dT(n)c2nd成立。
  综合考虑初始情况T(1)T(1)T(1),我们最终要取d≥1d ≥ 1d1并且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(n1)+T(n/2)+n,利用递归树确定一个好的渐近上界,用代入法进行验证。
  
  创建递归树,如下图所示。
  在这里插入图片描述
  该递归树显然不是一棵满二叉树。从根结点到叶结点的最短简单路径是n→n/2→n/4→…→1n → n/2 → n/4 → … → 1nn/2n/41。假设这一最短简单路径上叶结点深度为kkk,那么有(1/2)k•n=1(1/2)k•n = 1(1/2)kn=1,得到k=lgnk={\rm lg}nk=lgn。从根结点到叶结点的最短简单路径是n→n−1→n−2→…→1n → n−1 → n−2 → … → 1nn1n21。假设这一最短简单路径上叶结点深度为lll,那么有n−l=1n − l = 1nl=1,得到l=n−1l=n-1l=n1
  从递归树可以看到,第i层的代价为(3/2)i•n–e(3/2)^i•n – e(3/2)ine,其中eee为低阶项。我们要确定T(n)T(n)T(n)的渐近上界,为方便起见,忽略每一层代价中的低阶项eee,统计第000层到第n−1n − 1n1层的代价之和,得到
  在这里插入图片描述
  当nnn足够大时,有2•(3/2)n•n<2n2•(3/2)^n•n<2^n2(3/2)nn<2n,因此得到T(n)=O(2n)T(n) = O(2^n)T(n)=O(2n)
  下面用代入法验证这一结果。在做归纳假设时,需要减去一个低阶项,才能顺利完成证明。我们要证明的是:存在正常数cccddd,使得T(n)≤c•2n−dnT(n)≤c•2^n-dnT(n)c2ndn对足够大的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)c21d1=2cd成立。
  现在考虑n≥2n ≥ 2n2的情况。假设T(n)≤c•2n−dnT(n)≤c•2^n-dnT(n)c2ndn1,2,…,n−11, 2, …, n−11,2,,n1都成立,于是有
  在这里插入图片描述
  现在要选取合适的cccddd,使得不等式c•2n−(3d2−1)n≤c•2n−dnc•2^n-(\frac{3d}{2}-1)n≤c•2^n-dnc2n(23d1)nc2ndn成立。对该不等式做一下变换。
  在这里插入图片描述
  显然,只要取d≥2d ≥ 2d2,就能使得c•2n−(3d2−1)n≤c•2n−dnc•2^n-(\frac{3d}{2}-1)n≤c•2^n-dnc2n(23d1)nc2ndn成立,此时T(n)≤c•2n−dnT(n)≤c•2^n-dnT(n)c2ndn成立。
  综合考虑初始情况T(1)T(1)T(1),我们最终要取d≥2d ≥ 2d2并且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)2n1。假设这一最短简单路径上叶结点深度为kkk,那么有(1/3)k•n=1(1/3)^k•n = 1(1/3)kn=1,得到k=log3nk={\rm log}_3nk=log3n。这意味着递归树中第log3n{\rm log}_3nlog3n层及以上的层级都是满的,这些层级的每一层的代价都为cncncn
  我们求的是T(n)T(n)T(n)的渐近下界,因此可以只统计递归树中第log3n{\rm log}_3nlog3n层及以上的层级的代价。于是得到
  在这里插入图片描述
  用代入法验证这一结果比较简单,这里省略具体过程。

4.4-7 对递归式T(n)=4T(⌊n/2⌋)+cnT(n)=4T(⌊n/2⌋)+cnT(n)=4T(n/2)+cnccc为常数),画出递归树,并给出其解的一个渐近紧确界。用代入法进行验证。
  
  本题的递归树与练习4.4-3的递归树几乎一样,如下图所示。
  在这里插入图片描述
  将每一层的代价加起来,得到
  在这里插入图片描述
  下面用代入法验证这一结果。在做归纳假设时,需要减去一个低阶项,才能顺利完成证明。于是我们要证明的是:存在正常数d1d_1d1d2d_2d2eee,使得d1(n2−en)≤T(n)≤d2(n2−en)d_1(n^2-en)≤T(n)≤d_2(n^2-en)d1(n2en)T(n)d2(n2en)对足够大的nnn都成立。需要分两步证明。
  (1) 证明存在正常数d1d_1d1eee,使得T(n)≥d1(n2−en)T(n)≥d_1(n^2-en)T(n)d1(n2en)对足够大的n都成立
  取初始情况T(1)=1T(1) = 1T(1)=1。只要取d1≤1/(1−e)d_1 ≤ 1/(1−e)d11/(1e)并且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(12e1)=d1(1e)成立。
  现在考虑n≥2n ≥ 2n2的情况。假设T(n)≥d1(n2−en)T(n)≥d_1(n^2-en)T(n)d1(n2en)1,2,…,n−11, 2, …, n−11,2,,n1都成立,于是有
  在这里插入图片描述
  现在要选取合适的d1d_1d1eee,使得不等式d1(n2−2n+1−2en)+cn≥d1(n2−en)d_1(n^2-2n+1-2en)+cn≥d_1(n^2-en)d1(n22n+12en)+cnd1(n2en)成立。对该不等式做一下变换。
  在这里插入图片描述
  当n≥2n ≥ 2n2时,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}d1e+2c,就能使得不等式d1(n2−2n+1−2en)+cn≥d1(n2−en)d_1(n^2-2n+1-2en)+cn≥d_1(n^2-en)d1(n22n+12en)+cnd1(n2en)成立,此时T(n)≥d1(n2−en)T(n)≥d_1(n^2-en)T(n)d1(n2en)成立。
  综合考虑初始情况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}\}d1min{1e1,e+2c}。于是T(n)≥d1(n2−en)T(n)≥d_1(n^2-en)T(n)d1(n2en)得证。
  (2) 证明存在正常数d2d_2d2eee,使得T(n)≤d2(n2−en)T(n)≤d_2(n^2-en)T(n)d2(n2en)对足够大的nnn都成立
  取初始情况T(1)=1T(1) = 1T(1)=1。只要取d2≥1/(1−e)d_2 ≥ 1/(1−e)d21/(1e)并且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(12e1)=d2(1e)成立。
  现在考虑n≥2n ≥ 2n2的情况。假设T(n)≤d2(n2−en)T(n)≤d_2(n^2-en)T(n)d2(n2en)1,2,…,n−11, 2, …, n−11,2,,n1都成立,于是有
  在这里插入图片描述
  现在要选取合适的d2d_2d2eee,使得不等式d2(n2−2en)+cn≤d2(n2−en)d_2(n^2-2en)+cn≤d_2(n^2-en)d2(n22en)+cnd2(n2en)成立。对该不等式做一下变换。
  在这里插入图片描述
  因此,只要取d2≥c/ed_2 ≥ c/ed2c/e,就能使能不等式d2(n2−2en)+cn≤d2(n2−en)d_2(n^2-2en)+cn≤d_2(n^2-en)d2(n22en)+cnd2(n2en)成立,此时T(n)≤d2(n2−en)T(n)≤d_2(n^2-en)T(n)d2(n2en)成立。
  综合考虑初始情况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}\}d2max{1e1,ec}。于是T(n)≤d2(n2−en)T(n)≤d_2(n^2-en)T(n)d2(n2en)得证。
  综合(1)和(2),只要取e<1e < 1e<1d1≤min{11−e,ce+2}d_1 ≤ min\{\frac{1}{1−e}, \frac{c}{e+2}\}d1min{1e1,e+2c}并且d2≤max{11−e,ce}d_2 ≤ max\{\frac{1}{1−e}, \frac{c}{e}\}d2max{1e1,ec},就能使得d1(n2−en)≤T(n)≤d2(n2−en)d_1(n^2-en)≤T(n)≤d_2(n^2-en)d1(n2en)T(n)d2(n2en)成立。因此,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(na)+T(a)+cn,利用递归树给出一个渐近紧确解,其中a≥1a ≥ 1a1c>0c > 0c>0是常数。
  
  创建递归树,如下图所示。
  在这里插入图片描述
  在递归树中,每个结点均有222个孩子,其中右孩子都为T(a)T(a)T(a)。所以除根结点外,每一层都只有222个结点。深度为iii的结点其中一个对应规模为n−ain−ainai的子问题,另一个对应规模为aaa的子问题。当n−ai=an − ai = anai=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−ainai的子问题,它的代价为c(n−ai)c(n−ai)c(nai);另一个对应规模为aaa的子问题,它的代价为T(a)T(a)T(a)。因此,除叶结点外,深度为iii的所有结点的代价为c(n−ai)+T(a)c(n−ai) + T(a)c(nai)+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<α<1c>0c > 0c>0是常数。
  
  创建递归树,如下图所示。
  在这里插入图片描述
  为方便起见,假设0<α≤1/20 < α ≤ 1/20<α1/21/2<α<11/2 < α < 11/2<α<1是对称的情况。从根结点到叶结点的最短简单路径是n→αn→α2n→…→1n → αn → α2n → … → 1nαnα2n1。假设这一最短简单路径上叶结点深度为kkk,那么有αk•n=1α^k•n = 1αkn=1,得到k=log1/αnk={\rm log}_{1/α}nk=log1/αn。从根结点到叶结点的最短简单路径是n→(1−α)n→(1−α)2n→…→1n → (1−α)n → (1−α)2n → … → 1n(1α)n(1α)2n1。假设这一最短简单路径上叶结点深度为lll,那么有(1−α)l•n=1(1−α)^l•n = 1(1α)ln=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)

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值