算法导论 — 4.3 用代入法求解递归式

笔记

代入法求解递归式分为两步:
  1) 猜测解的形式。
  2) 用数学归纳法证明猜测的解是正确的。
  例如,我们要确定递归式 T ( n ) = 2 T ( ⌊ n / 2 ⌋ ) + n T(n)=2T(⌊n/2⌋)+n T(n)=2T(n/2)+n的上界。我们猜测其解为 T ( n ) = O ( n l g n ) T(n) = O(n{\rm lg}n) T(n)=O(nlgn),这意味着存在正常数 c c c n 0 n_0 n0,使得 T ( n ) ≤ c n l g n T(n) ≤ cn{\rm lg}n T(n)cnlgn对所有 n ≥ n 0 n ≥ n_0 nn0都成立。现在用数学归纳法来证明。
  为方便起见,取递归式的初始情况 T ( 1 ) = 1 T(1) = 1 T(1)=1。应用数学归纳法时,我们很自然地想到取初始情况为 T ( 1 ) T(1) T(1)。然而,这样做有问题。因为论正常数 c c c为多少, T ( 1 ) ≤ c • 1 • l g 1 = 0 T(1) ≤ c•1•{\rm lg}1 = 0 T(1)c1lg1=0都不成立。因此 T ( 1 ) T(1) T(1)虽然是递归式的初始情况,但是不能作为归纳证明的初始情况,这一点请注意。
  我们观察到,当 n > 3 n > 3 n>3时,递归式就不直接依赖于 T ( 1 ) T(1) T(1)了,所以我们取 T ( 2 ) T(2) T(2) T ( 3 ) T(3) T(3)作为初始情况,这样后续的归纳证明不会依赖于 T ( 1 ) T(1) T(1)。根据递归式可以得到 T ( 2 ) = 2 T ( 1 ) + 2 = 4 T(2) = 2T(1) + 2 = 4 T(2)=2T(1)+2=4 T ( 3 ) = 2 T ( 1 ) + 3 = 5 T(3) = 2T(1) + 3 = 5 T(3)=2T(1)+3=5。于是得到两个不等式 T ( 2 ) ≤ c • 2 • l g 2 T(2) ≤ c•2•{\rm lg}2 T(2)c2lg2 T ( 3 ) ≤ c • 3 • l g 3 T(3) ≤ c•3•{\rm lg}3 T(3)c3lg3。只要取任意 c ≥ 2 c ≥ 2 c2就可以使这两个不等式成立。因此, T ( n ) = O ( n l g n ) T(n) = O(n{\rm lg}n) T(n)=O(nlgn)对初始情况 T ( 2 ) T(2) T(2) T ( 3 ) T(3) T(3)都是成立的。
  确定好初始情况之后,下面进入归纳过程。假设 T ( n ) = O ( n l g n ) T(n) = O(n{\rm lg}n) T(n)=O(nlgn)对所有 T ( 2 ) , T ( 3 ) , … , T ( n − 1 ) T(2), T(3), …, T(n−1) T(2),T(3),,T(n1)都成立,现在递归求解 T ( n ) T(n) T(n)
     T ( n ) = 2 T ( ⌊ n / 2 ⌋ ) + n ≤ 2 c ⌊ n / 2 ⌋ l g ( ⌊ n / 2 ⌋ ) + n ≤ c n l g ( n / 2 ) + n = c n l g n − c n + n T(n)=2T(⌊n/2⌋)+n≤2c⌊n/2⌋{\rm lg}(⌊n/2⌋)+n≤cn{\rm lg}(n/2)+n=cn{\rm lg}n-cn+n T(n)=2T(n/2)+n2cn/2lg(n/2)+ncnlg(n/2)+n=cnlgncn+n
  只要取任意 c ≥ 1 c ≥ 1 c1,都能使得 T ( n ) ≤ c n l g n − c n + n ≤ c n l g n T(n)≤cn{\rm lg}n-cn+n≤cn{\rm lg}n T(n)cnlgncn+ncnlgn成立。
  综上所述,只要选取任意 c ≥ 2 c ≥ 2 c2,并且选取 n 0 = 2 n_0 = 2 n0=2,就能使得 T ( n ) ≤ c n l g n T(n) ≤ cn{\rm lg}n T(n)cnlgn对所有 n ≥ n 0 n ≥ n_0 nn0都成立。因此,递归式 T ( n ) = 2 T ( ⌊ n / 2 ⌋ ) + n T(n)=2T(⌊n/2⌋)+n T(n)=2T(n/2)+n的上界为 O ( n l g n ) O(n{\rm lg}n) O(nlgn)
  通常,我们需要凭经验来猜测递归式的解。如果遇到一个递归式与之前遇到过的递归式相似,那么可以猜测一个类似的解。比如有递归式 T ( n ) = 2 T ( ⌊ n / 2 ⌋ + 17 ) + n T(n)=2T(⌊n/2⌋+17)+n T(n)=2T(n/2+17)+n。当 n n n较大时,⌊n/2⌋与⌊n/2⌋+17相差不大,都是接近 n n n的一半。因此完全可以猜测 T ( n ) = O ( n l g n ) T(n) = O(n{\rm lg}n) T(n)=O(nlgn)
  在有些时候,我们猜测出来的解可能无法用数学归纳法证明。比如要求解递归式 T ( n ) = T ( ⌊ n / 2 ⌋ ) + T ( ⌈ n / 2 ⌉ ) + 1 T(n)=T(⌊n/2⌋)+T(⌈n/2⌉)+1 T(n)=T(n/2)+T(n/2)+1。我们猜测其解为 T ( n ) = O ( n ) T(n) = O(n) T(n)=O(n)。现在要证明存在正常数 c c c,使得 T ( n ) ≤ c n T(n) ≤ cn T(n)cn对足够大的 n n n都成立。我们将猜测的解代入递归式,得到
     T ( n ) = T ( ⌊ n / 2 ⌋ ) + T ( ⌈ n / 2 ⌉ ) + 1 ≤ c ⌊ n / 2 ⌋ + c ⌈ n / 2 ⌉ + 1 = c n + 1 T(n)=T(⌊n/2⌋)+T(⌈n/2⌉)+1≤c⌊n/2⌋+c⌈n/2⌉+1=cn+1 T(n)=T(n/2)+T(n/2)+1cn/2+cn/2+1=cn+1
  显然,无论正常数 c c c取何值,都无法满足 T ( n ) ≤ c n T(n) ≤ cn T(n)cn,归纳证明失败。当然,在这种情况下,我们接下来可能要猜测一个更大的界,比如 T ( n ) = O ( n 2 ) T(n) = O(n^2) T(n)=O(n2)。然而经验告诉我们,原来猜测的 T ( n ) = O ( n ) T(n) = O(n) T(n)=O(n)是正确的,为了证明它的正确,我们要对归纳假设做出调整,减去一个低阶项,由 T ( n ) ≤ c n T(n) ≤ cn T(n)cn变为 T ( n ) ≤ c n – d T(n) ≤ cn–d T(n)cnd,其中 d d d是大于或等于 0 0 0的一个常数。现在将新的归纳假设代入递归式,得到
     T ( n ) ≤ c ⌊ n / 2 ⌋ − d + c ⌈ n / 2 ⌉ − d + 1 = c n − 2 d + 1 T(n)≤c⌊n/2⌋-d+c⌈n/2⌉-d+1=cn-2d+1 T(n)cn/2d+cn/2d+1=cn2d+1
  只要取 d ≥ 1 d ≥ 1 d1,就可以使得不等式 c n − 2 d + 1 ≤ c n − d cn-2d+1≤cn-d cn2d+1cnd成立,此时 T ( n ) ≤ c n − d T(n)≤cn-d T(n)cnd成立。可以看到,调整归纳假设之后,归纳证明可以顺利进行。
  另外有些时候,我们直接猜测递归式的解很困难,这时可以将递归式做一下变换,变换为我们熟悉的递归式。比如有递归式 T ( n ) = 2 T ( n ) + l g n T(n)=2T(\sqrt{n})+{\rm lg}n T(n)=2T(n )+lgn,我们完全猜测不出它的解是什么样的。现在我们对递归式做一下变换。令 m = l g n m = {\rm lg}n m=lgn,于是 n = 2 m n = 2^m n=2m,代入递归式得到 T ( 2 m ) = 2 T ( 2 m / 2 ) + m T(2^m )=2T(2^{m/2})+m T(2m)=2T(2m/2)+m。现在重新命名 S ( m ) = T ( 2 m ) S(m)=T(2^m) S(m)=T(2m),于是得到新的递归式 S ( m ) = 2 S ( m / 2 ) + m S(m)=2S(m/2)+m S(m)=2S(m/2)+m。这个新的递归式我们非常熟悉,它的解为 S ( m ) = O ( m l g m ) S(m) = O(m{\rm lg}m) S(m)=O(mlgm)。再从 S ( m ) S(m) S(m)转换回 T ( n ) T(n) T(n),得到 T ( n ) = T ( 2 m ) = S ( m ) = O ( m l g m ) = O ( l g n l g l g n ) T(n) = T(2^m) = S(m) = O(m{\rm lg}m) = O({\rm lg}n{\rm lglg}n) T(n)=T(2m)=S(m)=O(mlgm)=O(lgnlglgn)

