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 ) = a T ( n / b ) + f ( n ) 。
将分析分成 3 个引理来说明。
第1个引理,将求解主递归式的问题,归约为对包含总和的表达式求值的问题。
第2个引理,确定这个总和的界限。
第3个引理,将前两个结合一起,证明:在 n n n 是 b b b 的正合幂的情况下,主定理成立。
引理 4.2
设 a ≥ 1 a \ge 1 a ≥ 1 和 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 ) a T ( n / b ) + f ( n ) if n = 1 if n = b i
其中,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 ) = Θ ( n log b a ) + ∑ j = 0 log b n − 1 a j f ( n / b j ) 。 (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 a j 个节点,每个代价为 F ( n / b j ) F(n/b^j) F ( n / b j ) 。叶子节点的代价为 T ( 1 ) = Θ ( 1 ) T(1) = \Theta(1) T ( 1 ) = Θ ( 1 ) ,且每个叶子节点在第 log b n \log_bn log b n 层,因为 n / b log b n = 1 n/b^{\log_b n} = 1 n / b log b n = 1 。树上有 a log b n = n log b a a^{\log_bn} = n^{\log_ba} a log b n = n log b a 个叶子节点。
将树上的每层节点的代价加起来。
所有内部节点的总代价为 ∑ j = 0 log b n − 1 a j f ( n / b j ) \sum_{j=0}^{\log_bn-1}a^jf(n/b^j) ∑ j = 0 log b n − 1 a j f ( n / b j ) 。在基础的分治算法中,该总和表示将问题分成子问题然后重新组合子问题的代价。
所有叶子节点的代价是 Θ ( log b a ) \Theta(\log_ba) Θ ( log b a ) ,表示解所有 n log b a n^{\log_ba} n log b a 个大小为 1 的子问题的代价。
就递归树而言,主方法的三种情况对应于树中总代价的三种情况:①由叶子节点的代价决定;②均匀地分布在树的各个层次上;③由根节点的代价决定。
式 (4.21) 的总和表示基础分治算法中分解与合并步骤的代价。
引理 4.3
设 a ≥ 1 a \ge 1 a ≥ 1 和 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 = 0 log b n − 1 a j f ( n / b j ) (4.22)
对 b b b 的正合幂,有下面的渐近界:
如果存在常数 ϵ > 0 \epsilon > 0 ϵ > 0 ,有 f ( n ) = O ( n log b a − ϵ ) f(n) = O(n^{\log_ba - \epsilon}) f ( n ) = O ( n log b a − ϵ ) ,那么 g ( n ) = O ( n log b a ) g(n) = O(n^{\log_ba}) g ( n ) = O ( n log b a ) 。
如果 f ( n ) = Θ ( n log b a ) f(n) = \Theta(n^{\log_ba}) f ( n ) = Θ ( n log b a ) ,那么 g ( n ) = Θ ( n log b a lg n ) g(n) = \Theta(n^{\log_ba}\lg n) g ( n ) = Θ ( n log b a lg n ) 。
如果对于所有足够大的 n n n ,存在常数 c < 1 c < 1 c < 1 ,有 a f ( n / b ) ≤ c f ( n ) af(n/b) \le cf(n) a f ( n / b ) ≤ c f ( 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 ( n log b a − ϵ ) ,得出 f ( n / b j ) = O ( ( n / b j ) log b a − ϵ ) f(n/b^j) = O((n/b^j)^{\log_ba-\epsilon}) f ( n / b j ) = O ( ( n / b j ) log b a − ϵ ) 。将其代入式 (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 = 0 log b n − 1 a j ( n / b j ) log b a − ϵ ) 。 (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 = 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 ϵ − 1 b ϵ log b n − 1 ) = n log b a − ϵ ( b ϵ − 1 n ϵ − 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}) n log b a − ϵ O ( n ϵ ) = O ( n log b a ) 。
将该表达式代入式 (4.23),得 g ( n ) = O ( n log b a ) g(n) = O(n^{\log_b a}) g ( n ) = O ( n log b a ) ,情况1 即证。
情况2,有 f ( n ) = Θ ( n log b a ) f(n) = \Theta(n^{\log_ba}) f ( n ) = Θ ( n log b a ) ,得 f ( n / b j ) = Θ ( ( n / b j ) log b a ) f(n/b^j) = \Theta((n/b^j)^{\log_ba}) f ( n / b j ) = Θ ( ( n / b j ) log b a ) 。代入式 (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 = 0 log b n − 1 a j ( n / b j ) log b a ) 。 (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 = 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 。
代入式 (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 ) = Θ ( n log b a log b n ) = Θ ( n log b a lg n ) ,情况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 / b j ) ≤ ( c / a ) j f ( n ) ,假设迭代的值足够大,即假设 n / b j − 1 n/b^{j-1} n / b j − 1 足够大。
代入式 (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 = 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 − c 1 + 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 a ≥ 1 和 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 ) a T ( n / b ) + f ( n ) if n = 1 if n = b i
其中,i i i 是正整数。那么,对 b b b 的正合幂,T ( n ) T(n) T ( n ) 有下面的渐近界:
如果存在常数 ϵ > 0 \epsilon > 0 ϵ > 0 ,有 f ( n ) = O ( n log b a − ϵ ) f(n) = O(n^{\log_ba - \epsilon}) f ( n ) = O ( n log b a − ϵ ) ,那么 T ( n ) = Θ ( n log b a ) T(n) = \Theta(n^{\log_ba}) T ( n ) = Θ ( n log b a ) 。
如果 f ( n ) = Θ ( n log b a ) f(n) = \Theta(n^{\log_ba}) f ( n ) = Θ ( n log b a ) ,那么 T ( n ) = Θ ( n log b a lg n ) T(n) = \Theta(n^{\log_ba}\lg n) T ( n ) = Θ ( n log b a lg n ) 。
如果对于所有足够大的 n n n ,存在常数 c < 1 c < 1 c < 1 ,有 a f ( n / b ) ≤ c f ( n ) af(n/b) \le cf(n) a f ( n / b ) ≤ c f ( 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 ) = Θ ( n log b a ) + O ( n log b a ) = Θ ( n log b a ) 。
情况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 ) = Θ ( n log b a ) + Θ ( n log b a lg n ) = Θ ( n log b a lg n ) 。
情况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 ) = Θ ( n log b a ) + Θ ( f ( n ) ) = Θ ( f ( n ) ) ,因为 f ( n ) = Ω ( n log b a + ϵ ) f(n) = \Omega(n^{\log_ba + \epsilon}) f ( n ) = Ω ( n log b a + ϵ ) 。
4.6.2 上取整函数和下取整函数
要完整证明主定理,需将分析扩展至,主递归式中出现上取整函数和下取整函数的情况,这样递归式定义在所有整数上。
下界:T ( n ) = a T ( ⌈ n / b ⌉ ) + f ( n ) T(n) = aT(\lceil n/b \rceil) + f(n) T ( n ) = a T ( ⌈ 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 ) = a T ( ⌊ n / b ⌋ ) + f ( n ) (4.26)
考虑上界的情况:
在递归树中从上至下,其自变量 n j n_j n j 可以表示为: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} n j = { n ⌈ n j − 1 / b ⌉ if j = 0 if j > 0 (4.27)
确定深度 k k k ,使 n k n_k n k 是一个常数。使用不等式 ⌈ x ⌉ ≤ x + 1 \lceil x \rceil \le x + 1 ⌈ x ⌉ ≤ x + 1 ,得n 0 ≤ n n_0 \le n n 0 ≤ n ,n 1 ≤ n b + 1 n_1 \le \frac{n}{b} + 1 n 1 ≤ b n + 1 ,n 2 ≤ n b 2 + 1 b + 1 n_2 \le \frac{n}{b^2} + \frac{1}{b} + 1 n 2 ≤ b 2 n + b 1 + 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} n j ≤ b j n + ∑ i = 0 j − 1 b i 1 < b j n + ∑ i = 0 ∞ b i 1 = b j n + b − 1 b 。
令 j = ⌊ log b n ⌋ j = \lfloor \log_b n \rfloor j = ⌊ log b n ⌋ ,有 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) n ⌊ log b n ⌋ < b ⌊ log b n ⌋ n + b − 1 b < b log b n − 1 n + b − 1 b = n / b n + b − 1 b = b + b − 1 b = O ( 1 ) 。
因此,在深度 ⌊ log b n ⌋ \lfloor \log_b n \rfloor ⌊ log b n ⌋ ,问题规模为常数。
从上图中,得 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 ) = Θ ( n log b a ) + ∑ j = 0 ⌊ log b n ⌋ − 1 a j f ( n j ) 。 (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 = 0 ⌊ log b n ⌋ − 1 a j f ( n j ) 。 (4.29)
情况3,如果对于 n > b + b / ( b − 1 ) n > b + b/(b-1) n > b + b / ( b − 1 ) ,有 a f ( ⌈ n / b ⌉ ) ≤ c f ( n ) af(\lceil n/b \rceil) \le cf(n) a f ( ⌈ n / b ⌉ ) ≤ c f ( 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) a j f ( n j ) ≤ c j f ( n ) 。因此,类似引理 4.3,对式 (4.29) 求值。
情况2,有 f ( n ) = Θ ( n log b a ) f(n) = \Theta(n^{\log_ba}) f ( n ) = Θ ( n log b a ) 。如果可以证明 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 ( n j ) = O ( n log a b / a j ) = O ( ( n / b j ) log b a ) ,那么就能套用引理 4.3 的情况2 的证明。
由 j ≤ ⌊ log b n ⌋ j \le \lfloor \log_b n \rfloor j ≤ ⌊ log b n ⌋ ,得 b j / n ≤ 1 b^j/n \le 1 b j / n ≤ 1 。
由界 f ( n ) = O ( n log b a ) f(n) = O(n^{\log_b a}) f ( n ) = O ( n log b a ) ,得,存在常数 c > 0 c>0 c > 0 ,对所有足够大的 n j n_j n j ,有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 ( n j ) ≤ c ( b j n + b − 1 b ) log b a = c ( b j n ( 1 + n b j ⋅ b − 1 b ) ) log b a = c ( a j n log b a ) ( 1 + n b j ⋅ b − 1 b ) log b a ≤ c ( a j n log b a ) ( 1 + b − 1 b ) log b a = O ( a j n log b a ) ,
因为 c ( 1 + b / ( b − 1 ) ) c(1+b/(b-1)) c ( 1 + b / ( b − 1 ) ) 是一个常数。
因此,情况2 即证。
情况1,关键在于证明界 f ( n j ) = O ( n log b a − ϵ ) f(n^j) = O(n^{\log_ba - \epsilon}) f ( n j ) = O ( n log b a − ϵ ) ,与情况2 中对于部分的证明类似。
至此,证明了对于所有整数 n n n 的主定理的上界,下界的证明类似。
练习
4.6-1 ★ \bigstar ★ 在式 (4.27) 中,若 b b b 是个正整数,而不是任意实数,给出 n j n_j n j 的一个简单且准确的表达式。解: 对于任意实数 x ≥ 0 x\ge0 x ≥ 0 和整数 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 ⌈ b ⌈ x / a ⌉ ⌉ = ⌈ a b x ⌉ 。则有n 0 = n n_0 = n n 0 = n ,n 1 = ⌈ n / b ⌉ n_1 = \lceil n/b \rceil n 1 = ⌈ n / b ⌉ ,n 2 = ⌈ n 1 / b ⌉ = ⌈ n / b 2 ⌉ n_2 = \lceil n_1/b \rceil = \lceil n/b^2 \rceil n 2 = ⌈ n 1 / b ⌉ = ⌈ n / b 2 ⌉ ,
……
一般地,n j = ⌈ n / b j ⌉ n_j = \lceil n/b^j \rceil n j = ⌈ n / b j ⌉ 。
4.6-2 ★ \bigstar ★ 证明:如果 f ( n ) = Θ ( n log b a lg k n ) f(n) = \Theta(n^{\log_ba} \lg^kn) f ( n ) = Θ ( n log b a lg k n ) ,其中 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 ) = Θ ( n log b a lg k + 1 n ) 。为简单起见,可以只对 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 ) = Θ ( n log b a ) + ∑ j = 0 log b n − 1 a j f ( n / b j ) 。
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 = 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 )
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 = 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 ,其中 lg b \lg b lg b 为常数。
所以,h ( n ) = O ( lg k + 1 n ) h(n) = O(\lg^{k+1}n) h ( n ) = O ( lg k + 1 n ) 。
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 ( 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 = 4 lg b 1 lg k + 1 n + 4 1 lg k n ,
因为 1 4 lg b \frac{1}{4\lg b} 4 lg b 1 是常数,所以 h ( n ) = Ω ( lg k + 1 n ) h(n) = \Omega(\lg^{k+1}n) h ( n ) = Ω ( lg k + 1 n ) 。
因此,h ( n ) = Θ ( lg k + 1 n ) h(n) = \Theta(\lg^{k+1}n) h ( n ) = Θ ( lg k + 1 n ) 。
所以,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 ) = Θ ( n log b a ) ⋅ h ( n ) = Θ ( n log b a lg k + 1 n ) ,即证。
4.6-3 ★ \bigstar ★ 在定理中的情况3 中,正则条件 a f ( n / b ) ≤ c f ( n ) af(n/b) \le cf(n) a f ( n / b ) ≤ c f ( 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 ) = Ω ( n log b a + ϵ ) 。据此证明定理中的陈述过强了。证:
(未完成)
思考题
4-1 递归式的例子
给出下列递归式 T ( n ) T(n) T ( n ) 的渐近上下界。假设 n ≤ 2 n \le 2 n ≤ 2 时,T ( n ) T(n) T ( n ) 是常数。使界尽量紧确,并证明。a. T ( n ) = 2 T ( n / 2 ) + n 4 T(n) = 2T(n/2) + n^4 T ( n ) = 2 T ( n / 2 ) + n 4 b. T ( n ) = T ( 7 n / 10 ) + n T(n) = T(7n/10) + n T ( n ) = T ( 7 n / 1 0 ) + n c. T ( n ) = 16 T ( n / 4 ) + n 2 T(n) = 16T(n/4) + n^2 T ( n ) = 1 6 T ( n / 4 ) + n 2 d. T ( n ) = 7 T ( n / 3 ) + n 2 T(n) = 7T(n/3) + n^2 T ( n ) = 7 T ( n / 3 ) + n 2 e. T ( n ) = 7 T ( n / 2 ) + n 2 T(n) = 7T(n/2) + n^2 T ( n ) = 7 T ( n / 2 ) + n 2 f. T ( n ) = 2 T ( n / 4 ) + n T(n) = 2T(n/4) + \sqrt n T ( n ) = 2 T ( n / 4 ) + n g. T ( n ) = T ( n − 2 ) + n 2 T(n) = T(n-2) + n^2 T ( n ) = T ( n − 2 ) + n 2
解: a. T ( n ) = Θ ( n 4 ) T(n) = \Theta(n^4) T ( n ) = Θ ( n 4 ) 。使用主方法证明。a = 2 a=2 a = 2 ,b = 2 b=2 b = 2 ,f ( n ) = n 4 f(n) = n^4 f ( n ) = n 4 。有 n log b a = n n^{\log_ba} = n n log b a = n ,存在 ϵ = 1 \epsilon = 1 ϵ = 1 ,有 f ( n ) = Ω ( n 1 + ϵ ) f(n) = \Omega(n^{1+\epsilon}) f ( n ) = Ω ( n 1 + ϵ ) 。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) a f ( n / b ) = 2 ( n / 2 ) 4 = ( 1 / 8 ) n 4 ≤ ( 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 = 1 0 / 7 ,f ( n ) = n f(n) = n f ( n ) = n 。有 n log b a = n 0 = 1 n^{\log_ba} = n^0 = 1 n log b a = n 0 = 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) a f ( n / b ) = 7 n / 1 0 ≤ ( 7 / 1 0 ) f ( n ) ,存在 c = 7 / 10 c = 7/10 c = 7 / 1 0 。符合情况3。
c. T ( n ) = Θ ( n 2 lg n ) T(n) = \Theta(n^2\lg n) T ( n ) = Θ ( n 2 lg n ) 。使用主方法证明。a = 16 a=16 a = 1 6 ,b = 4 b=4 b = 4 ,f ( n ) = n 2 f(n) = n^2 f ( n ) = n 2 。有 n log b a = n 2 n^{\log_ba} = n^2 n log b a = n 2 ,f ( n ) = Θ ( n log b a ) f(n) = \Theta(n^{\log_ba}) f ( n ) = Θ ( n log b a ) ,符合情况2。
d. T ( n ) = Θ ( n 2 ) T(n) = \Theta(n^2) T ( n ) = Θ ( n 2 ) 。使用主方法证明。a = 7 a=7 a = 7 ,b = 3 b=3 b = 3 ,f ( n ) = n 2 f(n) = n^2 f ( n ) = n 2 。有 n log b a = n log 3 7 n^{\log_ba} = n^{\log_37} n log b a = n log 3 7 ,1.77 < log 3 7 < 1.78 1.77<\log_37 < 1.78 1 . 7 7 < log 3 7 < 1 . 7 8 。
存在 ϵ = 0.2 \epsilon = 0.2 ϵ = 0 . 2 ,有 f ( n ) = Ω ( n log 3 7 + ϵ ) f(n) = \Omega(n^{\log_37 +\epsilon}) f ( n ) = Ω ( n log 3 7 + ϵ ) 。a f ( n / b ) = 7 ( n / 3 ) 2 ≤ ( 7 / 9 ) f ( n ) af(n/b) = 7(n/3)^2 \le (7/9)f(n) a f ( 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 ) = Θ ( n lg 7 ) 。使用主方法证明。a = 7 a=7 a = 7 ,b = 2 b=2 b = 2 ,f ( n ) = n 2 f(n) = n^2 f ( n ) = n 2 。有 n log b a = n log 2 7 n^{\log_ba} = n^{\log_27} n log b a = n log 2 7 ,2.80 < log 2 7 < 2.81 2.80<\log_27 < 2.81 2 . 8 0 < log 2 7 < 2 . 8 1 。
存在 ϵ = 0.8 \epsilon = 0.8 ϵ = 0 . 8 ,有 f ( n ) = O ( n log 2 7 − ϵ ) f(n) = O(n^{\log_27 -\epsilon}) f ( n ) = O ( n log 2 7 − ϵ ) 。符合情况1。
f. T ( n ) = Θ ( n lg n ) T(n) = \Theta(\sqrt n\lg n) T ( n ) = Θ ( n lg n ) 。使用主方法证明。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} n log b a = n 1 / 2 ,f ( n ) = Θ ( n log b a ) f(n) = \Theta(n^{\log_ba}) f ( n ) = Θ ( n log b a ) ,符合情况2。
g. T ( n ) = Θ ( n 3 ) T(n) = \Theta(n^3) T ( n ) = Θ ( n 3 ) 。使用递归树方法证明。
第 0 层:n n n 个元素,代价为 n 2 n^2 n 2 。
第 1 层:n − 2 n-2 n − 2 个元素,代价为 ( n − 2 ) 2 = n 2 − 4 n + 4 (n-2)^2 = n^2 - 4n + 4 ( n − 2 ) 2 = n 2 − 4 n + 4 。
……
第 i i i 层:n − 2 i n-2i n − 2 i 个元素,代价为 ( n − 2 i ) 2 = n 2 − 4 i n + 4 i 2 (n-2i)^2 = n^2 - 4in + 4i^2 ( n − 2 i ) 2 = n 2 − 4 i n + 4 i 2 。
令 n − 2 i = 1 n-2i = 1 n − 2 i = 1 ,得递归树共有 ( n − 1 ) / 2 (n-1)/2 ( n − 1 ) / 2 层。
将所有层的代价相加,得T ( n ) = ∑ i = 0 ( n − 1 ) / 2 − 1 ( n 2 − 4 i n + 4 i 2 ) = n 2 ( n − 1 ) / 2 − 4 n ∑ i = 0 ( n − 3 ) / 2 i + 4 ∑ i = 0 ( n − 3 ) / 2 i 2 = n 2 ( n − 1 ) / 2 − 4 n ( ( ( n − 1 ) / 2 ) ⋅ ( ( n − 3 ) / 2 ) 2 ) + 4 ( ( ( n − 3 ) / 2 ) ⋅ ( ( n − 1 ) / 2 ) ⋅ ( n − 2 ) 6 ) = n 3 / 6 + n 2 / 2 + n / 3 − 1 = Θ ( n 3 ) T(n) = \sum_{i=0}^{(n-1)/2-1}(n^2 -4in + 4i^2)
=n^2(n-1)/2 - 4n\sum_{i=0}^{(n-3)/2}i + 4\sum_{i=0}^{(n-3)/2}i^2 \\
=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}) \\
= n^3/6 +n^2/2 +n/3-1 \\
= \Theta(n^3) T ( n ) = ∑ i = 0 ( n − 1 ) / 2 − 1 ( n 2 − 4 i n + 4 i 2 ) = n 2 ( n − 1 ) / 2 − 4 n ∑ i = 0 ( n − 3 ) / 2 i + 4 ∑ i = 0 ( n − 3 ) / 2 i 2 = n 2 ( n − 1 ) / 2 − 4 n ( 2 ( ( n − 1 ) / 2 ) ⋅ ( ( n − 3 ) / 2 ) ) + 4 ( 6 ( ( n − 3 ) / 2 ) ⋅ ( ( n − 1 ) / 2 ) ⋅ ( n − 2 ) ) = n 3 / 6 + n 2 / 2 + n / 3 − 1 = Θ ( n 3 )
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) = Θ ( q − p + 1 ) 。a. 考虑在一个已排序的数组中找一个数字的递归二分查找算法(见练习 2.3-5)。当使用上面三种方法传递数组时,给出二分查找的最坏情况运行时间的递归式,并给出其解的好的上界。设 N N N 是原问题的规模,n n n 是子问题的规模。b. 针对 2.3.1 章节的 MERGE-SORT 算法,重做 (a) 部分。
解:
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 ) = 4 T ( n / 3 ) + n lg n b. T ( n ) = 3 ( n / 3 ) + n / lg n T(n) = 3(n/3) + n/\lg n T ( n ) = 3 ( n / 3 ) + n / lg n c. T ( n ) = 4 T ( n / 2 ) + n 2 n T(n) = 4T(n/2) + n^2 \sqrt n T ( n ) = 4 T ( n / 2 ) + n 2 n d. T ( n ) = 3 T ( n / 3 − 2 ) + n / 2 T(n) = 3T(n/3-2) + n/2 T ( n ) = 3 T ( n / 3 − 2 ) + n / 2 e. T ( n ) = 2 T ( n / 2 ) + n / lg n T(n) = 2T(n/2) + n/\lg n T ( n ) = 2 T ( n / 2 ) + n / lg n 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 ( n − 1 ) + 1 / n h. T ( n ) = T ( n − 1 ) + lg n T(n) = T(n-1) + \lg n T ( n ) = T ( n − 1 ) + lg n i. T ( n ) = T ( n − 2 ) + 1 / lg n T(n) = T(n-2) + 1/\lg n T ( n ) = T ( n − 2 ) + 1 / lg n j. T ( n ) = n T ( n ) + n T(n) = \sqrt nT(\sqrt n) + n T ( n ) = n T ( 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 = 0 ∑ ∞ F i z i = 0 + z + z 2 + 2 z 3 + 3 z 4 + 5 z 5 + 8 z 6 + 1 3 z 7 + 2 1 z 8 + ⋯
其中,F i F_i F i 是第 i i i 个斐波那契数。
a. 证明:F ( z ) = z + z F + z 2 F \mathscr{F}(z) = z + z\mathscr{F} + z^2\mathscr{F} F ( z ) = z + z F + z 2 F 。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 ) = 1 − z − z 2 z = ( 1 − ϕ z ) ( 1 − ϕ z ) z = 5 1 ( 1 − ϕ z 1 − 1 − ϕ z 1 )
其中,ϕ = 1 + 5 2 = 1.61803 … \phi = \frac{1+\sqrt5}{2} = 1.61803\dots ϕ = 2 1 + 5 = 1 . 6 1 8 0 3 … ,ϕ ^ = 1 − 5 2 = − 0.61803 … \widehat\phi = \frac{1-\sqrt5}{2} = -0.61803\dots ϕ = 2 1 − 5 = − 0 . 6 1 8 0 3 … 。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 = 0 ∑ ∞ 5 1 ( ϕ i − ϕ i ) z i d. 使用 (c) 部分证明,对于 i > 0 i>0 i > 0 ,有 F i = ϕ i / 5 F_i = \phi^i/\sqrt5 F i = ϕ 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 数组
本章节的其他内容:【算法导论】第4章 分而治之 (1) 【算法导论】第4章 分而治之 (2)