【算法导论】第4章 分而治之 (3)


Introduction to Algorithms - Third Edition
Part I. Foundations
Chapter 4. Divide-and-Conquer


★ \bigstar 4.6 主定理的证明

4.6.1 取正合幂时的证明

假设 n n n b > 1 b>1 b>1 的正合幂,其中 b b b 不必是整数,分析主方法中的递归式 (4.20)
T ( n ) = a T ( n / b ) + f ( n ) T(n) = aT(n/b) + f(n) T(n)=aT(n/b)+f(n)
将分析分成 3 个引理来说明。
第1个引理,将求解主递归式的问题,归约为对包含总和的表达式求值的问题。
第2个引理,确定这个总和的界限。
第3个引理,将前两个结合一起,证明:在 n n n b b b 的正合幂的情况下,主定理成立。

引理 4.2
a ≥ 1 a \ge 1 a1 b > 1 b > 1 b>1 是常数,设 f ( n ) f(n) f(n) 是定义在 b b b 的正合幂上的非负函数。在 b b b 的正合幂上定义 T ( n ) T(n) T(n)
T ( n ) = { Θ ( 1 ) if  n = 1 a T ( n / b ) + f ( n ) if  n = b i T(n) = \begin{cases} \Theta(1) &\text{if } n=1 \\ aT(n/b) + f(n) &\text{if } n=b^i \end{cases} T(n)={Θ(1)aT(n/b)+f(n)if n=1if n=bi
其中, i i i 是正整数。则有
T ( n ) = Θ ( n log ⁡ b a ) + ∑ j = 0 log ⁡ b n − 1 a j f ( n / b j ) T(n) = \Theta(n^{\log_ba}) + \sum_{j=0}^{\log_bn-1}a^jf(n/b^j) T(n)=Θ(nlogba)+j=0logbn1ajf(n/bj)。     (4.21)

证明 使用递归树,如下图。树的根节点的代价是 f ( n ) f(n) f(n),有 a a a 个子节点,每个代价为 f ( n / b ) f(n/b) f(n/b)
一般地,在第 j j j 层,有 a j a^j aj 个节点,每个代价为 F ( n / b j ) F(n/b^j) F(n/bj)。叶子节点的代价为 T ( 1 ) = Θ ( 1 ) T(1) = \Theta(1) T(1)=Θ(1),且每个叶子节点在第 log ⁡ b n \log_bn logbn 层,因为 n / b log ⁡ b n = 1 n/b^{\log_b n} = 1 n/blogbn=1。树上有 a log ⁡ b n = n log ⁡ b a a^{\log_bn} = n^{\log_ba} alogbn=nlogba 个叶子节点。

递归树
将树上的每层节点的代价加起来。
所有内部节点的总代价为 ∑ j = 0 log ⁡ b n − 1 a j f ( n / b j ) \sum_{j=0}^{\log_bn-1}a^jf(n/b^j) j=0logbn1ajf(n/bj)。在基础的分治算法中,该总和表示将问题分成子问题然后重新组合子问题的代价。
所有叶子节点的代价是 Θ ( log ⁡ b a ) \Theta(\log_ba) Θ(logba),表示解所有 n log ⁡ b a n^{\log_ba} nlogba 个大小为 1 的子问题的代价。

就递归树而言,主方法的三种情况对应于树中总代价的三种情况:①由叶子节点的代价决定;②均匀地分布在树的各个层次上;③由根节点的代价决定。

式 (4.21) 的总和表示基础分治算法中分解与合并步骤的代价。

引理 4.3
a ≥ 1 a \ge 1 a1 b > 1 b > 1 b>1 是常数,设 f ( n ) f(n) f(n) 是定义在 b b b 的正合幂上的非负函数。函数 g ( n ) g(n) g(n) 定义在 b b b 的正合幂上:
g ( n ) = ∑ j = 0 log ⁡ b n − 1 a j f ( n / b j ) g(n) = \sum_{j=0}^{\log_bn-1}a^jf(n/b^j) g(n)=j=0logbn1ajf(n/bj)     (4.22)
b b b 的正合幂,有下面的渐近界:

  1. 如果存在常数 ϵ > 0 \epsilon > 0 ϵ>0,有 f ( n ) = O ( n log ⁡ b a − ϵ ) f(n) = O(n^{\log_ba - \epsilon}) f(n)=O(nlogbaϵ),那么 g ( n ) = O ( n log ⁡ b a ) g(n) = O(n^{\log_ba}) g(n)=O(nlogba)
  2. 如果 f ( n ) = Θ ( n log ⁡ b a ) f(n) = \Theta(n^{\log_ba}) f(n)=Θ(nlogba),那么 g ( n ) = Θ ( n log ⁡ b a lg ⁡ n ) g(n) = \Theta(n^{\log_ba}\lg n) g(n)=Θ(nlogbalgn)
  3. 如果对于所有足够大的 n n n,存在常数 c < 1 c < 1 c<1,有 a f ( n / b ) ≤ c f ( n ) af(n/b) \le cf(n) af(n/b)cf(n),那么 g ( n ) = Θ ( f ( n ) ) g(n) = \Theta(f(n)) g(n)=Θ(f(n))

证明 对于情况1,有 f ( n ) = O ( n log ⁡ b a − ϵ ) f(n) = O(n^{\log_ba - \epsilon}) f(n)=O(nlogbaϵ),得出 f ( n / b j ) = O ( ( n / b j ) log ⁡ b a − ϵ ) f(n/b^j) = O((n/b^j)^{\log_ba-\epsilon}) f(n/bj)=O((n/bj)logbaϵ)。将其代入式 (4.22),得
g ( n ) = O ( ∑ j = 0 log ⁡ b n − 1 a j ( n / b j ) log ⁡ b a − ϵ ) g(n) = O(\sum_{j=0}^{\log_bn-1}a^j (n/b^j)^{\log_ba-\epsilon}) g(n)=O(j=0logbn1aj(n/bj)logbaϵ)。     (4.23)

∑ j = 0 log ⁡ b n − 1 a j ( n / b j ) log ⁡ b a − ϵ = n log ⁡ b a − ϵ ∑ j = 0 log ⁡ b n − 1 ( a b ϵ / b log ⁡ b a ) j = n log ⁡ b a − ϵ ∑ j = 0 log ⁡ b n − 1 ( b ϵ ) j = n log ⁡ b a − ϵ ( b ϵ log ⁡ b n − 1 b ϵ − 1 ) = n log ⁡ b a − ϵ ( n ϵ − 1 b ϵ − 1 ) \sum_{j=0}^{\log_bn-1}a^j (n/b^j)^{\log_ba-\epsilon} = n^{\log_ba-\epsilon} \sum_{j=0}^{\log_bn-1} (ab^{\epsilon} / b^{\log_ba})^j \\ = n^{\log_ba-\epsilon} \sum_{j=0}^{\log_bn-1} (b^{\epsilon})^j = n^{\log_ba-\epsilon} (\frac{b^{\epsilon \log_bn} - 1}{b^{\epsilon}-1}) \\ = n^{\log_ba-\epsilon} ( \frac{n^{\epsilon} - 1}{b^{\epsilon}-1}) j=0logbn1aj(n/bj)logbaϵ=nlogbaϵj=0logbn1(abϵ/blogba)j=nlogbaϵj=0logbn1(bϵ)j=nlogbaϵ(bϵ1bϵlogbn1)=nlogbaϵ(bϵ1nϵ1)
因为 b b b ϵ \epsilon ϵ 是常数,所以可将最后一个表达式写为 n log ⁡ b a − ϵ O ( n ϵ ) = O ( n log ⁡ b a ) n^{\log_ba-\epsilon}O(n^{\epsilon}) = O(n^{\log_b a}) nlogbaϵO(nϵ)=O(nlogba)
将该表达式代入式 (4.23),得 g ( n ) = O ( n log ⁡ b a ) g(n) = O(n^{\log_b a}) g(n)=O(nlogba),情况1 即证。

情况2,有 f ( n ) = Θ ( n log ⁡ b a ) f(n) = \Theta(n^{\log_ba}) f(n)=Θ(nlogba),得 f ( n / b j ) = Θ ( ( n / b j ) log ⁡ b a ) f(n/b^j) = \Theta((n/b^j)^{\log_ba}) f(n/bj)=Θ((n/bj)logba)。代入式 (4.22),得
g ( n ) = Θ ( ∑ j = 0 log ⁡ b n − 1 a j ( n / b j ) log ⁡ b a ) g(n) = \Theta(\sum_{j=0}^{\log_bn-1}a^j (n/b^j)^{\log_ba}) g(n)=Θ(j=0logbn1aj(n/bj)logba)。     (4.24)

∑ j = 0 log ⁡ b n − 1 a j ( n / b j ) log ⁡ b a = n log ⁡ b a ∑ j = 0 log ⁡ b n − 1 ( a / b log ⁡ b a ) j = n log ⁡ b a ∑ j = 0 log ⁡ b n − 1 1 = n log ⁡ b a log ⁡ b n \sum_{j=0}^{\log_bn-1}a^j (n/b^j)^{\log_ba} = n^{\log_ba} \sum_{j=0}^{\log_bn-1} (a / b^{\log_ba})^j = n^{\log_ba} \sum_{j=0}^{\log_bn-1} 1 = n^{\log_ba} \log_bn j=0logbn1aj(n/bj)logba=nlogbaj=0logbn1(a/blogba)j=nlogbaj=0logbn11=nlogbalogbn

代入式 (4.24),得 g ( n ) = Θ ( n log ⁡ b a log ⁡ b n ) = Θ ( n log ⁡ b a lg ⁡ n ) g(n) = \Theta(n^{\log_ba} \log_bn) = \Theta(n^{\log_ba} \lg n) g(n)=Θ(nlogbalogbn)=Θ(nlogbalgn),情况2 即证。

情况3,因为 f ( n ) f(n) f(n) 出现在 g ( n ) g(n) g(n) 的定义式 (4.22) 中,且 g ( n ) g(n) g(n) 的所有项都非负,所以 g ( n ) = Ω ( f ( n ) ) g(n) = \Omega(f(n)) g(n)=Ω(f(n)) b b b 的正合幂成立。
将假设语句重写成 f ( n / b ) ≤ ( c / a ) f ( n ) f(n/b) \le (c/a)f(n) f(n/b)(c/a)f(n),迭代 j j j 次,得 f ( n / b j ) ≤ ( c / a ) j f ( n ) f(n/b^j) \le (c/a)^j f(n) f(n/bj)(c/a)jf(n),假设迭代的值足够大,即假设 n / b j − 1 n/b^{j-1} n/bj1 足够大。

代入式 (4.22),当 n n n 足够大这个假设不成立时,使用 O ( 1 ) O(1) O(1) 项进行补偿。
g ( n ) = ∑ j = 0 log ⁡ b n − 1 a j f ( n / b j ) ≤ ∑ j = 0 log ⁡ b n − 1 c j f ( n ) + O ( 1 ) ≤ f ( n ) ∑ j = 0 ∞ c j + O ( 1 ) = f ( n ) 1 1 − c + O ( 1 ) = O ( f ( n ) ) g(n) = \sum_{j=0}^{\log_bn-1}a^jf(n/b^j) \le \sum_{j=0}^{\log_bn-1}c^jf(n) + O(1) \\ \le f(n)\sum_{j=0}^{\infty}c^j + O(1) =f(n) \frac{1}{1-c} + O(1) = O(f(n)) g(n)=j=0logbn1ajf(n/bj)j=0logbn1cjf(n)+O(1)f(n)j=0cj+O(1)=f(n)1c1+O(1)=O(f(n))
因为 c c c 是常数。因此, g ( n ) = Θ ( f ( n ) ) g(n) = \Theta(f(n)) g(n)=Θ(f(n)) 对于 b b b 的正合幂成立,情况3 即证。

引理 4.4
a ≥ 1 a \ge 1 a1 b > 1 b > 1 b>1 是常数,设 f ( n ) f(n) f(n) 是定义在 b b b 的正合幂上的非负函数。在 b b b 的正合幂上定义 T ( n ) T(n) T(n)
T ( n ) = { Θ ( 1 ) if  n = 1 a T ( n / b ) + f ( n ) if  n = b i T(n) = \begin{cases} \Theta(1) &\text{if } n=1 \\ aT(n/b) + f(n) &\text{if } n=b^i \end{cases} T(n)={Θ(1)aT(n/b)+f(n)if n=1if n=bi
其中, i i i 是正整数。那么,对 b b b 的正合幂, T ( n ) T(n) T(n) 有下面的渐近界:

  1. 如果存在常数 ϵ > 0 \epsilon > 0 ϵ>0,有 f ( n ) = O ( n log ⁡ b a − ϵ ) f(n) = O(n^{\log_ba - \epsilon}) f(n)=O(nlogbaϵ),那么 T ( n ) = Θ ( n log ⁡ b a ) T(n) = \Theta(n^{\log_ba}) T(n)=Θ(nlogba)
  2. 如果 f ( n ) = Θ ( n log ⁡ b a ) f(n) = \Theta(n^{\log_ba}) f(n)=Θ(nlogba),那么 T ( n ) = Θ ( n log ⁡ b a lg ⁡ n ) T(n) = \Theta(n^{\log_ba}\lg n) T(n)=Θ(nlogbalgn)
  3. 如果对于所有足够大的 n n n,存在常数 c < 1 c < 1 c<1,有 a f ( n / b ) ≤ c f ( n ) af(n/b) \le cf(n) af(n/b)cf(n),那么 T ( n ) = Θ ( f ( n ) ) T(n) = \Theta(f(n)) T(n)=Θ(f(n))

证明 使用引理 4.3 中的界,对引理 4.2 中的求和式 (4.21) 进行求值。
情况1,有 T ( n ) = Θ ( n log ⁡ b a ) + O ( n log ⁡ b a ) = Θ ( n log ⁡ b a ) T(n) = \Theta(n^{\log_ba}) + O(n^{\log_ba}) = \Theta(n^{\log_ba}) T(n)=Θ(nlogba)+O(nlogba)=Θ(nlogba)
情况2, T ( n ) = Θ ( n log ⁡ b a ) + Θ ( n log ⁡ b a lg ⁡ n ) = Θ ( n log ⁡ b a lg ⁡ n ) T(n) = \Theta(n^{\log_ba}) + \Theta(n^{\log_ba}\lg n) = \Theta(n^{\log_ba}\lg n) T(n)=Θ(nlogba)+Θ(nlogbalgn)=Θ(nlogbalgn)
情况3, T ( n ) = Θ ( n log ⁡ b a ) + Θ ( f ( n ) ) = Θ ( f ( n ) ) T(n) = \Theta(n^{\log_ba}) + \Theta(f(n)) = \Theta(f(n)) T(n)=Θ(nlogba)+Θ(f(n))=Θ(f(n)),因为 f ( n ) = Ω ( n log ⁡ b a + ϵ ) f(n) = \Omega(n^{\log_ba + \epsilon}) f(n)=Ω(nlogba+ϵ)

4.6.2 上取整函数和下取整函数

要完整证明主定理,需将分析扩展至,主递归式中出现上取整函数和下取整函数的情况,这样递归式定义在所有整数上。
下界: T ( n ) = a T ( ⌈ n / b ⌉ ) + f ( n ) T(n) = aT(\lceil n/b \rceil) + f(n) T(n)=aT(n/b)+f(n)     (4.25)
上界: T ( n ) = a T ( ⌊ n / b ⌋ ) + f ( n ) T(n) = aT(\lfloor n/b \rfloor) + f(n) T(n)=aT(n/b)+f(n)     (4.26)

考虑上界的情况:
递归树
在递归树中从上至下,其自变量 n j n_j nj 可以表示为:
n j = { n if  j = 0 ⌈ n j − 1 / b ⌉ if  j > 0 n_j = \begin{cases} n &\text{if } j=0 \\ \lceil n_{j-1}/b \rceil &\text{if } j>0 \end{cases} nj={nnj1/bif j=0if j>0     (4.27)

确定深度 k k k,使 n k n_k nk 是一个常数。使用不等式 ⌈ x ⌉ ≤ x + 1 \lceil x \rceil \le x + 1 xx+1,得
n 0 ≤ n n_0 \le n n0n
n 1 ≤ n b + 1 n_1 \le \frac{n}{b} + 1 n1bn+1
n 2 ≤ n b 2 + 1 b + 1 n_2 \le \frac{n}{b^2} + \frac{1}{b} + 1 n2b2n+b1+1
……
n j ≤ n b j + ∑ i = 0 j − 1 1 b i < n b j + ∑ i = 0 ∞ 1 b i = n b j + b b − 1 n_j \le \frac{n}{b^j} + \sum_{i=0}^{j-1} \frac{1}{b^i} < \frac{n}{b^j} + \sum_{i=0}^{\infty} \frac{1}{b^i} = \frac{n}{b^j} + \frac{b}{b-1} njbjn+i=0j1bi1<bjn+i=0bi1=bjn+b1b

j = ⌊ log ⁡ b n ⌋ j = \lfloor \log_b n \rfloor j=logbn,有 n ⌊ log ⁡ b n ⌋ < n b ⌊ log ⁡ b n ⌋ + b b − 1 < n b log ⁡ b n − 1 + b b − 1 = n n / b + b b − 1 = b + b b − 1 = O ( 1 ) n_{\lfloor \log_b n \rfloor} < \frac{n}{b^{\lfloor \log_b n \rfloor} } + \frac{b}{b-1} < \frac{n}{b^{\log_b n -1} } + \frac{b}{b-1} = \frac{n}{n/b} + \frac{b}{b-1} = b + \frac{b}{b-1} = O(1) nlogbn<blogbnn+b1b<blogbn1n+b1b=n/bn+b1b=b+b1b=O(1)
因此,在深度 ⌊ log ⁡ b n ⌋ \lfloor \log_b n \rfloor logbn,问题规模为常数。

从上图中,得 T ( n ) = Θ ( n log ⁡ b a ) + ∑ j = 0 ⌊ log ⁡ b n ⌋ − 1 a j f ( n j ) T(n) = \Theta(n^{\log_ba}) + \sum_{j=0}^{\lfloor\log_bn\rfloor-1 }a^j f(n_j) T(n)=Θ(nlogba)+j=0logbn1ajf(nj)。     (4.28)
与式 (4.21) 类似,但是 n n n 可以是任意整数。
与引理 4.3 相似的证明方式,求值 g ( n ) = ∑ j = 0 ⌊ log ⁡ b n ⌋ − 1 a j f ( n j ) g(n) = \sum_{j=0}^{\lfloor\log_bn\rfloor-1}a^j f(n_j) g(n)=j=0logbn1ajf(nj)。     (4.29)

情况3,如果对于 n > b + b / ( b − 1 ) n > b + b/(b-1) n>b+b/(b1),有 a f ( ⌈ n / b ⌉ ) ≤ c f ( n ) af(\lceil n/b \rceil) \le cf(n) af(n/b)cf(n),其中常数 c < 1 c<1 c<1,那么 a j f ( n j ) ≤ c j f ( n ) a^j f(n_j) \le c^j f(n) ajf(nj)cjf(n)。因此,类似引理 4.3,对式 (4.29) 求值。

情况2,有 f ( n ) = Θ ( n log ⁡ b a ) f(n) = \Theta(n^{\log_ba}) f(n)=Θ(nlogba)。如果可以证明 f ( n j ) = O ( n log ⁡ a b / a j ) = O ( ( n / b j ) log ⁡ b a ) f(n_j) = O(n^{\log_a b}/a^j) = O((n/b^j)^{\log_ba}) f(nj)=O(nlogab/aj)=O((n/bj)logba),那么就能套用引理 4.3 的情况2 的证明。
j ≤ ⌊ log ⁡ b n ⌋ j \le \lfloor \log_b n \rfloor jlogbn,得 b j / n ≤ 1 b^j/n \le 1 bj/n1
由界 f ( n ) = O ( n log ⁡ b a ) f(n) = O(n^{\log_b a}) f(n)=O(nlogba),得,存在常数 c > 0 c>0 c>0,对所有足够大的 n j n_j nj,有
f ( n j ) ≤ c ( n b j + b b − 1 ) log ⁡ b a = c ( n b j ( 1 + b j n ⋅ b b − 1 ) ) log ⁡ b a = c ( n log ⁡ b a a j ) ( 1 + b j n ⋅ b b − 1 ) log ⁡ b a ≤ c ( n log ⁡ b a a j ) ( 1 + b b − 1 ) log ⁡ b a = O ( n log ⁡ b a a j ) f(n_j) \le c(\frac{n}{b^j} + \frac{b}{b-1})^{\log_b a} = c(\frac{n}{b^j}(1 + \frac{b^j}{n} \cdot \frac{b}{b-1}))^{\log_b a} = c(\frac{n^{\log_ba}}{a^j})(1 + \frac{b^j}{n} \cdot \frac{b}{b-1})^{\log_b a} \\ \le c(\frac{n^{\log_ba}}{a^j})(1 + \frac{b}{b-1})^{\log_b a} = O(\frac{n^{\log_ba}}{a^j}) f(nj)c(bjn+b1b)logba=c(bjn(1+nbjb1b))logba=c(ajnlogba)(1+nbjb1b)logbac(ajnlogba)(1+b1b)logba=O(ajnlogba)
因为 c ( 1 + b / ( b − 1 ) ) c(1+b/(b-1)) c(1+b/(b1)) 是一个常数。
因此,情况2 即证。

情况1,关键在于证明界 f ( n j ) = O ( n log ⁡ b a − ϵ ) f(n^j) = O(n^{\log_ba - \epsilon}) f(nj)=O(nlogbaϵ),与情况2 中对于部分的证明类似。

至此,证明了对于所有整数 n n n 的主定理的上界,下界的证明类似。

练习

4.6-1 ★ \bigstar 在式 (4.27) 中,若 b b b 是个正整数,而不是任意实数,给出 n j n_j nj 的一个简单且准确的表达式。
解: 对于任意实数 x ≥ 0 x\ge0 x0 和整数 a , b > 0 a,b>0 a,b>0,有式 (3.4), ⌈ ⌈ x / a ⌉ b ⌉ = ⌈ x a b ⌉ \lceil \frac{\lceil x/a \rceil}{b} \rceil = \lceil \frac{x}{ab}\rceil bx/a=abx。则有
n 0 = n n_0 = n n0=n
n 1 = ⌈ n / b ⌉ n_1 = \lceil n/b \rceil n1=n/b
n 2 = ⌈ n 1 / b ⌉ = ⌈ n / b 2 ⌉ n_2 = \lceil n_1/b \rceil = \lceil n/b^2 \rceil n2=n1/b=n/b2
……
一般地, n j = ⌈ n / b j ⌉ n_j = \lceil n/b^j \rceil nj=n/bj

4.6-2 ★ \bigstar 证明:如果 f ( n ) = Θ ( n log ⁡ b a lg ⁡ k n ) f(n) = \Theta(n^{\log_ba} \lg^kn) f(n)=Θ(nlogbalgkn),其中 k > 0 k>0 k>0,那么,主定理中递归式的解为 T ( n ) = Θ ( n log ⁡ b a lg ⁡ k + 1 n ) T(n) = \Theta(n^{\log_ba} \lg^{k+1}n) T(n)=Θ(nlogbalgk+1n)。为简单起见,可以只对 b b b 的整数幂分析。
证: 式 (4.21), T ( n ) = Θ ( n log ⁡ b a ) + ∑ j = 0 log ⁡ b n − 1 a j f ( n / b j ) T(n) = \Theta(n^{\log_ba}) + \sum_{j=0}^{\log_bn-1}a^jf(n/b^j) T(n)=Θ(nlogba)+j=0logbn1ajf(n/bj)

g ( n ) = ∑ j = 0 log ⁡ b n − 1 a j f ( n / b j ) = ∑ j = 0 log ⁡ b n − 1 a j Θ ( ( n / b j ) log ⁡ b a lg ⁡ k ( n / b j ) ) = ∑ j = 0 log ⁡ b n − 1 a j Θ ( ( n log ⁡ b a / a j ) lg ⁡ k ( n / b j ) ) = ∑ j = 0 log ⁡ b n − 1 Θ ( n log ⁡ b a lg ⁡ k ( n / b j ) ) = Θ ( n log ⁡ b a ) ∑ j = 0 log ⁡ b n − 1 lg ⁡ k ( n / b j ) g(n) = \sum_{j=0}^{\log_bn-1}a^jf(n/b^j) = \sum_{j=0}^{\log_bn-1}a^j \Theta((n/b^j)^{\log_ba} \lg^k (n/b^j)) \\ = \sum_{j=0}^{\log_bn-1}a^j \Theta((n^{\log_ba}/a^j) \lg^k (n/b^j)) \\ = \sum_{j=0}^{\log_bn-1} \Theta(n^{\log_ba} \lg^k (n/b^j)) \\ = \Theta(n^{\log_ba})\sum_{j=0}^{\log_bn-1} \lg^k (n/b^j) g(n)=j=0logbn1ajf(n/bj)=j=0logbn1ajΘ((n/bj)logbalgk(n/bj))=j=0logbn1ajΘ((nlogba/aj)lgk(n/bj))=j=0logbn1Θ(nlogbalgk(n/bj))=Θ(nlogba)j=0logbn1lgk(n/bj)

h ( n ) = ∑ j = 0 log ⁡ b n − 1 lg ⁡ k ( n / b j ) ≤ ∑ j = 0 log ⁡ b n − 1 lg ⁡ k n = log ⁡ b n ⋅ lg ⁡ k n = lg ⁡ k + 1 n / lg ⁡ b h(n) = \sum_{j=0}^{\log_bn-1} \lg^k (n/b^j) \le \sum_{j=0}^{\log_bn-1} \lg^k n = \log_bn\cdot\lg^k n = \lg^{k+1}n/\lg b h(n)=j=0logbn1lgk(n/bj)j=0logbn1lgkn=logbnlgkn=lgk+1n/lgb,其中 lg ⁡ b \lg b lgb 为常数。
所以, h ( n ) = O ( lg ⁡ k + 1 n ) h(n) = O(\lg^{k+1}n) h(n)=O(lgk+1n)

h ( n ) = ∑ j = 0 ( log ⁡ b n − 1 ) / 2 lg ⁡ k ( n / b j ) + ∑ j = ( log ⁡ b n + 1 ) / 2 log ⁡ b n − 1 lg ⁡ k ( n / b j ) ≥ ∑ j = 0 ( log ⁡ b n − 1 ) / 2 lg ⁡ k ( n / b ( log ⁡ b n − 1 ) / 2 ) = ( ( log ⁡ b n − 1 ) / 2 + 1 ) ⋅ lg ⁡ k ( n / b ( log ⁡ b n − 1 ) / 2 ) = ( ( log ⁡ b n + 1 ) / 2 ) ⋅ lg ⁡ k ( ( n b ) 1 / 2 ) = ( ( log ⁡ b n + 1 ) / 4 ) ⋅ lg ⁡ k ( n b ) ≥ ( ( log ⁡ b n + 1 ) / 4 ) ⋅ lg ⁡ k n = 1 4 lg ⁡ b lg ⁡ k + 1 n + 1 4 lg ⁡ k n h(n) = \sum_{j=0}^{(\log_bn-1)/2} \lg^k (n/b^j) + \sum_{j=(\log_bn+1)/2}^{\log_bn-1} \lg^k (n/b^j) \\ \ge \sum_{j=0}^{(\log_bn-1)/2} \lg^k (n/b^{(\log_bn-1)/2}) \\ = ((\log_bn-1)/2+1) \cdot \lg^k (n/b^{(\log_bn-1)/2}) \\ = ((\log_bn+1)/2) \cdot \lg^k((nb)^{1/2}) \\ = ((\log_bn+1)/4) \cdot \lg^k(nb) \\ \ge ((\log_bn+1)/4) \cdot \lg^k n = \frac{1}{4\lg b}\lg^{k+1} n + \frac{1}{4}\lg^k n h(n)=j=0(logbn1)/2lgk(n/bj)+j=(logbn+1)/2logbn1lgk(n/bj)j=0(logbn1)/2lgk(n/b(logbn1)/2)=((logbn1)/2+1)lgk(n/b(logbn1)/2)=((logbn+1)/2)lgk((nb)1/2)=((logbn+1)/4)lgk(nb)((logbn+1)/4)lgkn=4lgb1lgk+1n+41lgkn
因为 1 4 lg ⁡ b \frac{1}{4\lg b} 4lgb1 是常数,所以 h ( n ) = Ω ( lg ⁡ k + 1 n ) h(n) = \Omega(\lg^{k+1}n) h(n)=Ω(lgk+1n)

因此, h ( n ) = Θ ( lg ⁡ k + 1 n ) h(n) = \Theta(\lg^{k+1}n) h(n)=Θ(lgk+1n)
所以, g ( n ) = Θ ( n log ⁡ b a ) ⋅ h ( n ) = Θ ( n log ⁡ b a lg ⁡ k + 1 n ) g(n) = \Theta(n^{\log_ba})\cdot h(n) = \Theta(n^{\log_ba}\lg^{k+1}n) g(n)=Θ(nlogba)h(n)=Θ(nlogbalgk+1n),即证。

4.6-3 ★ \bigstar 在定理中的情况3 中,正则条件 a f ( n / b ) ≤ c f ( n ) af(n/b) \le cf(n) af(n/b)cf(n) 对某些 c < 1 c<1 c<1 成立,蕴含存在常数 ϵ > 0 \epsilon > 0 ϵ>0,有 f ( n ) = Ω ( n log ⁡ b a + ϵ ) f(n) = \Omega(n^{\log_ba + \epsilon}) f(n)=Ω(nlogba+ϵ)。据此证明定理中的陈述过强。
证:
(未完成)


思考题

4-1 递归式的例子
给出下列递归式 T ( n ) T(n) T(n) 的渐近上下界。假设 n ≤ 2 n \le 2 n2 时, T ( n ) T(n) T(n) 是常数。使界尽量紧确,并证明。
a. T ( n ) = 2 T ( n / 2 ) + n 4 T(n) = 2T(n/2) + n^4 T(n)=2T(n/2)+n4
b. T ( n ) = T ( 7 n / 10 ) + n T(n) = T(7n/10) + n T(n)=T(7n/10)+n
c. T ( n ) = 16 T ( n / 4 ) + n 2 T(n) = 16T(n/4) + n^2 T(n)=16T(n/4)+n2
d. T ( n ) = 7 T ( n / 3 ) + n 2 T(n) = 7T(n/3) + n^2 T(n)=7T(n/3)+n2
e. T ( n ) = 7 T ( n / 2 ) + n 2 T(n) = 7T(n/2) + n^2 T(n)=7T(n/2)+n2
f. T ( n ) = 2 T ( n / 4 ) + n T(n) = 2T(n/4) + \sqrt n T(n)=2T(n/4)+n
g. T ( n ) = T ( n − 2 ) + n 2 T(n) = T(n-2) + n^2 T(n)=T(n2)+n2

解: a. T ( n ) = Θ ( n 4 ) T(n) = \Theta(n^4) T(n)=Θ(n4)。使用主方法证明。
a = 2 a=2 a=2 b = 2 b=2 b=2 f ( n ) = n 4 f(n) = n^4 f(n)=n4。有 n log ⁡ b a = n n^{\log_ba} = n nlogba=n,存在 ϵ = 1 \epsilon = 1 ϵ=1,有 f ( n ) = Ω ( n 1 + ϵ ) f(n) = \Omega(n^{1+\epsilon}) f(n)=Ω(n1+ϵ)
a f ( n / b ) = 2 ( n / 2 ) 4 = ( 1 / 8 ) n 4 ≤ ( 1 / 8 ) f ( n ) af(n/b) = 2(n/2)^4 = (1/8)n^4 \le (1/8)f(n) af(n/b)=2(n/2)4=(1/8)n4(1/8)f(n),存在 c = 1 / 8 c = 1/8 c=1/8。符合情况3。

b. T ( n ) = Θ ( n ) T(n) = \Theta(n) T(n)=Θ(n)。使用主方法证明。
a = 1 a=1 a=1 b = 10 / 7 b=10/7 b=10/7 f ( n ) = n f(n) = n f(n)=n。有 n log ⁡ b a = n 0 = 1 n^{\log_ba} = n^0 = 1 nlogba=n0=1,存在 ϵ = 1 \epsilon = 1 ϵ=1,有 f ( n ) = Ω ( n ϵ ) f(n) = \Omega(n^{\epsilon}) f(n)=Ω(nϵ)
a f ( n / b ) = 7 n / 10 ≤ ( 7 / 10 ) f ( n ) af(n/b) = 7n/10 \le (7/10)f(n) af(n/b)=7n/10(7/10)f(n),存在 c = 7 / 10 c = 7/10 c=7/10。符合情况3。

c. T ( n ) = Θ ( n 2 lg ⁡ n ) T(n) = \Theta(n^2\lg n) T(n)=Θ(n2lgn)。使用主方法证明。
a = 16 a=16 a=16 b = 4 b=4 b=4 f ( n ) = n 2 f(n) = n^2 f(n)=n2。有 n log ⁡ b a = n 2 n^{\log_ba} = n^2 nlogba=n2 f ( n ) = Θ ( n log ⁡ b a ) f(n) = \Theta(n^{\log_ba}) f(n)=Θ(nlogba),符合情况2。

d. T ( n ) = Θ ( n 2 ) T(n) = \Theta(n^2) T(n)=Θ(n2)。使用主方法证明。
a = 7 a=7 a=7 b = 3 b=3 b=3 f ( n ) = n 2 f(n) = n^2 f(n)=n2。有 n log ⁡ b a = n log ⁡ 3 7 n^{\log_ba} = n^{\log_37} nlogba=nlog37 1.77 < log ⁡ 3 7 < 1.78 1.77<\log_37 < 1.78 1.77<log37<1.78
存在 ϵ = 0.2 \epsilon = 0.2 ϵ=0.2,有 f ( n ) = Ω ( n log ⁡ 3 7 + ϵ ) f(n) = \Omega(n^{\log_37 +\epsilon}) f(n)=Ω(nlog37+ϵ)
a f ( n / b ) = 7 ( n / 3 ) 2 ≤ ( 7 / 9 ) f ( n ) af(n/b) = 7(n/3)^2 \le (7/9)f(n) af(n/b)=7(n/3)2(7/9)f(n),存在 c = 7 / 9 c = 7/9 c=7/9。符合情况3。

e. T ( n ) = Θ ( n lg ⁡ 7 ) T(n) = \Theta(n^{\lg7}) T(n)=Θ(nlg7)。使用主方法证明。
a = 7 a=7 a=7 b = 2 b=2 b=2 f ( n ) = n 2 f(n) = n^2 f(n)=n2。有 n log ⁡ b a = n log ⁡ 2 7 n^{\log_ba} = n^{\log_27} nlogba=nlog27 2.80 < log ⁡ 2 7 < 2.81 2.80<\log_27 < 2.81 2.80<log27<2.81
存在 ϵ = 0.8 \epsilon = 0.8 ϵ=0.8,有 f ( n ) = O ( n log ⁡ 2 7 − ϵ ) f(n) = O(n^{\log_27 -\epsilon}) f(n)=O(nlog27ϵ)。符合情况1。

f. T ( n ) = Θ ( n lg ⁡ n ) T(n) = \Theta(\sqrt n\lg n) T(n)=Θ(n lgn)。使用主方法证明。
a = 2 a=2 a=2 b = 4 b=4 b=4 f ( n ) = n f(n) = \sqrt n f(n)=n 。有 n log ⁡ b a = n 1 / 2 n^{\log_ba} = n^{1/2} nlogba=n1/2 f ( n ) = Θ ( n log ⁡ b a ) f(n) = \Theta(n^{\log_ba}) f(n)=Θ(nlogba),符合情况2。

g. T ( n ) = Θ ( n 3 ) T(n) = \Theta(n^3) T(n)=Θ(n3)。使用递归树方法证明。

第 0 层: n n n 个元素,代价为 n 2 n^2 n2
第 1 层: n − 2 n-2 n2 个元素,代价为 ( n − 2 ) 2 = n 2 − 4 n + 4 (n-2)^2 = n^2 - 4n + 4 (n2)2=n24n+4
……
i i i 层: n − 2 i n-2i n2i 个元素,代价为 ( n − 2 i ) 2 = n 2 − 4 i n + 4 i 2 (n-2i)^2 = n^2 - 4in + 4i^2 (n2i)2=n24in+4i2

n − 2 i = 1 n-2i = 1 n2i=1,得递归树共有 ( n − 1 ) / 2 + 1 (n-1)/2+1 (n1)/2+1 层。
将所有层的代价相加,得
T ( n ) = ∑ i = 0 ( n − 1 ) / 2 − 1 ( n 2 − 4 i n + 4 i 2 ) + Θ ( 1 ) = n 2 ( n − 1 ) / 2 − 4 n ∑ i = 0 ( n − 3 ) / 2 i + 4 ∑ i = 0 ( n − 3 ) / 2 i 2 + Θ ( 1 ) = n 2 ( n − 1 ) / 2 − 4 n ( ( ( n − 1 ) / 2 ) ⋅ ( ( n − 3 ) / 2 ) 2 ) + 4 ( ( ( n − 3 ) / 2 ) ⋅ ( ( n − 1 ) / 2 ) ⋅ ( n − 2 ) 6 ) + Θ ( 1 ) = n 3 / 6 + n 2 / 2 + n / 3 − 1 + Θ ( 1 ) = Θ ( n 3 ) T(n) = \sum_{i=0}^{(n-1)/2-1}(n^2 -4in + 4i^2) + \Theta(1) \\ =n^2(n-1)/2 - 4n\sum_{i=0}^{(n-3)/2}i + 4\sum_{i=0}^{(n-3)/2}i^2 + \Theta(1) \\ =n^2(n-1)/2 - 4n(\frac{((n-1)/2) \cdot((n-3)/2)}{2}) + 4(\frac{((n-3)/2) \cdot((n-1)/2)\cdot (n-2)}{6}) + \Theta(1) \\ = n^3/6 +n^2/2 +n/3-1 + \Theta(1) \\ = \Theta(n^3) T(n)=i=0(n1)/21(n24in+4i2)+Θ(1)=n2(n1)/24ni=0(n3)/2i+4i=0(n3)/2i2+Θ(1)=n2(n1)/24n(2((n1)/2)((n3)/2))+4(6((n3)/2)((n1)/2)(n2))+Θ(1)=n3/6+n2/2+n/31+Θ(1)=Θ(n3)

4-2 参数传递的代价
在整本书中,假定过程调用时参数传递所花时间为常数,即使传递的是个包含 N N N 个元素的数组。这个假设对于大多数系统是有效的,因为传递的不是数组本身,而是指向数组的指针。本题讨论三种参数传递策略:
①数组由指针来传递。时间 = Θ ( 1 ) = \Theta(1) =Θ(1)
②数组通过复制来传递。时间 = Θ ( N ) =\Theta(N) =Θ(N),其中 N N N 是该数字的大小。
③数组被传递时,仅复制被调用过程可能访问的该数组的子域。若传递的是子数组 A [ p . . q ] A[p..q] A[p..q],时间 = Θ ( q − p + 1 ) =\Theta(q-p+1) =Θ(qp+1)
a. 考虑在一个已排序的数组中找一个数字的递归二分查找算法(见练习 2.3-5)。当使用上面三种方法传递数组时,给出二分查找的最坏情况运行时间的递归式,并给出其解的好的上界。设 N N N 是原问题的规模, n n n 是子问题的规模。
b. 针对 2.3.1 章节的 MERGE-SORT 算法,重做 (a) 部分。

解: a. 练习 2.3-5 中算法的运行时间为 T ( n ) = T ( n / 2 ) + Θ ( 1 ) T(n) = T(n/2) + \Theta(1) T(n)=T(n/2)+Θ(1)
方法①,递归式为 T ( n ) = T ( n / 2 ) + Θ ( 1 ) T(n) = T(n/2) + \Theta(1) T(n)=T(n/2)+Θ(1),其解为 T ( n ) = Θ ( n ) T(n) = \Theta(\sqrt n) T(n)=Θ(n )。主方法情况1。
方法②,递归式为 T ( n ) = T ( n / 2 ) + Θ ( N ) T(n) = T(n/2) + \Theta(N) T(n)=T(n/2)+Θ(N),其解为 T ( n ) = Θ ( N lg ⁡ n ) T(n) = \Theta(N\lg n) T(n)=Θ(Nlgn)
递归树方法:共有 lg ⁡ n + 1 \lg n+1 lgn+1 层,每层代价均为 N N N
方法③,递归式为 T ( n ) = T ( n / 2 ) + Θ ( n ) T(n) = T(n/2) + \Theta(n) T(n)=T(n/2)+Θ(n),其解为 T ( n ) = Θ ( n ) T(n) = \Theta(n) T(n)=Θ(n)。主方法情况3。

b. MERGE-SORT 算法的运行时间为 T ( n ) = 2 T ( n / 2 ) + Θ ( n ) T(n) = 2T(n/2) + \Theta(n) T(n)=2T(n/2)+Θ(n)
方法①,递归式为 T ( n ) = 2 T ( n / 2 ) + Θ ( n ) T(n) = 2T(n/2) + \Theta(n) T(n)=2T(n/2)+Θ(n),其解为 T ( n ) = Θ ( n lg ⁡ n ) T(n) = \Theta(n\lg n) T(n)=Θ(nlgn)。主方法情况2。
方法②,递归式为 T ( n ) = 2 T ( n / 2 ) + Θ ( N ) + Θ ( n ) T(n) = 2T(n/2) + \Theta(N) + \Theta(n) T(n)=2T(n/2)+Θ(N)+Θ(n),其解为 T ( n ) = Θ ( n lg ⁡ n ) + Θ ( n N ) T(n) = \Theta(n\lg n) + \Theta(nN) T(n)=Θ(nlgn)+Θ(nN)
递归树方法:共有 lg ⁡ n + 1 \lg n+1 lgn+1 层,第 i i i 层代价为 N ⋅ 2 i + n N\cdot 2^i+n N2i+n,其中 i = 0 , 1 , . . . , lg ⁡ n − 1 i=0,1,...,\lg n-1 i=0,1,...,lgn1。最后一层代价为 n N + n nN+n nN+n
总代价为
T ( n ) = N ⋅ ∑ i = 0 lg ⁡ n − 1 2 i + n lg ⁡ n + ( n N + n ) = ( 2 lg ⁡ n − 1 ) N + n lg ⁡ n + ( n N + n ) = 2 n N + n lg ⁡ n + n − N T(n) = N\cdot\sum_{i=0}^{\lg n-1}2^i + n\lg n +(nN+n) = (2^{\lg n}-1)N + n\lg n +(nN+n) \\ = 2nN+n\lg n+n-N T(n)=Ni=0lgn12i+nlgn+(nN+n)=(2lgn1)N+nlgn+(nN+n)=2nN+nlgn+nN
方法③,递归式为 T ( n ) = 2 T ( n / 2 ) + Θ ( n ) T(n) = 2T(n/2) + \Theta(n) T(n)=2T(n/2)+Θ(n),其解为 T ( n ) = Θ ( n lg ⁡ n ) T(n) = \Theta(n\lg n) T(n)=Θ(nlgn)

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 lg ⁡ n T(n) = 4T(n/3) + n\lg n T(n)=4T(n/3)+nlgn

解: T ( n ) = Θ ( n log ⁡ 3 4 ) T(n)= \Theta(n^{\log_34}) T(n)=Θ(nlog34)
递归树方法:共有 log ⁡ 3 n + 1 \log_3n+1 log3n+1 层。每层代价如下:
第 0 层: n lg ⁡ n n\lg n nlgn
第 1 层: 4 ( n / 3 ) lg ⁡ ( n / 3 ) 4(n/3)\lg(n/3) 4(n/3)lg(n/3)
第 2 层: 4 2 ( n / 3 2 ) lg ⁡ ( n / 3 2 ) 4^2(n/3^2)\lg(n/3^2) 42(n/32)lg(n/32)
……
i i i 层: ( 4 / 3 ) i n ( lg ⁡ n − i ⋅ lg ⁡ 3 ) (4/3)^in(\lg n - i\cdot\lg3) (4/3)in(lgnilg3)

将所有层次的代价相加,得
T ( n ) = n lg ⁡ n ⋅ ∑ i = 0 log ⁡ 3 n − 1 ( 4 / 3 ) i − n lg ⁡ 3 ∑ i = 0 log ⁡ 3 n − 1 i ( 4 / 3 ) i + Θ ( n log ⁡ 3 4 ) = n lg ⁡ n ⋅ 3 ( ( 4 / 3 ) log ⁡ 3 n − 1 ) − n lg ⁡ 3 ( 12 − 12 n log ⁡ 3 4 / n + 3 log ⁡ 3 n ⋅ n log ⁡ 3 4 / n ) + Θ ( n log ⁡ 3 4 ) = − 3 n lg ⁡ n − 12 n lg ⁡ 3 + 12 lg ⁡ 3 ⋅ n log ⁡ 3 4 + Θ ( n log ⁡ 3 4 ) = Θ ( n log ⁡ 3 4 ) T(n) = n\lg n \cdot\sum_{i=0}^{\log_3n-1} (4/3)^i - n\lg3\sum_{i=0}^{\log_3n-1}i(4/3)^i + \Theta(n^{\log_34}) \\ =n\lg n\cdot 3((4/3)^{\log_3n}-1) - n\lg3(12 -12n^{\log_34}/n +3\log_3n \cdot n^{\log_34}/n) + \Theta(n^{\log_34}) \\ = - 3n\lg n -12n\lg3 + 12\lg3\cdot n^{\log_34} + \Theta(n^{\log_34}) \\ = \Theta(n^{\log_34}) T(n)=nlgni=0log3n1(4/3)inlg3i=0log3n1i(4/3)i+Θ(nlog34)=nlgn3((4/3)log3n1)nlg3(1212nlog34/n+3log3nnlog34/n)+Θ(nlog34)=3nlgn12nlg3+12lg3nlog34+Θ(nlog34)=Θ(nlog34)
T ( n ) T(n) T(n) 的后一项是个差比数列。 1.26 < log ⁡ 3 4 < 1.27 1.26<\log_34<1.27 1.26<log34<1.27

b. T ( n ) = 3 ( n / 3 ) + n / lg ⁡ n T(n) = 3(n/3) + n/\lg n T(n)=3(n/3)+n/lgn

解: 上界: T ( n ) = Ω ( n ) T(n) = \Omega(n) T(n)=Ω(n)。下界: T ( n ) = O ( n lg ⁡ n ) T(n) = O(n\lg n) T(n)=O(nlgn)
递归树方法:共有 log ⁡ 3 n + 1 \log_3n+1 log3n+1 层。最后一次代价为 Θ ( n ) \Theta(n) Θ(n)
i i i 层代价: n / lg ⁡ ( n / 3 i ) = n / ( lg ⁡ n − i lg ⁡ 3 ) n/\lg(n/3^i) = n/(\lg n -i\lg3) n/lg(n/3i)=n/(lgnilg3) i = 0 , 1 , . . . , log ⁡ 3 n − 1 i=0,1,...,\log_3n-1 i=0,1,...,log3n1
T ( n ) = ∑ i = 0 log ⁡ 3 n − 1 n / ( lg ⁡ n − i lg ⁡ 3 ) + Θ ( n ) ≥ ∑ i = 0 log ⁡ 3 n − 1 n / lg ⁡ n + Θ ( n ) = n log ⁡ 3 n / lg ⁡ n + Θ ( n ) = n / lg ⁡ 3 + Θ ( n ) T(n) = \sum_{i=0}^{\log_3n-1} n/(\lg n -i\lg3) +\Theta(n) \\ \ge \sum_{i=0}^{\log_3n-1} n/\lg n +\Theta(n) = n\log_3n/\lg n +\Theta(n) = n/\lg 3 +\Theta(n) T(n)=i=0log3n1n/(lgnilg3)+Θ(n)i=0log3n1n/lgn+Θ(n)=nlog3n/lgn+Θ(n)=n/lg3+Θ(n)
因为 1 / lg ⁡ 3 1/\lg3 1/lg3 是常数,所以 T ( n ) = Ω ( n ) T(n) = \Omega(n) T(n)=Ω(n)
T ( n ) ≤ ∑ i = 0 log ⁡ 3 n − 1 n / ( lg ⁡ n − ( log ⁡ 3 n − 1 ) lg ⁡ 3 ) + Θ ( n ) = n log ⁡ 3 n / lg ⁡ 3 + Θ ( n ) = n lg ⁡ n / lg ⁡ 2 3 + Θ ( n ) T(n) \le \sum_{i=0}^{\log_3n-1} n/(\lg n -(\log_3n-1)\lg3) +\Theta(n) = n\log_3n/\lg3 +\Theta(n) = n\lg n/\lg^23 +\Theta(n) T(n)i=0log3n1n/(lgn(log3n1)lg3)+Θ(n)=nlog3n/lg3+Θ(n)=nlgn/lg23+Θ(n)
所以, T ( n ) = O ( n lg ⁡ n ) T(n) = O(n\lg n) T(n)=O(nlgn)

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

解: T ( n ) = Θ ( n 2 n ) T(n) = \Theta(n^2 \sqrt n) T(n)=Θ(n2n )
主方法证明: a = 4 a=4 a=4 b = 2 b=2 b=2 f ( n ) = n 2 n f(n) = n^2\sqrt n f(n)=n2n ,有 n log ⁡ b a = n 2 n^{\log_ba} = n^2 nlogba=n2
存在 ϵ = 1 / 2 \epsilon = 1/2 ϵ=1/2,有 f ( n ) = Ω ( n 2 + ϵ ) f(n) = \Omega(n^{2+\epsilon}) f(n)=Ω(n2+ϵ)
a f ( n / b ) = 4 ( n / 2 ) 2 n / 2 = ( 1 / 2 ) n 2 n ≤ c f ( n ) af(n/b) = 4(n/2)^2 \sqrt{n/2} = (1/\sqrt2)n^2\sqrt n \le cf(n) af(n/b)=4(n/2)2n/2 =(1/2 )n2n cf(n),存在 c = 1 / 2 c = 1/\sqrt2 c=1/2 。情况3 符合。

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 / lg ⁡ n T(n) = 2T(n/2) + n/\lg n T(n)=2T(n/2)+n/lgn

解: 上界: T ( n ) = Ω ( n ) T(n) = \Omega(n) T(n)=Ω(n)。下界: T ( n ) = O ( n lg ⁡ n ) T(n) = O(n\lg n) T(n)=O(nlgn)
递归树方法:共有 lg ⁡ n + 1 \lg n+1 lgn+1 层。最后一次代价为 Θ ( n ) \Theta(n) Θ(n)
i i i 层代价: n / lg ⁡ ( n / 2 i ) = n / ( lg ⁡ n − i ) n/\lg(n/2^i) = n/(\lg n -i) n/lg(n/2i)=n/(lgni) i = 0 , 1 , . . . , lg ⁡ n − 1 i=0,1,...,\lg n-1 i=0,1,...,lgn1
与 (b) 类似。

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 ) + lg ⁡ n T(n) = T(n-1) + \lg n T(n)=T(n1)+lgn

解: T ( n ) = Θ ( n lg ⁡ n ) T(n) = \Theta(n\lg n) T(n)=Θ(nlgn)
递归树方法:共有 n n n 层。最后一层代价为 Θ ( 1 ) \Theta(1) Θ(1)
每层代价为: lg ⁡ ( n − i ) \lg(n-i) lg(ni) i = 0 , 1 , . . . , n − 2 i=0,1,...,n-2 i=0,1,...,n2
T ( n ) = ∑ i = 0 n − 2 lg ⁡ ( n − i ) + Θ ( 1 ) ≤ ( n − 2 ) lg ⁡ n + Θ ( 1 ) T(n) = \sum_{i=0}^{n-2} \lg(n-i) + \Theta(1) \le (n-2)\lg n + \Theta(1) T(n)=i=0n2lg(ni)+Θ(1)(n2)lgn+Θ(1),所以 T ( n ) = O ( n lg ⁡ n ) T(n) = O(n\lg n) T(n)=O(nlgn)
T ( n ) ≥ ∑ i = 0 ( n − 2 ) / 2 lg ⁡ ( n − i ) ≥ n − 2 2 lg ⁡ ( n − ( n − 2 ) / 2 ) = n − 2 2 ( lg ⁡ ( n + 2 ) − 1 ) ≥ n − 2 2 ( lg ⁡ n − 1 ) T(n) \ge \sum_{i=0}^{(n-2)/2} \lg(n-i) \ge \frac{n-2}{2}\lg(n-(n-2)/2) = \frac{n-2}{2}(\lg(n+2)-1) \ge \frac{n-2}{2}(\lg n-1) T(n)i=0(n2)/2lg(ni)2n2lg(n(n2)/2)=2n2(lg(n+2)1)2n2(lgn1),所以 T ( n ) = Ω ( n lg ⁡ n ) T(n) = \Omega(n\lg n) T(n)=Ω(nlgn)

i. T ( n ) = T ( n − 2 ) + 1 / lg ⁡ n T(n) = T(n-2) + 1/\lg n T(n)=T(n2)+1/lgn

解:

j. T ( n ) = n T ( n ) + n T(n) = \sqrt nT(\sqrt n) + n T(n)=n T(n )+n

解: T ( n ) = Θ ( n lg ⁡ lg ⁡ n ) T(n) = \Theta(n\lg\lg n) T(n)=Θ(nlglgn)
递归树方法:令 T ( 2 ) = Θ ( 1 ) T(2) = \Theta(1) T(2)=Θ(1),由 n ( 1 / 2 ) i = 2 n^{{(1/2)^i}} = 2 n(1/2)i=2,得 i = lg ⁡ lg ⁡ n i = \lg\lg n i=lglgn
所以递归树共有 lg ⁡ lg ⁡ n + 1 \lg \lg n + 1 lglgn+1 层,每层代价为 n n n

4-4 斐波那契数(Fibonacci numbers)
递归式 (3.22) 定义了斐波那契数,本题阐述它的性质。我们将使用函数生成技术来求解斐波那契递归式。定义生成函数 [generating function](或形式幂级数 [formal power series]) F \mathscr{F} F 如下:
F ( z ) = ∑ i = 0 ∞ F i z i = 0 + z + z 2 + 2 z 3 + 3 z 4 + 5 z 5 + 8 z 6 + 13 z 7 + 21 z 8 + ⋯ \mathscr{F}(z) = \sum_{i=0}^{\infty} F_i z^i = 0 +z + z^2 + 2z^3 + 3z^4 + 5z^5 + 8z^6 + 13z^7 + 21z^8 + \cdots F(z)=i=0Fizi=0+z+z2+2z3+3z4+5z5+8z6+13z7+21z8+

其中, F i F_i Fi 是第 i i i 个斐波那契数。

a. 证明: F ( z ) = z + z F ( z ) + z 2 F ( z ) \mathscr{F}(z) = z + z\mathscr{F}(z) + z^2\mathscr{F}(z) F(z)=z+zF(z)+z2F(z)
b. 证明: F ( z ) = z 1 − z − z 2 = z ( 1 − ϕ z ) ( 1 − ϕ ^ z ) = 1 5 ( 1 1 − ϕ z − 1 1 − ϕ ^ z ) \mathscr{F}(z) = \frac{z}{1-z-z^2} = \frac{z}{(1-\phi z)(1- \widehat\phi z)} = \frac{1}{\sqrt5}(\frac{1}{1-\phi z} - \frac{1}{1-\widehat\phi z}) F(z)=1zz2z=(1ϕz)(1ϕ z)z=5 1(1ϕz11ϕ z1)

其中, ϕ = 1 + 5 2 = 1.61803 … \phi = \frac{1+\sqrt5}{2} = 1.61803\dots ϕ=21+5 =1.61803 ϕ ^ = 1 − 5 2 = − 0.61803 … \widehat\phi = \frac{1-\sqrt5}{2} = -0.61803\dots ϕ =215 =0.61803
c. 证明: F ( z ) = ∑ i = 0 ∞ 1 5 ( ϕ i − ϕ ^ i ) z i \mathscr{F}(z) = \sum_{i=0}^{\infty}\frac{1}{\sqrt5}(\phi^i - \widehat\phi^i)z^i F(z)=i=05 1(ϕiϕ i)zi
d. 使用 (c) 部分证明,对于 i > 0 i>0 i>0,有 F i = ϕ i / 5 F_i = \phi^i/\sqrt5 Fi=ϕi/5 ,四舍五入到最近的整数。(提示: ∣ ϕ ^ ∣ < 1 |\widehat\phi| < 1 ϕ <1。)

解:

4-5 芯片测试
Diogenes 教授有 n n n 个被认为是相同的集成电路芯片,原则上它们可以相互测试。教授的测试夹具一次可容纳两个芯片。加载夹具后,每个芯片都会相互测试,并报告其好坏。一个好的芯片总是准确地报告另一个芯片的好坏,但是教授不能相信一个坏芯片的答案。因此,测试的四个可能结果如下:

A 芯片说B 芯片说结论
B 是好的A 是好的都是好的,或都是坏的
B 是好的A 是坏的至少有一个是坏的
B 是坏的A 是好的至少有一个是坏的
B 是坏的A 是坏的至少有一个是坏的

a. 证明:若超过 n / 2 n/2 n/2 个芯片是坏的,使用基于这种成对测试的任何策略,教授不能确定哪个芯片是好的。 假设坏的芯片可以联合欺骗教授。
b. 考虑问题,假设超过 n / 2 n/2 n/2 个芯片是好的,从 n n n 个芯片中找出一个好的芯片。证明: ⌊ n / 2 ⌋ \lfloor n/2 \rfloor n/2 对测试足以使问题降至近原来规模的一半。
c. 证明:假设超过 n / 2 n/2 n/2 个芯片是好的,好的芯片可以使用 Θ ( n ) \Theta(n) Θ(n) 对测试找出。给出描述测试次数的递归式,并求解。

证:

4-6 Monge 阵列
一个 m × n m \times n m×n 实数阵列 A A A,如果对于所有的 i i i j j j k k k l l l 1 ≤ i < k ≤ m 1 \le i < k \le m 1i<km 1 ≤ j < l ≤ n 1 \le j < l \le n 1j<ln,有
A [ i , j ] + A [ k , l ] ≤ A [ i , l ] + A [ k , j ] A[i,j] + A[k,l] \le A[i,l] + A[k, j] A[i,j]+A[k,l]A[i,l]+A[k,j]
那么, A A A 是一个 Monge 阵列(Monge array)。
换言之,每当从 Monge 阵列中选择两行和两列,考虑行和列交叉处的 4 个元素,左上角和右下角元素的和小于或等于左下角和右上角元素的和。例如,下面是一个 Monge 阵列:
10 17 13 28 23 17 22 16 29 23 24 28 22 34 24 11 13 6 17 7 45 44 32 37 23 36 33 19 21 6 75 66 51 53 34 \begin{array}{cc} 10 & 17 & 13 & 28 & 23 \\ 17 & 22 & 16 & 29 & 23 \\ 24 & 28 & 22 & 34 & 24 \\ 11 & 13 & 6 & 17 & 7 \\ 45 & 44 & 32 & 37 & 23 \\ 36 & 33 & 19 & 21 & 6 \\ 75 & 66 & 51 & 53 & 34 \end{array} 1017241145367517222813443366131622632195128293417372153232324723634
a. 证明:一个阵列是 Monge 阵列,当且仅当对所有 i = 1 , 2 , . . . , m − 1 i=1,2,...,m-1 i=1,2,...,m1 j = 1 , 2 , . . . , n − 1 j=1,2,...,n-1 j=1,2,...,n1,有
A [ i , j ] + A [ i + 1 , j + 1 ] ≤ A [ i , j + 1 ] + A [ i + 1 , j ] A[i,j] + A[i+1,j+1] \le A[i,j+1] + A[i+1,j] A[i,j]+A[i+1,j+1]A[i,j+1]+A[i+1,j]
(提示:在“仅当”部分,对行、列分别使用归纳法。)
b. 下面的阵列不是 Monge 阵列。改变一个元素,把它变成 Monge 阵列。(提示:使用部分 (a)。)
37 23 22 32 21 6 7 10 53 34 30 31 32 13 9 6 43 21 15 8 \begin{array}{cc} 37 & 23 & 22 & 32 \\ 21 & 6 & 7 & 10 \\ 53 & 34 & 30 & 31 \\ 32 & 13 & 9 & 6 \\ 43 & 21 & 15 & 8 \end{array} 37215332432363413212273091532103168
c. f ( i ) f(i) f(i) 是第 i i i 行包含最左端最小值的列的索引值。证明:对任何 m × n m\times n m×n 的 Monge 阵列,有 f ( 1 ) ≤ f ( 2 ) ≤ . . . ≤ f ( m ) f(1) \le f(2) \le ... \le f(m) f(1)f(2)...f(m)
d. 以下是一个分治算法的描述,计算一个 m × n m \times n m×n 的阵列 A A A 的每一行的最左端的最小元素:
构造一个 A A A 的子矩阵 A ′ A' A,包含 A A A 的所有偶数行。递归地确定 A ′ A' A 的每行的最左端最小值,接着计算 A A A 的奇数行的最左端最小值。
解释如何在 O ( m + n ) O(m+n) O(m+n) 时间内,计算 A A A 的奇数行的最左端最小值(假设 A A A 的偶数行的最左端最小值已知)。
e. 写出 (d) 部分所描述算法的运行时间的递归式。证明其解为 O ( m + n log ⁡ m ) O(m+n\log m) O(m+nlogm)

解:


章节注记

从实践的角度来看,Strassen 算法通常不是矩阵乘法的选择方法,原因有 4 个:

  1. 在 Strassen 算法的 Θ ( n lg ⁡ 7 ) \Theta(n^{\lg 7}) Θ(nlg7) 运行时间中隐藏的常数因子,大于 SQUARE-MATRIXMULTIPLY 过程中 Θ ( n 3 ) \Theta(n^3) Θ(n3) 时间中的常数因子。
  2. 当矩阵稀疏时,为稀疏矩阵量身定制的方法会更快。
  3. Strassen 算法在数值稳定上不如 SQUARE-MATRIXMULTIPLY。换句话说,由于计算机运算非整数值的精度有限,因此与 SQUARE-MATRIX-MULTIPLY 相比,在 Strassen 算法中累积的错误更大。
  4. 在递归级别上形成的子矩阵会消耗空间。

后两个原因在 1990 年左右得到缓解。

一些研究人员给出了比主方法更广泛的解分治递归式的方法。Akra-Bazzi 方法适用于以下形式的递归式:
T ( x ) = { Θ ( 1 ) if  1 ≤ x ≤ x 0 ∑ i = 0 k a i T ( b i x ) + f ( x ) if  x > x 0 T(x) = \begin{cases} \Theta(1) & \text{if }1 \le x \le x_0 \\ \sum_{i=0}^{k} a_iT(b_ix) + f(x) & \text{if }x > x_0 \end{cases} T(x)={Θ(1)i=0kaiT(bix)+f(x)if 1xx0if x>x0     (4.30)
其中,

  • x ≤ 1 x \le 1 x1 是实数,
  • x 0 x_0 x0 是常数, x 0 ≥ 1 / b i x_0 \ge 1/b_i x01/bi x 0 ≥ 1 / ( 1 − b i ) x_0 \ge 1/(1-b_i) x01/(1bi),对于 i = 1 , 2 , . . . , k i=1,2,...,k i=1,2,...,k
  • a i a_i ai 是个正常数,对于 i = 1 , 2 , . . . , k i=1,2,...,k i=1,2,...,k
  • b i b_i bi 是个常数,其范围为 0 < b i < 1 0 < b_i <1 0<bi<1,对于 i = 1 , 2 , . . . , k i=1,2,...,k i=1,2,...,k
  • k ≥ 1 k \ge 1 k1 是个整数常数,
  • f ( x ) f(x) f(x) 是个非负函数,满足多项式增长条件(polynomial-growth condition):存在正常数 c 1 c_1 c1 c 2 c_2 c2,对于所有 x ≥ 1 x\ge1 x1,对于 i = 1 , 2 , . . . , k i=1,2,...,k i=1,2,...,k,和对于所有 u u u b i x ≤ u ≤ x b_ix \le u \le x bixux,有 c 1 f ( x ) ≤ f ( u ) ≤ c 2 f ( x ) c_1f(x) \le f(u) \le c_2f(x) c1f(x)f(u)c2f(x)。(如果 ∣ f ′ ( x ) ∣ |f'(x)| f(x) 通过 x x x 的某些多项式确定上有界,那么 f ( x ) f(x) f(x) 满足多项式增长条件。例如,对于任何实数常数 α \alpha α β \beta β f ( x ) = x α lg ⁡ β x f(x) = x^{\alpha} \lg^{\beta}x f(x)=xαlgβx 满足该条件。)

主方法不能应用的递归式,如 T ( n ) = T ( ⌊ n / 3 ⌋ ) + T ( ⌊ 2 n / 3 ⌋ ) + O ( n ) T(n) = T(\lfloor n/3 \rfloor) + T(\lfloor 2n/3 \rfloor) + O(n) T(n)=T(n/3)+T(2n/3)+O(n),但 Akra-Bazzi 方法可以。
要解递归式 (4.30),首先找到实数 p p p,满足 ∑ i = 1 k a i b i p = 1 \sum_{i=1}^{k}a_ib_i^p = 1 i=1kaibip=1。(这个 p p p 总是存在。)
这个递归式的解为
T ( n ) = Θ ( x p ( 1 + ∫ 1 x f ( u ) u p + 1 d u ) ) T(n) = \Theta(x^p(1+ \int_1^x \frac{f(u)}{u^{p+1}}du)) T(n)=Θ(xp(1+1xup+1f(u)du))

Akra-Bazzi 方法可能有点难以使用,但可用于解决将问题划分为大小不等的子问题的递归式。主方法更易于使用,但仅在子问题大小相等时才适用。


学习笔记目录:【算法导论】目录

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值