练习

4.3-1 证明: T ( n ) = T ( n − 1 ) + n T(n) = T(n−1) + n T(n)=T(n1)+n的解为 O ( n 2 ) O(n^2) O(n2)
  
  我们要证明的是存在正常数 c c c,使得 T ( n ) ≤ c n 2 T(n) ≤ cn^2 T(n)cn2对足够大的n都成立。
  取初始情况 T ( 1 ) = 1 T(1) = 1 T(1)=1。只要取任意 c ≥ 1 c ≥ 1 c1,就能使得 T ( 1 ) ≤ c • 1 2 T(1) ≤ c•1^2 T(1)c12成立。
  当 n ≥ 2 n ≥ 2 n2时,假设 T ( n ) ≤ c n 2 T(n) ≤ cn^2 T(n)cn2对所有 1 , 2 , … , n − 1 1, 2, …, n−1 1,2,,n1都成立,有
     T ( n ) = T ( n − 1 ) + n ≤ c ( n − 1 ) 2 + n = c n 2 − ( 2 n − 1 ) c + n T(n)=T(n-1) + n≤c(n-1)^2+n=cn^2-(2n-1)c+n T(n)=T(n1)+nc(n1)2+n=cn2(2n1)c+n
  要使不等式 c n 2 – ( 2 n – 1 ) c + n ≤ c n 2 cn^2 – (2n–1)c + n ≤ cn^2 cn2(2n1)c+ncn2成立,只需要让 ( 2 n – 1 ) c ≥ n (2n–1)c ≥ n (2n1)cn成立,即 c ≥ n / ( 2 n – 1 ) = 1 / ( 2 – 1 / n ) c ≥ n/(2n–1) = 1/(2–1/n) cn/(2n1)=1/(21/n)。当 n ≥ 2 n ≥ 2 n2时, 1 / ( 2 – 1 / n ) 1/(2–1/n) 1/(21/n)是单调递减的,因此它在 n = 2 n = 2 n=2时取得最大值为 2 / 3 2/3 2/3。因此,只要取 c ≥ 2 / 3 c ≥ 2/3 c2/3,就可使不等式 c n 2 – ( 2 n – 1 ) c + n ≤ c n 2 cn^2 – (2n–1)c + n ≤ cn^2 cn2(2n1)c+ncn2成立,此时 T ( n ) ≤ c n 2 T(n) ≤ cn^2 T(n)cn2成立。综合考虑初始情况 T ( 1 ) T(1) T(1),我们最终要取 c ≥ 1 c ≥ 1 c1
  因此, T ( n ) = T ( n – 1 ) + n T(n) = T(n–1) + n T(n)=T(n1)+n的解为 O ( n 2 ) O(n^2) O(n2)

