练习 3-2 解答

Problem 1 (教材 4.3 节习题节选)

  1. 使用代入法证明 T(n)=4T(n/3)+nT(n) = 4T(n/3) + n 的解为 T(n)=Θ(nlog34)T(n) = \Theta(n^{\log_3 4}) 。(提示:需要在假设中减去一个低阶项以完成归纳)

  2. 利用换元法求解递归式 T(n)=3T(n)+lognT(n) = 3T(\sqrt{n}) + \log n 。你的解应该是渐近紧确的,不必担心数值是否是整数。

Solution
  1. 先证上界。假设 T(m)cmlog34dmT(m) \le cm^{\log_34} - dmm<nm < n 成立,则

T(n)4(c(n3)log34dn3)+n=cnlog34(4d31)ncnlog34dnT(n) \le 4(c(\frac{n}{3})^{\log_34} - d\frac{n}{3}) + n = cn^{\log_34} - (\frac{4d}{3} - 1)n \le cn^{\log_34} - dn

其中,最后一步在 d3d \ge 3 时成立。于是 T(n)=O(nlog34)T(n) = O(n^{\log_34})

再证下界。假设 T(m)cmlog34T(m) \ge cm^{\log_34}m<nm < n 成立,则

T(n)4c(n3)log34+n=cnlog34+ncnlog34T(n) \ge 4c(\frac{n}{3})^{\log_34} + n = cn^{\log_34} + n \ge cn^{\log_34}

于是,T(n)=Ω(nlog34)T(n) = \Omega(n^{\log_34}) ;综上, T(n)=Θ(nlog34)T(n) = \Theta(n^{\log_34})

  1. k=lognk = \log n ,则 T(2k)=3T(2k/2)+kT(2^k) = 3T(2^{k/2}) + k

S(k)=T(2k)S(k) = T(2^k) ,则 S(k)=3S(k/2)+kS(k) = 3S(k/2) + k

不难得到 S(k)=Θ(klog23)S(k) = \Theta(k^{\log_23}) ,从而 T(n)=Θ((logn)log23)T(n) = \Theta((\log n)^{\log_23})

Problem 2 (教材 4.4 节习题节选)

  1. 对递归式 T(n)=T(n1)+T(n/2)+nT(n) = T(n - 1) + T(n/2) + n ,利用递归树确定一个好的渐近上界,用代入法进行验证。

  2. 对递归式 T(n)=T(αn)+T((1α)n)+cnT(n) = T(\alpha n) + T((1-\alpha)n) + cn ,利用递归树给出一个渐近紧确界,其中 0<α<10 < \alpha < 1c>0c > 0 是常数。

Solution
  1. T(n)=O(2n)T(n) = O(2^n)

代入法验证:假设对于 m<nm < nT(m)2mT(m) \le 2^m ,则 T(n)2n1+2n/2+n2nT(n) \le 2^{n-1} + 2^{n/2} + n \le 2^n ,最后一步在 nn 较大时成立。

为了说明 2n2^n 是一个好的渐近上界,我们下面证明 T(n)T(n) 并不是多项式有界的。

反证法。若存在 c,kc, k 使得 T(m)cmk+o(mk)T(m) \le cm^k + o(m^k) ,使用代入法,应该有

T(n)c(n1)k+c(n2)k+n=c(1+12k)nk+o(nk)cnk+o(nk)T(n) \le c(n-1)^k + c(\frac{n}{2})^k + n = c(1 + \frac{1}{2^k})n^k + o(n^k) \le cn^k + o(n^k)

c(1+12k)nkcnkc(1 + \frac{1}{2^k})n^k \le cn^k 是不可能成立的,因此不存在这样的 c,kc, k ,从而 T(n)T(n) 不是多项式有界的。

  1. 两个子问题的规模之和为 αn+(1α)n=n\alpha n + (1-\alpha)n = n ,这和归并排序是类似的,画递归树也能够看出这一点。于是,可以猜测 T(n)=Θ(nlogn)T(n) = \Theta(n\log n)

先证下界。假设对 m<nm < nT(m)c1mlogmT(m) \ge c_1m\log m ,则

T(n)c1αnlog(αn)+c1(1α)nlog((1α)n)+cn=c1nlogn+n[c+c1(αlogα+(1α)log(1α))]c1nlogn\begin{aligned}
T(n) &\ge c_1\alpha n\log(\alpha n) + c_1(1-\alpha)n\log((1-\alpha)n) + cn \
&= c_1n\log n + n[c + c_1(\alpha\log\alpha + (1-\alpha)\log(1-\alpha))]\
&\ge c_1n\log n
\end{aligned}

