算法导论 — 思考题4-3 更多的递归式例子

更多的递归式例子)对下列每个递归式,给出 T ( n ) T(n) T(n)的渐近上界和下界。假定对足够小的 n n n T ( n ) T(n) T(n)是常数。给出尽量紧确的界,并验证其正确性。
  a. T ( n ) = 4 T ( n / 3 ) + n l g n T(n)=4T(n/3)+n{\rm lg}n T(n)=4T(n/3)+nlgn
  b. T ( n ) = 3 T ( n / 3 ) + n / l g n T(n)=3T(n/3)+n/{\rm lg}n T(n)=3T(n/3)+n/lgn
  c. T ( n ) = 4 T ( n / 2 ) + n 2 n T(n)=4T(n/2)+n^2\sqrt{n} T(n)=4T(n/2)+n2n
  d. T ( n ) = 3 T ( n / 3 − 2 ) + n / 2 T(n)=3T(n/3-2)+n/2 T(n)=3T(n/32)+n/2
  e. T ( n ) = 2 T ( n / 2 ) + n / l g n T(n)=2T(n/2)+n/{\rm lg}n T(n)=2T(n/2)+n/lgn
  f. T ( n ) = T ( n / 2 ) + T ( n / 4 ) + T ( n / 8 ) + n T(n)=T(n/2)+T(n/4)+T(n/8)+n T(n)=T(n/2)+T(n/4)+T(n/8)+n
  g. T ( n ) = T ( n − 1 ) + 1 / n T(n)=T(n-1)+1/n T(n)=T(n1)+1/n
  h. T ( n ) = T ( n − 1 ) + l g n T(n)=T(n-1)+{\rm lg}n T(n)=T(n1)+lgn
  i. T ( n ) = T ( n − 2 ) + 1 / l g n T(n)=T(n-2)+1/{\rm lg}n T(n)=T(n2)+1/lgn
  j. T ( n ) = n T ( n ) + n T(n)=\sqrt{n}T(\sqrt{n})+n T(n)=n T(n )+n
  
  
  a. T ( n ) = 4 T ( n / 3 ) + n l g n T(n)=4T(n/3)+n{\rm lg}n T(n)=4T(n/3)+nlgn
  应用主定理,根据递归式有 a = 4 a = 4 a=4, b = 3 b = 3 b=3 f ( n ) = n l g n f(n) = n{\rm lg}n f(n)=nlgn,所以有 n l o g b a = n l o g 3 4 n^{{\rm log}_b a}=n^{{\rm log}_3 4} nlogba=nlog34。于是有 f ( n ) = n l g n = O ( n l o g 3 4 − ε ) = O ( n l o g b a − ε ) f(n)=n{\rm lg}n=O(n^{{\rm log}_3 4-ε})=O(n^{{\rm log}_b a-ε}) f(n)=nlgn=O(nlog34ε)=O(nlogbaε),任取 0 < ε < l o g 3 4 − 1 0<ε<{\rm log}_3 4-1 0<ε<log341即可。因此,可以应用主定理情况1,于是 T ( n ) = Θ ( n l o g b a ) = Θ ( n l o g 3 4 ) T(n)=Θ(n^{{\rm log}_b a})=Θ(n^{{\rm log}_3 4}) T(n)=Θ(nlogba)=Θ(nlog34)
  
  b. T ( n ) = 3 T ( n / 3 ) + n / l g n T(n)=3T(n/3)+n/{\rm lg}n T(n)=3T(n/3)+n/lgn
  应用递归树方法,递归树如下图所示。
  在这里插入图片描述
  在递归树中,深度为 i i i的结点对应规模为 n / 3 i n/3^i n/3i的子问题。当 n / 3 i = 1 n/3^i = 1 n/3i=1时,即 i = l o g 3 n i = {\rm log}_3n i=log3n时,子问题规模变为 1 1 1,这对应于叶结点 T ( 1 ) T(1) T(1),因此叶结点的深度为 l o g 3 n {\rm log}_3n log3n
  每层的结点数都是上一层的 3 3 3倍,因此深度为i的结点数为 3 i 3^i 3i。并且由于深度为 i i i的结点对应的子问题规模为 n / 3 i n/3^i n/3i,故深度为 i i i的每个结点的代价为 c ( n / 3 i ) / l g ( n / 3 i ) c(n/3^i)/{\rm lg}(n/3^i) c(n/3i)/lg(n/3i)。因此,除叶结点外,深度为 i i i的所有结点的代价之和为 3 i • ( c ( n / 3 i ) / l g ( n / 3 i ) ) = c n / ( l g n − i • l g 3 ) 3^i•(c(n/3^i)/{\rm lg}(n/3^i))=cn/({\rm lg}n-i•{\rm lg}3) 3i(c(n/3i)/lg(n/3i))=cn/(lgnilg3)。又由于深度为 i i i的结点数为 3 i 3^i 3i,并且叶结点深度为 l o g 3 n {\rm log}_3n log3n,故叶结点一共有 3 l o g 3 n = n 3^{{\rm log}_3n}=n 3log3n=n个,于是所有叶结点的代价之和为 Θ ( n ) Θ(n) Θ(n)
  现在将每一层的代价加起来,得到
  在这里插入图片描述
  代入法证明省略。
  
  c. T ( n ) = 4 T ( n / 2 ) + n 2 n T(n)=4T(n/2)+n^2\sqrt{n} T(n)=4T(n/2)+n2n
  应用主定理,根据递归式有 a = 4 a = 4 a=4, b = 2 b = 2 b=2 f ( n ) = n 2 n = n 2.5 f(n)=n^2\sqrt{n}=n^{2.5} f(n)=n2n =n2.5,所以有 n l o g b a = n l o g 2 4 = n 2 n^{{\rm log}_ba}=n^{{\rm log}_2 4}=n^2 nlogba=nlog24=n2。于是有 f ( n ) = n 2.5 = Ω ( n 2 + ε ) = Ω ( n l o g b a + ε ) f(n)=n^{2.5}=Ω(n^{2+ε})=Ω(n^{{\rm log}_b a+ε}) f(n)=n2.5=Ω(n2+ε)=Ω(nlogba+ε),其中ε = 0.5。并且当 1 / 2 ≤ c < 1 1/\sqrt{2}≤c<1 1/2 c<1时,有 a f ( n / b ) = 4 f ( n / 2 ) = 4 • ( n / 2 ) 2.5 = n 2.5 / 2 ≤ c f ( n ) = c n 2.5 af(n/b)=4f(n/2)=4•(n/2)^{2.5}=n^{2.5}/\sqrt{2}≤cf(n)=cn^{2.5} af(n/b)=4f(n/2)=4(n/2)2.5=n2.5/2 cf(n)=cn2.5。因此,可以应用主定理情况3,于是 T ( n ) = Θ ( f ( n ) ) = Θ ( n 2.5 ) T(n) = Θ(f(n)) = Θ(n^{2.5}) T(n)=Θ(f(n))=Θ(n2.5)
  
  d. T ( n ) = 3 T ( n / 3 − 2 ) + n / 2 T(n)=3T(n/3-2)+n/2 T(n)=3T(n/32)+n/2
  猜想这个递归式的解应该和递归式 T ( n ) = 3 T ( n / 3 ) + n / 2 T(n)=3T(n/3)+n/2 T(n)=3T(n/3)+n/2的解一致,现在用主方法求解这个新的递归式。根据新的递归式有 a = 3 a = 3 a=3, b = 3 b = 3 b=3 f ( n ) = n / 2 f(n) = n/2 f(n)=n/2,所以有 n l o g b a = n l o g 3 3 = n n^{{\rm log}_b a}=n^{{\rm log}_3 3}=n nlogba=nlog33=n。于是有 f ( n ) = n / 2 = Θ ( n ) = Θ ( n l o g b a ) f(n)=n/2=Θ(n)=Θ(n^{{\rm log}_b a}) f(n)=n/2=Θ(n)=Θ(nlogba)。因此,可以应用主定理情况2,于是 T ( n ) = Θ ( n l o g b a l g n ) = Θ ( n l g n ) T(n)=Θ(n^{{\rm log}_b a}{\rm lg}n)=Θ(n{\rm lg}n) T(n)=Θ(nlogbalgn)=Θ(nlgn)
  下面将这个结果代入原递归式进行验证。我们要证明的是:存在正常数 c 1 c_1 c1 c 2 c_2 c2,使得 c 1 n l g n ≤ T ( n ) ≤ c 2 n l g n c_1n{\rm lg}n≤T(n)≤c_2n{\rm lg}n c1nlgnT(n)c2nlgn对足够大的 n n n都成立。然而,直接证明 c 1 n l g n ≤ T ( n ) ≤ c 2 n l g n c_1n{\rm lg}n≤T(n)≤c_2n{\rm lg}n c1nlgnT(n)c2nlgn很困难,我们不妨尝试证明 c 1 ( n + 3 ) l g ( n + 3 ) ≤ T ( n ) ≤ c 2 ( n + 3 ) l g ( n + 3 ) c_1 (n+3){\rm lg}(n+3)≤T(n)≤c_2 (n+3){\rm lg}(n+3) c1(n+3)lg(n+3)T(n)c2(n+3)lg(n+3)
  (1) 证明存在正常数 c 1 c_1 c1,使得 T ( n ) ≥ c 1 ( n + 3 ) l g ( n + 3 ) T(n)≥c_1(n+3){\rm lg}(n+3) T(n)c1(n+3)lg(n+3)对足够大的 n n n都成立
  将归纳假设代入递归式得到
  在这里插入图片描述
  现在要选取合适的 c 1 c_1 c1,使得不等式 c 1 ( n + 3 ) l g ( n + 3 ) − c 1 ( n + 3 ) l g 3 + n / 2 ≥ c 1 ( n + 3 ) l g ( n + 3 ) c_1 (n+3){\rm lg}(n+3)-c_1 (n+3){\rm lg}3+n/2≥c_1 (n+3){\rm lg}(n+3) c1(n+3)lg(n+3)c1(n+3)lg3+n/2c1(n+3)lg(n+3)成立。对这个不等式做一些变换。
  在这里插入图片描述
  显然, 1 2 ( 1 + 3 / n ) l g 3 \frac{1}{2(1+3/n){\rm lg}3} 2(1+3/n)lg31是关于 n n n的单调递增函数。为使递归式 T ( n ) = 3 T ( n / 3 − 2 ) + n / 2 T(n)=3T(n/3-2)+n/2 T(n)=3T(n/32)+n/2有意义,必须使 n ≥ 9 n ≥ 9 n9。当 n = 9 n = 9 n=9时, 1 2 ( 1 + 3 / n ) l g 3 \frac{1}{2(1+3/n){\rm lg}3} 2(1+3/n)lg31取得最小值 3 8 l g 3 \frac{3}{8{\rm lg}3} 8lg33。因此,只要取 c 1 ≤ 3 8 l g 3 c_1 ≤ \frac{3}{8{\rm lg}3} c18lg33,就能使得不等式 c 1 ≤ 1 2 ( 1 + 3 / n ) l g 3 c_1≤\frac{1}{2(1+3/n){\rm lg}3} c12(1+3/n)lg31成立,此时 T ( n ) ≥ c 1 ( n + 3 ) l g ( n + 3 ) T(n)≥c_1 (n+3){\rm lg}(n+3) T(n)c1(n+3)lg(n+3)成立。
  (2) 证明存在正常数 c 2 c_2 c2,使得 T ( n ) ≤ c 2 ( n + 3 ) l g ( n + 3 ) T(n)≤c_2 (n+3){\rm lg}(n+3) T(n)c2(n+3)lg(n+3)对足够大的 n n n都成立
  证明过程与前文类似的分析,最终得到:只要取 c 2 ≥ 1 2 l g 3 c_2 ≥ \frac{1}{2{\rm lg}3} c22lg31,就能使得不等式 T ( n ) ≤ c 2 ( n + 3 ) l g ( n + 3 ) T(n)≤c_2 (n+3){\rm lg}(n+3) T(n)c2(n+3)lg(n+3)成立。具体证明过程就不赘述。
  
  e. T ( n ) = 2 T ( n / 2 ) + n / l g n T(n)=2T(n/2)+n/{\rm lg}n T(n)=2T(n/2)+n/lgn
  该递归式的求解过程与b类似,其解也为 T ( n ) = Θ ( n l g l g n ) T(n)=Θ(n{\rm lglg}n) T(n)=Θ(nlglgn)。具体求解过程就不赘述。
  
  f. T ( n ) = T ( n / 2 ) + T ( n / 4 ) + T ( n / 8 ) + n T(n)=T(n/2)+T(n/4)+T(n/8)+n T(n)=T(n/2)+T(n/4)+T(n/8)+n
  应用递归树方法。递归树如下图所示。
  在这里插入图片描述
  这不是一棵满二叉树。从第 0 0 0层到第 l o g 8 n {\rm log}_8 n log8n层是满的,从第 l o g 8 n + 1 {\rm log}_8 n+1 log8n+1层到最底层是不满的。考虑从第 0 0 0层到第 l o g 8 n {\rm log}_8 n log8n层的代价,有
  在这里插入图片描述
  因此,可以得到 T ( n ) T(n) T(n)的下界为 Ω ( n ) Ω(n) Ω(n)。我们猜测 T ( n ) T(n) T(n)的上界也为 O ( n ) O(n) O(n)。于是,我们猜测的解为 T ( n ) = Θ ( n ) T(n) = Θ(n) T(n)=Θ(n)。下面将这个猜测代入原递归式进行验证。我们要证明的是:存在正常数 c 1 c_1 c1 c 2 c_2 c2,使得 c 1 n ≤ T ( n ) ≤ c 2 n c_1 n≤T(n)≤c_2 n c1nT(n)c2n对足够大的 n n n都成立。
  (1) 证明存在正常数 c 1 c_1 c1,使得 T ( n ) ≥ c 1 n T(n)≥c_1 n T(n)c1n对足够大的 n n n都成立
  将归纳假设代入递归式得到
  在这里插入图片描述
  现在要选取合适的 c 1 c_1 c1,使得不等式 7 8 c 1 n + n ≥ c 1 n \frac{7}{8} c_1 n+n≥c_1 n 87c1n+nc1n成立。将这个不等式做一下变换。
  在这里插入图片描述
  显然,只要取 c 1 ≤ 8 c_1 ≤ 8 c18,就能使得不等式 7 8 c 1 n + n ≥ c 1 n \frac{7}{8} c_1 n+n≥c_1 n 87c1n+nc1n成立,此时 T ( n ) ≥ c 1 n T(n)≥c_1 n T(n)c1n成立。
  (2) 证明存在正常数 c 2 c_2 c2,使得 T ( n ) ≤ c 2 n T(n)≤c_2 n T(n)c2n对足够大的 n n n都成立
  证明过程与上文类似,最终得到:只要取 c 2 ≥ 8 c_2 ≥ 8 c28,就能使得不等式 T ( n ) ≤ c 2 n T(n)≤c_2 n T(n)c2n成立。具体证明过程就不赘述。
  
  g. T ( n ) = T ( n − 1 ) + 1 / n T(n)=T(n-1)+1/n T(n)=T(n1)+1/n
  该递归式可以直接求解。根据递归式可以联立以下方程组。
  在这里插入图片描述
  将方程组中各方程相加,得到
  在这里插入图片描述
  左右两边约去相同项,得到
  在这里插入图片描述
  
  h. T ( n ) = T ( n − 1 ) + l g n T(n)=T(n-1)+{\rm lg}n T(n)=T(n1)+lgn
  该递归式可以直接求解。根据递归式可以联立下列方程组。
  在这里插入图片描述
  将方程组中各方程相加,得到
  在这里插入图片描述
  左右两边约去相同项,得到
  在这里插入图片描述
  
  i. T ( n ) = T ( n − 2 ) + 1 / l g n T(n)=T(n-2)+1/{\rm lg}n T(n)=T(n2)+1/lgn
  本题笔者解答不了,希望有高手能指教。
  
  j. T ( n ) = n T ( n ) + n T(n)=\sqrt{n}T(\sqrt{n})+n T(n)=n T(n )+n
  采用替代变量法。令 n = 2 m n = 2^m n=2m,那么递归式变为 T ( 2 m ) = 2 m / 2 ∙ T ( 2 m / 2 ) + 2 m T(2^m)=2^{m/2}∙T(2^{m/2})+2^m T(2m)=2m/2T(2m/2)+2m。再令 S ( m ) = T ( 2 m ) S(m)=T(2^m) S(m)=T(2m),得到 S ( m ) = 2 m / 2 • S ( m / 2 ) + 2 m S(m)=2^{m/2}•S(m/2)+2^m S(m)=2m/2S(m/2)+2m
  递归式 S ( m ) = 2 m / 2 • S ( m / 2 ) + 2 m S(m)=2^{m/2}•S(m/2)+2^m S(m)=2m/2S(m/2)+2m可以直接求解。假设 m m m为2的幂,可以联立下列方程组。
  在这里插入图片描述
  将方程组中各方程相加,并约去左右两边的相同项,得到
  在这里插入图片描述
  由于 n = 2 m n = 2^m n=2m,所以有 m = l g n m = {\rm lg}n m=lgn,代入上式得到
  在这里插入图片描述

  • 14
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值