4.3-2 证明: T ( n ) = T ( ⌈ n / 2 ⌉ ) + 1 T(n)=T(⌈n/2⌉)+1 T(n)=T(n/2)+1的解为 O ( l g n ) O({\rm lg}n) O(lgn)
  
  我们要证明的是存在正常数 c c c,使得 T ( n ) ≤ c l g n T(n) ≤ c{\rm lg}n T(n)clgn对足够大的 n n n都成立。
  令 T ( 1 ) = 1 T(1) = 1 T(1)=1,根据递归式得到 T ( 2 ) = T ( 1 ) + 1 = 2 T(2) = T(1) + 1 = 2 T(2)=T(1)+1=2。对于 T ( 1 ) T(1) T(1),无论 c c c取何值,都不能满足 T ( 1 ) ≤ c • l g 1 T(1) ≤ c•{\rm lg}1 T(1)clg1。但只要取 c ≥ 2 c ≥ 2 c2,就能满足 T ( 2 ) ≤ c • l g 2 T(2) ≤ c•{\rm lg}2 T(2)clg2。因此我们以 T ( 2 ) T(2) T(2)作为归纳证明的初始情况。
  当 n ≥ 3 n ≥ 3 n3时,假设 T ( n ) ≤ c l g n T(n) ≤ c{\rm lg}n T(n)clgn对所有 1 , 2 , … , n − 1 1, 2, …, n−1 1,2,,n1都成立,有
     T ( n ) = T ( ⌈ n / 2 ⌉ ) + 1 ≤ c l g ⌈ n 2 ⌉ + 1 ≤ c l g n + 1 2 + 1 T(n)=T(⌈n/2⌉)+1≤c{\rm lg}⌈\frac{n}{2}⌉+1≤c{\rm lg}\frac{n+1}{2}+1 T(n)=T(n/2)+1clg2n+1clg2n+1+1
  现在我们选取合适的 c c c,使得不等式成立 c l g n + 1 2 + 1 ≤ c l g n c{\rm lg}\frac{n+1}{2}+1≤c{\rm lg}n clg2n+1+1clgn成立。对这个不等式做一下变换,有
  在这里插入图片描述
  当 n ≥ 3 n ≥ 3 n3时, 1 l g 2 1 + 1 / n \frac{1}{{\rm lg}\frac{2}{1+1/n}} lg1+1/n21是单调递减的,因此它在 n = 2 n = 2 n=2时取得最大值为 1 / ( l g 3 – 1 ) 1/({\rm lg}3–1) 1/(lg31)。因此,只要取 c ≥ 1 / ( l g 3 – 1 ) c ≥ 1/({\rm lg}3–1) c1/(lg31),就能使得 c l g n + 1 2 + 1 ≤ c l g n c{\rm lg}\frac{n+1}{2}+1≤c{\rm lg}n clg2n+1+1clgn成立,即 T ( n ) ≤ c l g n T(n) ≤ c{\rm lg}n T(n)clgn成立。综合考虑初始情况 T ( 1 ) T(1) T(1),我们最终要取 c ≥ 2 c ≥ 2 c2
  因此, T ( n ) = T ( ⌈ n / 2 ⌉ ) + 1 T(n)=T(⌈n/2⌉)+1 T(n)=T(n/2)+1的解为 O ( l g n ) O({\rm lg}n) O(lgn)

