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
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)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=0logbn−1ajf(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=0logbn−1ajf(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
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=0logbn−1ajf(n/bj) (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(nlogba−ϵ),那么 g ( n ) = O ( n log b a ) g(n) = O(n^{\log_ba}) g(n)=O(nlogba)。
- 如果 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)。
- 如果对于所有足够大的 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=0logbn−1aj(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=0logbn−1aj(n/bj)logba−ϵ=nlogba−ϵ∑j=0logbn−1(abϵ/blogba)j=nlogba−ϵ∑j=0logbn−1(bϵ)j=nlogba−ϵ(bϵ−1bϵlogbn−1)=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=0logbn−1aj(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=0logbn−1aj(n/bj)logba=nlogba∑j=0logbn−1(a/blogba)j=nlogba∑j=0logbn−11=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/bj−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=0logbn−1ajf(n/bj)≤∑j=0logbn−1cjf(n)+O(1)≤f(n)∑j=0∞cj+O(1)=f(n)1−c1+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)aT(n/b)+f(n)if n=1if n=bi
其中,
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(nlogba−ϵ),那么 T ( n ) = Θ ( n log b a ) T(n) = \Theta(n^{\log_ba}) T(n)=Θ(nlogba)。
- 如果 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)。
- 如果对于所有足够大的 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={n⌈nj−1/b⌉if j=0if j>0 (4.27)
确定深度
k
k
k,使
n
k
n_k
nk 是一个常数。使用不等式
⌈
x
⌉
≤
x
+
1
\lceil x \rceil \le x + 1
⌈x⌉≤x+1,得
n
0
≤
n
n_0 \le n
n0≤n,
n
1
≤
n
b
+
1
n_1 \le \frac{n}{b} + 1
n1≤bn+1,
n
2
≤
n
b
2
+
1
b
+
1
n_2 \le \frac{n}{b^2} + \frac{1}{b} + 1
n2≤b2n+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}
nj≤bjn+∑i=0j−1bi1<bjn+∑i=0∞bi1=bjn+b−1b。
令
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)
n⌊logbn⌋<b⌊logbn⌋n+b−1b<blogbn−1n+b−1b=n/bn+b−1b=b+b−1b=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=0⌊logbn⌋−1ajf(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=0⌊logbn⌋−1ajf(nj)。 (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) 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
j≤⌊logbn⌋,得
b
j
/
n
≤
1
b^j/n \le 1
bj/n≤1。
由界
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+b−1b)logba=c(bjn(1+nbj⋅b−1b))logba=c(ajnlogba)(1+nbj⋅b−1b)logba≤c(ajnlogba)(1+b−1b)logba=O(ajnlogba),
因为
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(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
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⌉⌉=⌈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=0logbn−1ajf(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=0logbn−1ajf(n/bj)=∑j=0logbn−1ajΘ((n/bj)logbalgk(n/bj))=∑j=0logbn−1ajΘ((nlogba/aj)lgk(n/bj))=∑j=0logbn−1Θ(nlogbalgk(n/bj))=Θ(nlogba)∑j=0logbn−1lgk(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=0logbn−1lgk(n/bj)≤∑j=0logbn−1lgkn=logbn⋅lgkn=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(logbn−1)/2lgk(n/bj)+∑j=(logbn+1)/2logbn−1lgk(n/bj)≥∑j=0(logbn−1)/2lgk(n/b(logbn−1)/2)=((logbn−1)/2+1)⋅lgk(n/b(logbn−1)/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
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)=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(n−2)+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)=Θ(nlgn)。使用主方法证明。
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
n−2 个元素,代价为
(
n
−
2
)
2
=
n
2
−
4
n
+
4
(n-2)^2 = n^2 - 4n + 4
(n−2)2=n2−4n+4。
……
第
i
i
i 层:
n
−
2
i
n-2i
n−2i 个元素,代价为
(
n
−
2
i
)
2
=
n
2
−
4
i
n
+
4
i
2
(n-2i)^2 = n^2 - 4in + 4i^2
(n−2i)2=n2−4in+4i2。
令
n
−
2
i
=
1
n-2i = 1
n−2i=1,得递归树共有
(
n
−
1
)
/
2
+
1
(n-1)/2+1
(n−1)/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(n−1)/2−1(n2−4in+4i2)+Θ(1)=n2(n−1)/2−4n∑i=0(n−3)/2i+4∑i=0(n−3)/2i2+Θ(1)=n2(n−1)/2−4n(2((n−1)/2)⋅((n−3)/2))+4(6((n−3)/2)⋅((n−1)/2)⋅(n−2))+Θ(1)=n3/6+n2/2+n/3−1+Θ(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)
=Θ(q−p+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
N⋅2i+n,其中
i
=
0
,
1
,
.
.
.
,
lg
n
−
1
i=0,1,...,\lg n-1
i=0,1,...,lgn−1。最后一层代价为
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)=N⋅∑i=0lgn−12i+nlgn+(nN+n)=(2lgn−1)N+nlgn+(nN+n)=2nN+nlgn+n−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)。
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(lgn−i⋅lg3)
将所有层次的代价相加,得
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)=nlgn⋅∑i=0log3n−1(4/3)i−nlg3∑i=0log3n−1i(4/3)i+Θ(nlog34)=nlgn⋅3((4/3)log3n−1)−nlg3(12−12nlog34/n+3log3n⋅nlog34/n)+Θ(nlog34)=−3nlgn−12nlg3+12lg3⋅nlog34+Θ(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/(lgn−ilg3),
i
=
0
,
1
,
.
.
.
,
log
3
n
−
1
i=0,1,...,\log_3n-1
i=0,1,...,log3n−1。
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=0log3n−1n/(lgn−ilg3)+Θ(n)≥∑i=0log3n−1n/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=0log3n−1n/(lgn−(log3n−1)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/3−2)+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/(lgn−i),
i
=
0
,
1
,
.
.
.
,
lg
n
−
1
i=0,1,...,\lg n-1
i=0,1,...,lgn−1。
与 (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(n−1)+1/n
解:
h. T ( n ) = T ( n − 1 ) + lg n T(n) = T(n-1) + \lg n T(n)=T(n−1)+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(n−i),
i
=
0
,
1
,
.
.
.
,
n
−
2
i=0,1,...,n-2
i=0,1,...,n−2。
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=0n−2lg(n−i)+Θ(1)≤(n−2)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(n−2)/2lg(n−i)≥2n−2lg(n−(n−2)/2)=2n−2(lg(n+2)−1)≥2n−2(lgn−1),所以
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(n−2)+1/lgn
解:
j. T ( n ) = n T ( n ) + n T(n) = \sqrt nT(\sqrt n) + n T(n)=nT(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=0∑∞Fizi=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)=1−z−z2z=(1−ϕz)(1−ϕ
z)z=51(1−ϕz1−1−ϕ
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
ϕ
=21−5=−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=0∑∞51(ϕ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
1≤i<k≤m 和
1
≤
j
<
l
≤
n
1 \le j < l \le n
1≤j<l≤n,有
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,...,m−1 和
j
=
1
,
2
,
.
.
.
,
n
−
1
j=1,2,...,n-1
j=1,2,...,n−1,有
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 个:
- 在 Strassen 算法的 Θ ( n lg 7 ) \Theta(n^{\lg 7}) Θ(nlg7) 运行时间中隐藏的常数因子,大于 SQUARE-MATRIXMULTIPLY 过程中 Θ ( n 3 ) \Theta(n^3) Θ(n3) 时间中的常数因子。
- 当矩阵稀疏时,为稀疏矩阵量身定制的方法会更快。
- Strassen 算法在数值稳定上不如 SQUARE-MATRIXMULTIPLY。换句话说,由于计算机运算非整数值的精度有限,因此与 SQUARE-MATRIX-MULTIPLY 相比,在 Strassen 算法中累积的错误更大。
- 在递归级别上形成的子矩阵会消耗空间。
后两个原因在 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 1≤x≤x0if x>x0 (4.30)
其中,
- x ≤ 1 x \le 1 x≤1 是实数,
- x 0 x_0 x0 是常数, x 0 ≥ 1 / b i x_0 \ge 1/b_i x0≥1/bi 且 x 0 ≥ 1 / ( 1 − b i ) x_0 \ge 1/(1-b_i) x0≥1/(1−bi),对于 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 k≥1 是个整数常数,
- f ( x ) f(x) f(x) 是个非负函数,满足多项式增长条件(polynomial-growth condition):存在正常数 c 1 c_1 c1 和 c 2 c_2 c2,对于所有 x ≥ 1 x\ge1 x≥1,对于 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 bix≤u≤x,有 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 方法可能有点难以使用,但可用于解决将问题划分为大小不等的子问题的递归式。主方法更易于使用,但仅在子问题大小相等时才适用。
学习笔记目录:【算法导论】目录