其中,最后一步需要 c1cαlogα+(1α)log(1α)c_1 \le \frac{-c}{\alpha\log\alpha + (1-\alpha)\log(1-\alpha)} 。于是 T(n)=Ω(nlogn)T(n) = \Omega(n\log n)

再证上界。假设对 m<nm < nT(m)c2mlogmT(m) \le c_2m\log m ,则

T(n)c2αnlog(αn)+c2(1α)nlog((1α)n)+cn=c2nlogn+n[c+c2(αlogα+(1α)log(1α))]c2nlogn\begin{aligned}
T(n) &\le c_2\alpha n\log(\alpha n) + c_2(1-\alpha)n\log((1-\alpha)n) + cn \
&= c_2n\log n + n[c + c_2(\alpha\log\alpha + (1-\alpha)\log(1-\alpha))]\
&\le c_2n\log n
\end{aligned}

其中,最后一步需要 c2cαlogα+(1α)log(1α)c_2 \ge \frac{-c}{\alpha\log\alpha + (1-\alpha)\log(1-\alpha)} 。于是 T(n)=O(nlogn)T(n) = O(n\log n)

综上, T(n)=Θ(nlogn)T(n) = \Theta(n\log n) ,这是一个渐近紧确界。

Problem 3 (教材习题 4.5-1)

对下列递归式,使用主方法求出渐近紧确界。

  1. T(n)=2T(n/4)+1T(n) = 2T(n/4) + 1

  2. T(n)=2T(n/4)+nT(n) = 2T(n/4) + \sqrt{n}

  3. T(n)=2T(n/4)+nT(n) = 2T(n/4) + n

  4. T(n)=2T(n/4)+n2T(n) = 2T(n/4) + n^2

Solution
  1. 主定理情况 1 , T(n)=Θ(n)T(n) = \Theta(\sqrt{n})

  2. 主定理情况 2 , T(n)=Θ(nlogn)T(n) = \Theta(\sqrt{n}\log n)

  3. 主定理情况 3 , T(n)=Θ(n)T(n) = \Theta(n)

  4. 主定理情况 3 , T(n)=Θ(n2)T(n) = \Theta(n^2)

Problem 4 (教材习题 4.5-2)

熊教授想设计一个渐近快于 Strassen 算法的矩阵相乘算法。他的算法使用分治方法,将每个矩阵分解为 n/4×n/4n/4 \times n/4 的子矩阵,分解和合并步骤共花费 Θ(n2)\Theta(n^2) 时间。他需要确定,他的算法需要创建多少个子问题,才能击败 Strassen 算法。如果他的算法创建 aa 个子问题,则描述运行时间 T(n)T(n) 的递归式为 T(n)=aT(n/4)+Θ(n2)T(n) = aT(n/4) + \Theta(n^2) 。 熊教授的算法如果要渐近快于 Strassen 算法, aa 的最大整数值应是多少?

Solution

Strassen 算法的复杂度为 Θ(nlog27)\Theta(n^{\log_27}) 。因为要求 aa 的最大值,考虑 a>16a > 16 的情况,用主方法可求得熊教授算法的复杂度为 Θ(nlog4a)\Theta(n^{\log_4a}) 。如果熊教授的算法要渐近快于 Strassen ,那么需要 log4a<log27\log_4a < \log_27 ,解得 a<49a < 49 ,于是 aa 的最大整数值为 4848

Problem 5 (教材习题 4.5-5)

考虑主定理情况 3 的一部分:对某个常数 c<1c < 1 ,正则条件 af(n/b)cf(n)af(n/b) \le cf(n) 是否成立。给出一个例子,其中常数 a1,b>1a \ge 1, b > 1 且函数 f(n)f(n) 满足主定理情况 3 中除正则条件外的所有条件。

Solution

考虑 T(n)=T(n/3)+f(n)T(n) = T(n/3) + f(n) ,其中