4.3-3 我们看到 T ( n ) = 2 T ( ⌊ n / 2 ⌋ ) + n T(n)=2T(⌊n/2⌋)+n T(n)=2T(n/2)+n的解为 O ( n l g n ) O(n{\rm lg}n) O(nlgn)。证明 Ω ( n l g n ) Ω(n{\rm lg}n) Ω(nlgn)也是这个递归式的解。从而得出结论: T ( n ) = Θ ( n l g n ) T(n) = Θ(n{\rm lg}n) T(n)=Θ(nlgn)
  
  我们要证明的是存在正常数 c c c,使得 T ( n ) ≥ c n l g n T(n) ≥ cn{\rm lg}n T(n)cnlgn对足够大的 n n n都成立。
  取初始情况 T ( 1 ) = 1 T(1) = 1 T(1)=1。只要取任意 c > 0 c > 0 c>0,就能使得 T ( 1 ) ≥ c • 1 • l g 1 T(1) ≥ c•1•{\rm lg}1 T(1)c1lg1成立。
  当 n ≥ 2 n ≥ 2 n2时,假设 T ( n ) ≥ c n l g n T(n) ≥ cn{\rm lg}n T(n)cnlgn对所有 1 , 2 , … , n − 1 1, 2, …, n−1 1,2,,n1都成立,有
     T ( n ) = 2 T ( ⌊ n / 2 ⌋ ) + n ≥ 2 c ⌊ n / 2 ⌋ l g ⌊ n / 2 ⌋ + n ≥ c ( n − 1 ) l g ( ( n − 1 ) / 2 ) + n T(n)=2T(⌊n/2⌋)+n≥2c⌊n/2⌋{\rm lg}⌊n/2⌋+n≥c(n-1){\rm lg}((n-1)/2)+n T(n)=2T(n/2)+n2cn/2lgn/2+nc(n1)lg((n1)/2)+n
  我们现在要选取合适的 c c c,使得不等式 c ( n − 1 ) l g ( ( n − 1 ) / 2 ) + ≥ c n l g n c(n-1){\rm lg}((n-1)/2)+≥cn{\rm lg}n c(n1)lg((n1)/2)+cnlgn成立。对这个不等式做一下变换,有
   在这里插入图片描述
  现在问题变换为选取合适的 c c c,使得 c ≤ 1 / f ( n ) c≤1/f(n) c1/f(n)对所有 n ≥ 2 n ≥ 2 n2成立。因此我们需要找到 1 / f ( n ) 1/f(n) 1/f(n)的最小值。现在来分析 f ( n ) f(n) f(n)。显然,当 n ≥ 2 n ≥ 2 n2时, f ( n ) = l g n − l g ( n − 1 ) + l g ( n − 1 ) n + 1 − 1 n f(n)={\rm lg}n-{\rm lg}(n-1)+\frac{{\rm lg}(n-1)}{n}+1-\frac{1}{n} f(n)=lgnlg(n1)+nlg(n1)+1n1一定大于 0 0 0。所以只要找到 f ( n ) f(n) f(n)的最大值,就可以找到 1 / f ( n ) 1/f(n) 1/f(n)的最小值。 f ( n ) f(n) f(n)这个函数比较复杂,所以我们用求导的方法来寻找它的最大值。
  在这里插入图片描述
  当 2 ≤ n < 3 2 ≤ n < 3 2n<3时, f ′ ( n ) > 0 f'(n)>0 f(n)>0;当 n = 3 n = 3 n=3时, f ′ ( n ) = 0 f'(n)=0 f(n)=0;当 n > 3 n > 3 n>3时, f ′ ( n ) < 0 f'(n)<0 f(n)<0。所以当 n ≥ 2 n ≥ 2 n2时,函数 f ( n ) f(n) f(n)先单调递增,然后单调递降,并且在 n = 3 n = 3 n=3 f ( n ) f(n) f(n)取得最大值为 l g 3 {\rm lg}3 lg3,此时 1 / f ( n ) 1/f(n) 1/f(n)取得最小值 1 / l g 3 1/{\rm lg}3 1/lg3。所以,只要取任意 c ≤ 1 / l g 3 c ≤ 1/{\rm lg}3 c1/lg3,就能使得 c ≤ 1 / f ( n ) c≤1/f(n) c1/f(n)对所有 n ≥ 2 n ≥ 2 n2成立,也就使得 c ( n − 1 ) l g ( ( n − 1 ) / 2 ) + ≥ c n l g n c(n-1){\rm lg}((n-1)/2)+≥cn{\rm lg}n c(n1)lg((n1)/2)+cnlgn成立,即 T ( n ) ≥ c n l g n T(n) ≥ cn{\rm lg}n T(n)cnlgn成立。综合考虑初始情况 T ( 1 ) T(1) T(1),我们最终要取 c ≤ 1 / l g 3 c ≤ 1/{\rm lg}3 c1/lg3
  因此, Ω ( n l g n ) Ω(n{\rm lg}n) Ω(nlgn)是递归式 T ( n ) = 2 T ( ⌊ n / 2 ⌋ ) + n T(n)=2T(⌊n/2⌋)+n T(n)=2T(n/2)+n的解。

4.3-4 证明:通过做出不同的归纳假设,我们不必调整归纳证明中的边界条件,即可克服递归式(4.19)中边界条件 T ( 1 ) = 1 T(1) = 1 T(1)=1带来的困难。
  
  我们要证明的是递归式 T ( n ) = 2 T ( ⌊ n / 2 ⌋ ) + n T(n)=2T(⌊n/2⌋)+n T(n)=2T(n/2)+n的解为 O ( n l g n ) O(n{\rm lg}n) O(nlgn),也就是存在正常数 c c c,使得 T ( n ) ≤ c n l g n T(n) ≤ cn{\rm lg}n T(n)cnlgn对足够大的 n n n都成立。为了避开边界条件 T ( 1 ) = 1 T(1) = 1 T(1)=1带来的困难,对归纳假设做一下调整,增加一个低阶项,归纳假设变为 T ( n ) ≤ c n l g n + d n T(n) ≤ cn{\rm lg}n + dn T(n)cnlgn+dn
  以 T ( 1 ) = 1 T(1) = 1 T(1)=1为归纳证明的初始情况。将 n = 1 n = 1 n=1代入归纳假设,有 T ( 1 ) ≤ c • 1 • l g 1 + d • 1 = d T(1) ≤ c•1•{\rm lg}1 + d•1 = d T(1)c1lg1+d1=d。只要取任意 c > 0 c > 0 c>0并且 d ≥ 1 d ≥ 1 d1,就能使得归纳假设对 T ( 1 ) T(1) T(1)成立。
  当 n ≥ 2 n ≥ 2 n2时,假设命题对所有 1 , 2 , … , n − 1 1, 2, …, n−1 1,2,,n1都成立,有
     T ( n ) = 2 T ( ⌊ n / 2 ⌋ ) + n ≤ 2 c ⌊ n / 2 ⌋ l g ⌊ n / 2 ⌋ + 2 d ⌊ n / 2 ⌋ + n ≤ c n l g ( n / 2 ) + d n + n = c n l g n − c n + d n + n T(n)=2T(⌊n/2⌋)+n≤2c⌊n/2⌋{\rm lg}⌊n/2⌋+2d⌊n/2⌋+n≤cn{\rm lg}(n/2)+dn+n=cn{\rm lg}n-cn+dn+n T(n)=2T(n/2)+n2cn/2lgn/2+2dn/2+ncnlg(n/2)+dn+n=cnlgncn+dn+n
  现在我们选取合适的 c c c d d d,使得不等式成立 c n l g n − c n + d n + n ≤ c n l g n + d n cn{\rm lg}n-cn+dn+n≤cn{\rm lg}n+dn cnlgncn+dn+ncnlgn+dn成立。对这个不等式进行化简,得到 n ≤ c n n ≤ cn ncn。显然,只要取 c ≥ 1 c ≥ 1 c1,无论 d d d取何值,都能使得这个不等式成立,也就能使得 T ( n ) ≤ c n l g n + d n T(n) ≤ cn{\rm lg}n + dn T(n)cnlgn+dn成立。综合考虑初始情况 T ( 1 ) T(1) T(1),我们最终要取 c ≥ 1 c ≥ 1 c1并且 d ≥ 1 d ≥ 1 d1
  因此,递归式 T ( n ) = 2 T ( ⌊ n / 2 ⌋ ) + n T(n)=2T(⌊n/2⌋)+n T(n)=2T(n/2)+n的解为 O ( n l g n ) O(n{\rm lg}n) O(nlgn)

4.3-5 证明:归并排序的“严格”递归式(4.3)的解为 Θ ( n l g n ) Θ(n{\rm lg}n) Θ(nlgn)
  
  归并排序的“严格”递归式为
    在这里插入图片描述
  为证明 T ( n ) = Θ ( n l g n ) T(n) = Θ(n{\rm lg}n) T(n)=Θ(nlgn),需要分别证明 T ( n ) = O ( n l g n ) T(n) = O(n{\rm lg}n) T(n)=O(nlgn) T ( n ) = Ω ( n l g n ) T(n) = Ω(n{\rm lg}n) T(n)=Ω(nlgn)
  1. 证明 T ( n ) = O ( n l g n ) T(n) = O(n{\rm lg}n) T(n)=O(nlgn),即存在正常数 c c c,使得 T ( n ) ≤ c n l g n T(n) ≤ cn{\rm lg}n T(n)cnlgn对足够大的 n n n都成立。
  取 T ( 1 ) = 1 T(1) = 1 T(1)=1,则 T ( 2 ) = 2 T ( 1 ) + Θ ( 2 ) ≤ 2 + 2 d T(2) = 2T(1) + Θ(2) ≤ 2 + 2d T(2)=2T(1)+Θ(2)2+2d,其中 d > 0 d > 0 d>0。对于 n = 1 n = 1 n=1,无论 c c c取何值,都不能满足 T ( 1 ) ≤ c • 1 • l g 1 T(1) ≤ c•1•{\rm lg}1 T(1)c1lg1,因此归纳假设对 T ( 1 ) T(1) T(1)不成立。
  当 n > 1 n > 1 n>1时, T ( n ) = T ( ⌈ n / 2 ⌉ ) + T ( ⌊ n / 2 ⌋ ) + Θ ( n ) T(n)=T(⌈n/2⌉)+T(⌊n/2⌋)+Θ(n) T(n)=T(n/2)+T(n/2)+Θ(n)。根据 Θ Θ Θ记号的定义, f ( n ) = Θ ( n ) f(n) = Θ(n) f(n)=Θ(n)意味着存在正常数 d 1 d_1 d1 d 2 d_2 d2,使得 d 1 n ≤ f ( n ) ≤ d 2 n d_1n ≤ f(n) ≤ d_2n d1nf(n)d2n对足够大的 n n n都成立。于是,当 n > 1 n > 1 n>1时,递归式可以写为
     T ( ⌈ n / 2 ⌉ ) + T ( ⌊ n / 2 ⌋ ) + d 1 n ≤ T ( n ) ≤ T ( ⌈ n / 2 ⌉ ) + T ( ⌊ n / 2 ⌋ ) + d 2 n T(⌈n/2⌉)+T(⌊n/2⌋)+d_1n≤T(n)≤T(⌈n/2⌉)+T(⌊n/2⌋)+d_2n T(n/2)+T(n/2)+d1nT(n)T(n/2)+T(n/2)+d2n
  将 n = 2 n = 2 n=2代入递归式,得到 T ( 2 ) ≤ 2 T ( 1 ) + 2 d 2 = 2 + 2 d 2 T(2) ≤ 2T(1) + 2d_2 = 2 + 2d_2 T(2)2T(1)+2d2=2+2d2。只要取 c ≥ d 2 + 1 c ≥ d_2 + 1 cd2+1,就能使得 T ( 2 ) ≤ c • 2 • l g 2 T(2) ≤ c•2•{\rm lg}2 T(2)c2lg2成立。再将 n = 3 n = 3 n=3代入递归式,得到 T ( 3 ) ≤ T ( 1 ) + T ( 2 ) + 3 d 2 ≤ 3 + 5 d 2 T(3) ≤ T(1) + T(2) + 3d_2 ≤ 3 + 5d_2 T(3)T(1)+T(2)+3d23+5d2。只要取 c ≥ 1 l g 3 + 5 3 l g 3 d 2 c≥\frac{1}{{\rm lg}3}+\frac{5}{3{\rm lg}3}d_2 clg31+3lg35d2,就能使得 T ( 3 ) ≤ c • 3 • l g 3 T(3) ≤ c•3•lg3 T(3)c3lg3成立。我们要选取 T ( 2 ) T(2) T(2) T ( 3 ) T(3) T(3)作为归纳证明的初始条件,为了使 T ( 2 ) T(2) T(2) T ( 3 ) T(3) T(3)满足归纳假设,必须选取 c ≥ m a x { d 2 + 1 , 1 l g 3 + 5 3 l g 3 d 2 } c≥{\rm max}\{d_2+1, \frac{1}{{\rm lg}3}+\frac{5}{3{\rm lg}3}d_2\} cmax{d2+1,lg31+3lg35d2}
  当 n ≥ 4 n ≥ 4 n4时,假设 T ( n ) ≤ c n l g n T(n) ≤ cn{\rm lg}n T(n)cnlgn对所有 2 , 3 , … , n − 1 2, 3, …, n−1 2,3,,n1都成立,有
  在这里插入图片描述
  现在我们要选取合适的 c c c,使得不等式 c n l g ( n + 1 ) − c n + d 2 n ≤ c n l g n cn{\rm lg}(n+1)-cn+d_2n≤cn{\rm lg}n cnlg(n+1)cn+d2ncnlgn成立。对这个不等式做一些变换。
  在这里插入图片描述
  当 n ≥ 4 n ≥ 4 n4时, d 2 ( 1 − l g ( 1 + 1 / n ) ) \frac{d_2}{(1-{\rm lg}(1+1/n))} (1lg(1+1/n))d2是单调递减的,所以它在 n = 4 n = 4 n=4时取得最大值为 d 2 3 − l g 5 \frac{d_2}{3-{\rm lg}5} 3lg5d2。所以,当 n ≥ 4 n ≥ 4 n4时,只要取 c ≥ d 2 3 − l g 5 c≥\frac{d_2}{3-{\rm lg}5} c3lg5d2,就能使得 c n l g ( n + 1 ) − c n + d 2 n ≤ c n l g n cn{\rm lg}(n+1)-cn+d_2n≤cn{\rm lg}n cnlg(n+1)cn+d2ncnlgn成立,即 T ( n ) ≤ c n l g n T(n) ≤ cn{\rm lg}n T(n)cnlgn成立。综合考虑初始情况 T ( 2 ) T(2) T(2) T ( 3 ) T(3) T(3),我们最终要取 c ≥ m a x { d 2 + 1 , 1 l g 3 + 5 3 l g 3 d 2 , d 2 3 − l g 5 } c≥{\rm max}\{d_2+1, \frac{1}{{\rm lg}3}+\frac{5}{3{\rm lg}3}d_2, \frac{d_2}{3-lg5}\} cmax{d2+1,lg31+3lg35d2,3lg5d2}
  因此, T ( n ) = O ( n l g n ) T(n) = O(n{\rm lg}n) T(n)=O(nlgn)成立。
  2. 证明 T ( n ) = Ω ( n l g n ) T(n) = Ω(n{\rm lg}n) T(n)=Ω(nlgn),即存在正常数 c c c,使得 T ( n ) ≥ c n l g n T(n) ≥ cn{\rm lg}n T(n)cnlgn对足够大的 n n n都成立。
  取初始情况 T ( 1 ) = 1 T(1) = 1 T(1)=1。无论 c c c取何值,都能使得 T ( 1 ) ≥ c • 1 • l g 1 T(1) ≥ c•1•{\rm lg}1 T(1)c1lg1成立。
  当 n ≥ 2 n ≥ 2 n2时,假设 T ( n ) ≥ c n l g n T(n) ≥ cn{\rm lg}n T(n)cnlgn对所有 1 , 2 , … , n − 1 1, 2, …, n−1 1,2,,n1都成立,有
  在这里插入图片描述
  现在我们要选取合适的 c c c,使得不等式 c n l g ( n − 1 ) − c n + d 1 n ≥ c n l g n cn{\rm lg}(n-1)-cn+d_1n≥cn{\rm lg}n cnlg(n1)cn+d1ncnlgn成立。对这个不等式做一些变换。
  在这里插入图片描述
  当 n ≥ 2 n ≥ 2 n2时, d 1 1 − l g ( 1 − 1 / n ) \frac{d_1}{1-{\rm lg}(1-1/n)} 1lg(11/n)d1是单调递增的,并且在 n = 2 n = 2 n=2时取得最小值为 d 2 / 2 d_2/2 d2/2。因此,当 n ≥ 2 n ≥ 2 n2时,只要取 c ≤ d 2 / 2 c ≤ d_2/2 cd2/2,就能使得 c n l g ( n − 1 ) − c n + d 1 n ≥ c n l g n cn{\rm lg}(n-1)-cn+d_1n≥cn{\rm lg}n cnlg(n1)cn+d1ncnlgn成立,即 T ( n ) ≥ c n l g n T(n) ≥ cn{\rm lg}n T(n)cnlgn成立。综合考虑初始情况 T ( 2 ) T(2) T(2) T ( 3 ) T(3) T(3),我们最终要取 c ≤ d 2 / 2 c ≤ d_2/2 cd2/2
  因此, T ( n ) = Ω ( n l g n ) T(n) = Ω(n{\rm lg}n) T(n)=Ω(nlgn)成立。
  