f(n)={3n+23n,if n=2i,iN3n,otherwisef(n) = \begin{cases}
3n + 2^{3n}, &\text{if } n = 2^i, i\in\mathbb{N}\
3n, &\text{otherwise}
\end{cases}

满足 f(n)=Ω(nlog31+ε)=Ω(nε)f(n) = \Omega(n^{\log_31+\varepsilon}) = \Omega(n^{\varepsilon}) 的条件,但是不满足正则条件 f(n/3)cf(n),c<1f(n/3) \le cf(n), c<1

n=32i,iNn = 3\cdot 2^{i}, i\in\mathbb{N} ,有

f(n/3)=n+2n>3n=f(n)f(n/3) = n + 2^n > 3n = f(n)

是不满足正则条件的反例。

Problem 6 (教材习题 4.6-2)

证明:如果 f(n)=Θ(nlogbalogkn)f(n) = \Theta(n^{\log_b a}\log^k n) ,其中 k0k \ge 0 ,那么主递归式的解为 T(n)=Θ(nlogbalogk+1n)T(n) = \Theta(n^{\log_b a}\log^{k+1} n) 。为简单起见,假定 nnbb 的幂。

Solution

证明:根据引理4.2(见第3讲PPT第44页,教材4.6节),有

T(n)=Θ(nlogba)+j=0logbn1ajf(n/bj)T(n) = \Theta(n^{\log_ba}) + \sum_{j = 0}^{\log_bn-1}a^jf(n/b^j)

考虑和式

g(n)=j=0logbn1ajf(n/bj)g(n) = \sum_{j = 0}^{\log_bn-1}a^jf(n/b^j)

f(n)=Θ(nlogbalogkn)f(n) = \Theta(n^{\log_b a}\log^k n)

f(n/bj)=Θ((n/bj)logbalogk(n/bj))=Θ((nlogba/aj)(logblogb(n/bj))k)f(n/b^j) = \Theta((n/b^j)^{\log_b a}\log^k(n/b^j)) = \Theta((n^{\log_b a} / a^j)(\log b\log_b(n/b^j))^k)

于是

ajf(n/bj)=Θ(nlogbalogkblogbk(n/bj))=Θ(nlogba(logb(n)j)k)=Θ(nlogbalogbk(n))a^jf(n/b^j) = \Theta(n^{\log_b a}\log^kb\log_b^k(n/b^j)) = \Theta(n^{\log_b a}(\log_b(n) - j)^k) = \Theta(n^{\log_b a}\log^k_b(n))

其中,最后一步用到了 j<logb(n)j < \log_b(n)

继而

g(n)=j=0logbn1ajf(n/bj)=Θ(j=0logbn1nlogbalogbk(n))=Θ(nlogbalogbk+1(n))=Θ(nlogbalogk+1(n))\begin{aligned}
g(n) &= \sum_{j = 0}^{\log_bn-1}a^jf(n/b^j) = \Theta(\sum_{j = 0}^{\log_bn-1} n^{\log_b a}\log^k_b(n))\
&= \Theta(n^{\log_b a}\log^{k+1}_b(n)) = \Theta(n^{\log_b a}\log^{k+1}(n))
\end{aligned}

所以, T(n)=Θ(nlogbalogk+1n)T(n) = \Theta(n^{\log_b a}\log^{k+1} n)

Problem 7 (教材习题 4.6-3)

证明:主定理中的情况 3 被过分强调了,从某种意义上来说,对于某个常数 c<1c < 1 ,正则条件 af(n/b)cf(n)af(n/b) \le cf(n) 成立本身就意味着存在常数 ε>0\varepsilon > 0 ,使得 f(n)=Ω(nlogba+ε)f(n) = \Omega(n^{\log_b a + \varepsilon})

Solution

证明:根据正则条件,不断迭代,有

f(n)acf(nb)(ac)2f(nb2)(ac)if(nbi)(ac)logbnf(1)f(n)\ge \frac{a}{c} f(\frac{n}{b}) \ge (\frac{a}{c})^2 f(\frac{n}{b^2}) \ge \cdots \ge (\frac{a}{c})^i f(\frac{n}{b^i}) \ge \cdots \ge (\frac{a}{c})^{\log_bn} f(1)

f(n)=Ω((a/c)logbn)=Ω(nlogb(a/c))=Ω(nlogba+logb(1/c))f(n) = \Omega((a/c)^{\log_bn}) = \Omega(n^{\log_b(a/c)}) = \Omega(n^{\log_ba + \log_b(1/c)})

ε=logb(1/c)>0,c<1\varepsilon = \log_b(1/c) > 0, c<1 ,则 f(n)=Ω(nlogba+ε)f(n) = \Omega(n^{\log_b a + \varepsilon})