4.3-6 证明: T ( n ) = 2 T ( ⌊ n / 2 ⌋ + 17 ) + n T(n)=2T(⌊n/2⌋+17)+n T(n)=2T(n/2+17)+n的解为 O ( n l g n ) O(n{\rm lg}n) O(nlgn)
  
  我们要证明的是存在正常数 c c c,使得 T ( n ) ≤ c n l g n T(n) ≤ cn{\rm lg}n T(n)cnlgn对足够大的 n n n都成立。然而,直接证明 T ( n ) ≤ c n l g n T(n) ≤ cn{\rm lg}n T(n)cnlgn比较困难,我们不妨尝试证明 T ( n ) ≤ c ( n − 34 ) l g ( n − 34 ) T(n) ≤ c(n−34){\rm lg}(n−34) T(n)c(n34)lg(n34)。由于 c ( n − 34 ) l g ( n − 34 ) < c n l g n c(n−34){\rm lg}(n−34) < cn{\rm lg}n c(n34)lg(n34)<cnlgn是显而易见的,所以证明了 T ( n ) ≤ c ( n − 34 ) l g ( n − 34 ) T(n) ≤ c(n−34){\rm lg}(n−34) T(n)c(n34)lg(n34),也就证明了 T ( n ) ≤ c n l g n T(n) ≤ cn{\rm lg}n T(n)cnlgn,即 T ( n ) = O ( n l g n ) T(n) = O(n{\rm lg}n) T(n)=O(nlgn)
  首先有必要分析这个递归式的边界条件。只有当 n > ⌊ n / 2 ⌋ + 17 n>⌊n/2⌋+17 n>n/2+17时,这个递归式才有意义。当 n = ⌊ n / 2 ⌋ + 17 n=⌊n/2⌋+17 n=n/2+17时,递归式变成 T ( n ) = T ( n ) + n T(n)=T(n)+n T(n)=T(n)+n,这个式子显然是自我矛盾的。当 n < ⌊ n / 2 ⌋ + 17 n<⌊n/2⌋+17 n<n/2+17时, T ( n ) T(n) T(n)依赖于规模更大的子问题的运行时间,这显然不符合递归的本质。求解不等式 n > ⌊ n / 2 ⌋ + 17 n>⌊n/2⌋+17 n>n/2+17,得到 n > 34 n > 34 n>34。因此只有当 n > 34 n > 34 n>34时,递归式才有意义,而 n < 34 n < 34 n<34都是这个递归式的边界条件。
  根据以上分析,递归式的初始情况必须覆盖 T ( 1 ) , T ( 2 ) , … , T ( 34 ) T(1), T(2), …, T(34) T(1),T(2),,T(34)。然而在归纳证明中, T ( 1 ) , T ( 2 ) , … , T ( 33 ) T(1), T(2), …, T(33) T(1),T(2),,T(33)都可以忽略,因为当 n > 34 n > 34 n>34时, T ( n ) T(n) T(n)只有可能依赖 T ( 34 ) T(34) T(34),而不可能依赖 T ( 1 ) , T ( 2 ) , … , T ( 33 ) T(1), T(2), …, T(33) T(1),T(2),,T(33),我们取 T ( 34 ) = 1 T(34) = 1 T(34)=1
  如果以 T ( 34 ) T(34) T(34)作为归纳证明的初始情况,将 n = 34 n = 34 n=34代入归纳假设,得到不等式 T ( 34 ) ≤ c • ( 34 − 34 ) l g ( 34 − 34 ) = c • 0 • l g 0 T(34) ≤ c•(34−34){\rm lg}(34−34) = c•0•{\rm lg}0 T(34)c(3434)lg(3434)=c0lg0,这个式子中的 l g 0 {\rm lg}0 lg0是没有意义。因此 T ( 34 ) T(34) T(34)不能作为归纳证明的初始情况。
  下面考虑 T ( 35 ) T(35) T(35)。根据递归式得到 T ( 35 ) = 2 T ( 34 ) + 35 = 37 T(35) = 2T(34) + 35 = 37 T(35)=2T(34)+35=37。将 n = 35 n = 35 n=35代入归纳假设,得到不等式 T ( 35 ) ≤ c • ( 35 − 34 ) l g ( 35 − 34 ) = c • 1 • l g 1 = 0 T(35) ≤ c•(35−34){\rm lg}(35−34) = c•1•{\rm lg}1 = 0 T(35)c(3534)lg(3534)=c1lg1=0。显然,无论 c c c取何值,这个不等式都不成立。因此 T ( 35 ) T(35) T(35)也不能作为归纳证明的初始情况。
  下面继续考虑 T ( 36 ) T(36) T(36)。根据递归式得到 T ( 36 ) = 2 T ( 35 ) + 36 = 110 T(36) = 2T(35) + 36 = 110 T(36)=2T(35)+36=110。将 n = 36 n = 36 n=36代入归纳假设,得到不等式 T ( 36 ) ≤ c • ( 36 − 34 ) l g ( 36 − 34 ) = c • 2 • l g 2 = 2 c T(36) ≤ c•(36−34){\rm lg}(36−34) = c•2•{\rm lg}2 = 2c T(36)c(3634)lg(3634)=c2lg2=2c。显然,只要取 c ≥ 55 c ≥ 55 c55,就能使这个不等式成立,也就能使得 T ( 36 ) T(36) T(36)满足归纳假设。因此 T ( 36 ) T(36) T(36)可以作为归纳证明的初始情况。
  还要继续考虑 T ( 37 ) T(37) T(37),因为 T ( 37 ) T(37) T(37)依赖于 T ( 35 ) T(35) T(35),而根据刚才分析, T ( 35 ) T(35) T(35)并不符合归纳假设。根据递归式得到 T ( 37 ) = 2 T ( 35 ) + 37 = 111 T(37) = 2T(35) + 37 = 111 T(37)=2T(35)+37=111。将 n = 37 n = 37 n=37代入归纳假设,得到不等式 T ( 37 ) ≤ c • ( 37 − 34 ) l g ( 37 − 34 ) = c • 3 • l g 3 T(37) ≤ c•(37−34){\rm lg}(37−34) = c•3•{\rm lg}3 T(37)c(3734)lg(3734)=c3lg3。显然,只要取 c ≥ 111 / ( 3 l g 3 ) = 37 l g 3 ≈ 23.34 c ≥ 111/(3{\rm lg}3) = 37{\rm lg}3 ≈ 23.34 c111/(3lg3)=37lg323.34,就能使这个不等式成立,也就能使得 T ( 37 ) T(37) T(37)满足归纳假设。
  根据以上分析,归纳证明的初始情况应当取 T ( 36 ) T(36) T(36) T ( 37 ) T(37) T(37),并且 c c c的取值应当满足 c ≥ 55 c ≥ 55 c55
  当 n ≥ 38 n ≥ 38 n38时,假设 T ( n ) ≤ c ( n − 34 ) l g ( n − 34 ) T(n) ≤c(n−34){\rm lg}(n−34) T(n)c(n34)lg(n34)对所有 36 , 37 , … , n − 1 36, 37, …, n−1 36,37,,n1都成立,有
  在这里插入图片描述
  现在我们要选取合适的 c c c,使得不等式 c ( n − 34 ) l g ( n − 34 ) − c ( n − 34 ) + n ≤ c ( n − 34 ) l g ( n − 34 ) c(n-34){\rm lg}(n-34)-c(n-34)+n≤c(n-34){\rm lg}(n-34) c(n34)lg(n34)c(n34)+nc(n34)lg(n34)成立。对这个不等式做一些变换。
  在这里插入图片描述
  当 n ≥ 38 n ≥ 38 n38时, 1 1 − 34 / n \frac{1}{1-34/n} 134/n1是单调递降的,并且在 n = 38 n = 38 n=38时取得最大值为 19 / 2 19/2 19/2。因此,只要选取 c ≥ 19 / 2 c ≥ 19/2 c19/2,就能使得不等式 c ( n − 34 ) l g ( n − 34 ) − c ( n − 34 ) + n ≤ c ( n − 34 ) l g ( n − 34 ) c(n-34){\rm lg}(n-34)-c(n-34)+n≤c(n-34){\rm lg}(n-34) c(n34)lg(n34)c(n34)+nc(n34)lg(n34)成立,也就能使得 T ( n ) ≤ c ( n − 34 ) l g ( n − 34 ) T(n) ≤ c(n−34){\rm lg}(n−34) T(n)c(n34)lg(n34)成立。综合考虑初始情况 T ( 36 ) T(36) T(36) T ( 37 ) T(37) T(37),我们最终要取c ≥ 55。
  因此, T ( n ) = 2 T ( ⌊ n / 2 ⌋ + 17 ) + n T(n)=2T(⌊n/2⌋+17)+n T(n)=2T(n/2+17)+n的解为 O ( n l g n ) O(n{\rm lg}n) O(nlgn)
  
4.3-7 使用4.5节中的主方法,可以证明 T ( n ) = 4 T ( n / 3 ) + n T(n) = 4T(n/3)+n T(n)=4T(n/3)+n的解为 T ( n ) = Θ ( n l o g 3 4 ) T(n)=Θ(n^{{\rm log}_3 4}) T(n)=Θ(nlog34)。说明基于假设 T ( n ) ≤ c n l o g 3 4 T(n)≤cn^{{\rm log}_3 4} T(n)cnlog34的代入法不能证明这一结论。然后说明如何通过减去一个低阶项完成代入法证明。
  
  如果直接假设 T ( n ) ≤ c n l o g 3 4 T(n)≤cn^{{\rm log}_3 4} T(n)cnlog34,那么根据递归式有
    在这里插入图片描述
  可以看到,无论 c c c取何值,都不能使得 T ( n ) ≤ c n l o g 3 4 T(n)≤cn^{{\rm log}_34} T(n)cnlog34成立。
  下面试试在归纳假设中减去一个低阶项 d n dn dn,即假设 T ( n ) ≤ c n l o g 3 4 − d n T(n)≤cn^{{\rm log}_3 4}-dn T(n)cnlog34dn,其中 d > 0 d > 0 d>0。那么根据递归式,有
    在这里插入图片描述
  可以看到,只要取 d ≥ 3 d ≥ 3 d3 c n l o g 3 4 − 4 3 d n + n ≤ c n l o g 3 4 − d n cn^{{\rm log}_34}-\frac{4}{3}dn+n≤cn^{{\rm log}_34}-dn cnlog3434dn+ncnlog34dn一定成立,也即 T ( n ) ≤ c n l o g 3 4 − d n T(n)≤cn^{{\rm log}_3 4}-dn T(n)cnlog34dn成立。因此,减去一个低阶项 d n dn dn,就可以应用代入法了。
  
4.3-8 使用4.5节中的主方法,可以证明 T ( n ) = 4 T ( n / 2 ) + n T(n) = 4T(n/2)+n T(n)=4T(n/2)+n的解为 T ( n ) = Θ ( n 2 ) T(n)=Θ(n^2) T(n)=Θ(n2)。说明基于假设 T ( n ) ≤ c n 2 T(n)≤cn^2 T(n)cn2的代入法不能证明这一结论。然后说明如何通过减去一个低阶项完成代入法证明。
  
  如果直接假设 T ( n ) ≤ c n 2 T(n)≤cn^2 T(n)cn2,那么根据递归式有
    在这里插入图片描述
  可以看到,无论 c c c取何值,都不能使得 T ( n ) ≤ c n 2 T(n)≤cn^2 T(n)cn2成立。
  下面试试在归纳假设中减去一个低阶项 d n dn dn,即假设 T ( n ) ≤ c n 2 − d n T(n)≤cn^2-dn T(n)cn2dn,其中 d > 0 d > 0 d>0。那么根据递归式,有
    在这里插入图片描述
  可以看到,只要取 d ≥ 1 d ≥ 1 d1 c n 2 − 2 d n + n ≤ c n 2 − d n cn^2-2dn+n≤cn^2-dn cn22dn+ncn2dn一定成立,也即 T ( n ) ≤ c n 2 − d n T(n)≤cn^2-dn T(n)cn2dn成立。因此,减去一个低阶项 d n dn dn,就可以应用代入法了。
  
4.3-9 利用改变变量的方法求解递归式 T ( n ) = 3 T ( n ) + l g n T(n)=3T(\sqrt{n})+{\rm lg}n T(n)=3T(n )+lgn。你的解应该是渐近紧确的。不必担心数值是否是整数。
  
  令 m = l g n m = {\rm lg}n m=lgn,所以 n = 2 m n = 2^m n=2m,代入递归式,得到
     T ( 2 m ) = 3 T ( 2 m / 2 ) + m T(2^m)=3T(2^{m/2})+m T(2m)=3T(2m/2)+m
  令 S ( m ) = T ( 2 m ) S(m) = T(2^m) S(m)=T(2m),得到
     S ( m ) = 3 S ( m / 2 ) + m S(m) = 3S(m/2) + m S(m)=3S(m/2)+m
  求解递归式 S ( m ) = 3 S ( m / 2 ) + m S(m) = 3S(m/2) + m S(m)=3S(m/2)+m,得到 S ( m ) = Θ ( m l g 3 ) S(m) = Θ(m^{{\rm lg}3}) S(m)=Θ(mlg3)
  所以 T ( n ) = T ( 2 m ) = S ( m ) = Θ ( m l g 3 ) = Θ ( l g n l g 3 ) T(n) = T(2^m) = S(m) = Θ(m^{{\rm lg}3}) = Θ({\rm lg}n^{{\rm lg}3}) T(n)=T(2m)=S(m)=Θ(mlg3)=Θ(lgnlg3)

  • 17
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值