第四章 分治策略 4.6 证明主定理

4.6 证明主定理

一.

1.

  当我们在一个局限的值域上使用渐近符号时,必须要时刻小心,避免得到错误的结论。例如:对 n n n 2 2 2 的幂的情况证明 T ( n ) = O ( n ) T(n)=O(n) T(n)=O(n) 并不保证 T ( n ) = O ( n ) T(n)=O(n) T(n)=O(n) 。函数 T ( n ) T(n) T(n) 可能是这样定义的:
T ( n ) = { n 若  n = 1 , 2 , 4 , 8 , . . . n 2 其他 T(n)=\begin{cases}n&\text{若 $n = 1, 2, 4, 8, ...$}\\n^2&\text{其他}\end{cases} T(n)={nn2 n=1,2,4,8,...其他
  此例中适用于所有 n n n 值的最佳上界为 T ( n ) = O ( n 2 ) T(n)=O(n^2) T(n)=O(n2) 。由于可能导致这种严重后果,在并不绝对清楚应用环境的情况下,永远也不要在一个有限的值域上使用渐近符号。

2. 对 b b b 的幂证明主定理

  主定理第一部分分析主定理的递归式 ( 4.20 ) (4.20) 4.20
T ( n ) = a T ( n b ) + f ( n ) T(n)=aT(\frac{n}{b})+f(n) T(n)=aT(bn)+f(n)
  假定 n n n b ( b > 1 ) b(b>1) b(b>1) 的幂, b b b 不一定是一个整数。

  引理 4.2 4.2 4.2

  令 a ≥ 1 a\geq1 a1 b > 1 b>1 b>1 是常数, f ( n ) f(n) f(n) 是一个定义在 b b b 的幂上的非负函数。 T ( n ) T(n) T(n) 是定义在 b b b 的幂上的递归式:
T ( n ) = { Θ ( 1 ) 若  n = 1 a T ( n b ) + f ( n ) 若  n = b i T(n)=\begin{cases}\Theta(1)&\text{若 $n = 1$}\\aT(\frac{n}{b})+f(n)& \text{若 $n = b^i$}\end{cases} T(n)={Θ(1)aT(bn)+f(n) n=1 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_b a})+\sum_{j=0}^{\log_b n-1}a^jf(\frac{n}{b^j}) T(n)=Θ(nlogba)+j=0logbn1ajf(bjn)

  证明:

  使用如图 4 − 7 4-7 47 中的递归树。树的根结点的代价为 f ( n ) f(n) f(n) ,它有 a a a 个孩子结点,每个的代价为 f ( b / n ) f(b/n) f(b/n) 。(将 a a a 看做一个整数非常方便,当可视化递归树时尤其如此,但从数学角度并不要求这一点)。每个孩子结点又有 a a a 个孩子,使得在深度为 2 2 2 的层次上有 a 2 a^2 a2 个结点,每个的代价为 f ( n / b 2 ) f(n/b^2) f(n/b2) 。一般地,深度为 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_b n}=n^{\log_ba} alogbn=nlogba 个叶结点。
第四章 分治策略 4.6 证明主定理_第1张图片
  我们将图 4 − 7 4-7 47 所示的递归树中的每层节点的代价求和,得到公式 ( 4.21 ) (4.21) 4.21 。深度为 j j j 的所有内部结点的代价为 a j f ( n / b j ) a^jf(n/b^j) ajf(n/bj) ,所以内部结点的总代价为: ∑ j = 0 log ⁡ b n − 1 a j f ( n b j ) \sum_{j=0}^{\log_bn-1}a^jf(\frac{n}{b^j}) j=0logbn1ajf(bjn)
  在分治算法中,这个和表示分解子问题与合并子问题的代价。所有叶结点的代价(表示完成所有 n log ⁡ b a n^{\log_b a} nlogba 个规模为 1 1 1 的子问题的代价)为 Θ ( n log ⁡ b a ) \Theta(n^{\log_ba}) Θ(nlogba)

  从递归树看,主定理的三种情况分别对应以下三种情况:(1)树的总代价有叶结点的代价决定;(2)树的总代价均匀分布在树的所有层次上;(3)树的总代价由根结点的代价决定。

  引理4.3

  令 a ≥ 1 a≥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 )                         ( 4.22 ) g(n)=\sum_{j=0}^{\log_b n-1}a^jf(\frac{n}{b^j})\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space(4.22) g(n)=j=0logbn1ajf(bjn)                       (4.22)
  对 b b b 的幂, g ( n ) g(n) g(n) 有如下渐近界:
  1. 若对某个常数 ϵ > 0 \epsilon>0 ϵ>0 f ( n ) = O ( n log ⁡ b a − ϵ ) f(n)=O(n^{\log_b a-\epsilon}) f(n)=O(nlogbaϵ) g ( n ) = O ( n log ⁡ b a ) g(n)=O(n^{\log_b a}) g(n)=O(nlogba)
  2. 若 f ( n ) = Θ ( n log ⁡ b a ) f(n)=\Theta(n^{\log_b a}) f(n)=Θ(nlogba) ,则 g ( n ) = O ( log ⁡ b a lg ⁡ n ) g(n)=O(\log_b a\lg n) g(n)=O(logbalgn)
  3. 若对某个常数 c < 1 c<1 c<1 和所有足够大的 n n n a f ( n / b ) ≤ c f ( n ) af(n/b)≤cf(n) af(n/b)cf(n) ,则 g ( n ) = Θ ( f ( n ) ) g(n)=\Theta(f(n)) g(n)=Θ(f(n))

  证明:

对情况 1 1 1 ,我们有 f ( n ) = O ( n log ⁡ b a − ϵ ) f(n)=O(n^{\log_b a-\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_b a-\epsilon}) f(n/bj)=O((n/bj)logbaϵ) 。代入公式 ( 4.22 ) (4.22) 4.22 g ( n ) = O ( ∑ j = 0 log ⁡ b n − 1 a j ( n b j ) log ⁡ b a − ϵ )           ( 4.23 ) g(n)=O(\sum_ {j=0}^{\log_b n-1}a^j(\frac{n}{b^j})^{\log_b a-\epsilon})\space\space\space\space\space\space\space\space\space(4.23) g(n)=O(j=0logbn1aj(bjn)logbaϵ)         (4.23)  对于 O O O 符号内的和式,通过提取因子并化简来求它的界,得到一个递增的几何级数: ∑ 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 ) \begin{aligned}\sum_{j=0}^{\log_b n-1}a^j(\frac{n} {b^j})^{\log_ba-\epsilon}&=n^{\log_b a-\epsilon}\sum_{j=0}^{\log_b n-1}(\frac{ab^{\epsilon}}{b^{\log_ba}})^j\\&=n^{\log _b a- \epsilon } \sum_ { j = 0 } ^ { \log_b n-1 }(b ^ { \epsilon })^ j \\ &= n ^ { \log _b a- \epsilon }(\frac { b ^ { \epsilon \log _b n } -1 } { b ^ { \epsilon } -1 } )\\&=n^{\log_b a-\epsilon}(\frac{n^{\epsilon}-1}{b^{\epsilon}-1})\\ \end{aligned} j=0logbn1aj(bjn)logbaϵ=nlogbaϵj=0logbn1(blogbaabϵ)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_b a-\epsilon}O(n^{\epsilon})=O(n^{\log_b a}) nlogbaϵO(nϵ)=O(nlogba) 。用表达式代换公式 ( 4.23 ) (4.23) (4.23) 中的和式,得到 g ( n ) = O ( log ⁡ b a ) g(n)=O(\log_b a) g(n)=O(logba) ,因此情况 1 1 1 得证。
  由于情况 2 2 2 假定 f ( n ) = Θ ( n log ⁡ b a ) f(n)=\Theta(n^{\log_b a}) f(n)=Θ(nlogba) ,因此有 f ( n / b j ) = Θ ( ( n / b j ) log ⁡ b a ) f(n/b^j)=\Theta((n/b^j)^{\log_b a}) f(n/bj)=Θ((n/bj)logba) 。代入公式 ( 4.22 ) (4.22) (4.22)
g ( n ) = Θ ( ∑ j = 0 log ⁡ b n − 1 a j ( n b j ) log ⁡ b a )                  ( 4.24 ) g(n)=\Theta(\sum_{j=0}^{\log_b n-1}a^j(\frac{n}{b^j})^{\log_b a})\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space(4.24) g(n)=Θ(j=0logbn1aj(bjn)logba)                (4.24)
  采用于情况 1 1 1 相同的方式,求出 Θ \Theta Θ 符号内和式的界,但这次并未得到一个几何级数,而是发现和式的每一项都是相同的:
∑ 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_b n-1}a^j(\frac { n } { b ^ j }) ^ { \log _b a } = n ^ { \log _b a } \sum _ { j = 0 } ^ { \log _b n-1 } (\frac { a } { b ^ { \log _b a } })^ j = n ^ { \log _b a } \sum _ { j = 0 } ^ { \log _b n-1 }1=n^{\log_b a}\log_b n j=0logbn1aj(bjn)logba=nlogbaj=0logbn1(blogbaa)j=nlogbaj=0logbn11=nlogbalogbn
  用这个表达式替换公式 ( 4.24 ) (4.24) (4.24) 中的和式,我们得到
g ( n ) = Θ ( n log ⁡ b a log ⁡ b n ) = Θ ( n log ⁡ b a lg ⁡ n ) g(n)=\Theta(n^{\log_b a}\log_b n)=\Theta(n^{\log_b a}\lg n) g(n)=Θ(nlogbalogbn)=Θ(nlogbalgn)
  情况 2 2 2 得证。
  情况 3 3 3 的证明类似。由于 f ( n ) f(n) f(n) 出现在 g ( n ) g(n) g(n) 的定义 ( 4.22 ) (4.22) (4.22) 中,且 g ( n ) g(n) g(n) 的所有项都是非负的,因此可以得出结论:对 b b b 的幂, g ( n ) = Ω ( f ( n ) ) g(n)=\Omega(f(n)) g(n)=Ω(f(n)) 。假定在这个引理中,对某个常数为 c < 1 c<1 c<1 和所有足够大的 n n n a f ( n / b ) ≤ c f ( n ) af(n/b)≤cf(n) af(n/b)cf(n) 。将这个假设改写为 f ( n / b ) ≤ ( c / a ) f ( n ) f(n/b)≤(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)≤(c/a)^jf(n) f(n/bj)(c/a)jf(n) ,或等价地, a j f ( n / b j ) ≤ c j f ( n ) a^jf(n/b^j)≤c^jf(n) ajf(n/bj)cjf(n) ,其中假设进行迭代的值足够大。由于最后一个,也就是最小的值 n / b j − 1 n/b^{j-1} n/bj1 ,因此假定 n / b j − 1 n/b^{j-1} n/bj1 足够大就够了。
  代入公式 ( 4.22 ) (4.22) (4.22) 并化简,我们得到一个几何级数,但与情况 1 1 1 证明中的几何级数不同,这次得到的是递减的几何级数。使用一个 O ( 1 ) O(1) O(1) 项来表示 n n 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 1 − c ) + O ( 1 ) = O ( f ( n ) ) \begin{aligned}g(n)&= \sum_ { j = 0 } ^ { \log _b n-1 } a ^ jf (n / b ^ j )\\&≤ \sum _ { j = 0 } ^ { \log _b n- 1 } c ^ jf ( n ) + O ( 1)&\\&≤f ( n)\sum _ { j = 0 } ^ { \infin } c ^ j + O (1)\\&=f(n)(\frac{1}{1-c})+O(1)\\&=O(f(n))\end{aligned} 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 是一个常数。因此可以得到结论:对 b b b 的幂, g ( n ) = Θ ( f ( n ) ) g(n)=\Theta(f(n)) g(n)=Θ(f(n)) 。情况 3 3 3 得证,引理证毕。

  引理4.4

  令 a ≥ 1 a\geq1 a1 b > 1 b>1 b>1 是常数, f ( n ) f(n) f(n) 是一个定义在 b b b 的幂上的非负函数。 T ( n ) T(n) T(n) 是定义在 b b b 的幂上的递归式:
T ( n ) = { Θ ( 1 ) 若  n = 1 a T ( n / b ) + f ( n ) 若 n = b i T(n)=\begin{cases}\Theta(1)&\text{若 $n=1$}\\aT(n/b)+f(n)&\text{若$n=b^i$} \end{cases} T(n)={Θ(1)aT(n/b)+f(n) n=1n=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_b a-\epsilon}) f(n)=O(nlogbaϵ) ,则 T ( n ) = Θ ( n log ⁡ b a ) T(n)=\Theta(n^{\log_b a}) T(n)=Θ(nlogba)
  2. 若 f ( n ) = Θ ( n log ⁡ b a ) f(n)=\Theta(n^{\log_b a}) f(n)=Θ(nlogba) ,则 T ( n ) = Θ ( n log ⁡ b a lg ⁡ n ) T(n)=\Theta(n^{\log_b a}\lg n) T(n)=Θ(nlogbalgn)
  3. 若对某个常数 ϵ > 0 \epsilon>0 ϵ>0 ,有 f ( n ) = Ω ( n log ⁡ b a + ϵ ) f(n)=\Omega(n^{\log_b a+\epsilon}) f(n)=Ω(nlogba+ϵ) ,并且对某个常数 c < 1 c<1 c<1 和足够大的 n n n ,有 a f ( n / b ) ≤ c f ( n ) af(n/b)\leq cf(n) af(n/b)cf(n) ,则 T ( n ) = Θ ( f ( n ) ) T(n)=\Theta(f(n)) T(n)=Θ(f(n))

  证明:

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

3. 向下取整和向上取整

T ( n ) = a T ( ⌈ n / b ⌉ ) + f ( n )              ( 4.25 ) T(n)=aT(\lceil n/b\rceil)+f(n)\space\space\space\space\space\space\space\space\space\space\space\space(4.25) T(n)=aT(n/b)+f(n)            (4.25) T ( n ) = a T ( ⌊ n / b ⌋ ) + f ( n )              ( 4.26 ) T(n)=aT(\lfloor n/b\rfloor)+f(n)\space\space\space\space\space\space\space\space\space\space\space\space(4.26) T(n)=aT(n/b)+f(n)            (4.26)
  对第一种情况应用下界 ⌈ n / b ⌉ ≥ n / b \lceil n/b\rceil\geq n/b n/bn/b 来得到所需结果,对第二种情况应用上界 ⌊ n / b ⌋ ≤ n / b \lfloor n/b\rfloor\leq n/b n/bn/b 。可以使用几乎一样的技术来处理递归式 ( 4.26 ) (4.26) 4.26 的下界和递归式的 ( 4.25 ) (4.25) 4.25 的上界,因此我们给出后一个界的证明。
  对图 4 − 7 4-7 47 的递归树进行修改,得到图 4 − 8 4-8 48 中的递归树。当沿着递归树向下时,我们得到如下递归调用的参数序列:
n ⌈ n / b ⌉ ⌈ ⌈ n / b ⌉ / b ⌉ ⌈ ⌈ ⌈ n / b ⌉ / b ⌉ / b ⌉ . . . \begin{aligned}&n\\&\lceil n/b\rceil\\&\lceil\lceil n/b\rceil /b\rceil\\&\lceil\lceil\lceil n/b\rceil/b\rceil/b\rceil\\&...\end{aligned} nn/bn/b/bn/b/b/b...
  用 n j n_j nj 表示序列中第 j j j 个元素,其中
n j = { n 若  j = 0 ⌈ n j − 1 / n ⌉ 若  j > 0 n_j=\begin{cases}n&\text{若 $j=0$}\\\lceil n_{j-1}/n\rceil&\text{若 $j>0$}\end{cases} nj={nnj1/n j=0 j>0
  我们的第一个目标是确定 n k n_k nk 是常数时的深度 k k k 。利用不等式 ⌈ x ⌉ ≤ x + 1 \lceil x\rceil\leq x+1 xx+1 ,可得
n 0 ≤ n n 1 ≤ n b + 1 n 2 ≤ n b 2 + 1 b + 1 n 3 ≤ n b 3 + 1 b 2 + 1 b + 1 . . . \begin{aligned}&n_0\leq n\\&n_1\leq\frac{n}{b}+1\\&n_2\leq \frac{n}{b^2}+\frac{1}{b}+1\\&n_3\leq \frac{n}{b^3}+\frac{1}{b^2}+\frac{1}{b}+1\\&...\end{aligned} n0nn1bn+1n2b2n+b1+1n3b3n+b21+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\leq \frac{n}{b^j}+\sum_{i=0}^{j-1}\frac{1}{b^i}<\frac{n}{b^j}+\sum_{i=0}^{\infin}\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_bn\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 ) \begin{aligned}n_{\lfloor\log_bn\rfloor} &<\frac{n}{b^{\lfloor\log_b n\rfloor}}+\frac{b}{b-1}<\frac{n}{b^{\log_bn-1}}+\frac{b}{b-1}=\frac{n}{n/b}+\frac{b}{b-1}\\&=b+\frac{b}{b-1}=O(1)\end{aligned} nlogbn<blogbnn+b1b<blogbn1n+b1b=n/bn+b1b=b+b1b=O(1)
  因此我们可以看到在深度 ⌊ log ⁡ b n ⌋ \lfloor\log_bn\rfloor logbn ,问题规模至多是常数。
第四章 分治策略 4.6 证明主定理_第2张图片
  从图 4 − 8 4-8 48 可以看出,
T ( n ) = Θ ( n log ⁡ b a ) + ∑ j = 0 ⌊ log ⁡ b n ⌋ − 1 a j f ( n j )           ( 4.28 ) T(n)=\Theta(n^{\log_b a})+\sum_{j=0}^{\lfloor\log_b n\rfloor-1}a^jf(n_j)\space\space\space\space\space\space\space\space\space(4.28) T(n)=Θ(nlogba)+j=0logbn1ajf(nj)         (4.28)
  对和式求值:
g ( n ) = ∑ j = 0 ⌋ log ⁡ b n ⌋ − 1 a j f ( n j ) g(n)=\sum_{j=0}^{\rfloor\log_bn\rfloor-1}a^jf(n_j) g(n)=j=0logbn1ajf(nj)
  方法与引理 4.3 4.3 4.3 的证明类似。我们从情况 3 3 3 开始,如果对 n > b + b / ( b − 1 ) n>b+b/(b-1) n>b+b/(b1) a f ( ⌊ n / b ⌋ ) ≤ c f ( n ) af(\lfloor n/b\rfloor)\leq cf(n) af(n/b)cf(n) 成立,其中 c < 1 c<1 c<1 是常数,则有 a j f ( n j ) ≤ c j f ( n ) a^jf(n_j)\leq c^jf(n) ajf(nj)cjf(n) 。因此,我们可以像引理 4.3 4.3 4.3 的证明一样来对公式 ( 4.29 ) (4.29) 4.29 的和式进行求值。对于情况 2 2 2 ,我们有 f ( n ) = Θ ( n log ⁡ b a ) f(n)=\Theta(n^{\log_ba}) f(n)=Θ(nlogba) 。如果能证明 f ( n j ) = O ( n log ⁡ b a / a j ) = O ( ( n / b j ) log ⁡ b a ) f(n_j)=O(n^{\log_ba}/a^j)=O((n/b^j)^{\log_ba}) f(nj)=O(nlogba/aj)=O((n/bj)logba) ,则情况 2 2 2 的证明直接使用引理 4.3 4.3 4.3 证明的方法即可。观察到 j ≤ ⌊ log ⁡ b n ⌋ j\leq \lfloor\log_bn\rfloor jlogbn 意味着 b j / n ≤ 1 b^j/n\leq1 bj/n1 。界 f ( n ) = O ( log ⁡ b a ) f(n)=O(\log_ba) f(n)=O(logba) 意味着存在常数 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 ) \begin{aligned}f(n_j)&\leq c(\frac{n}{b^j}+\frac{b}{b-1})^{\log_ba}=c(\frac{n}{b^j}(1+\frac{b^j}{n}\cdot\frac{b}{b-1}))^{\log_ba}\\&=c(\frac{n^{\log_b a}}{a^j})(1+(\frac{b^j}{n}\cdot\frac{b}{b-1}))^{\log_ba}\\&\leq c(\frac{n^{\log_b a}}{a^j})(1+\frac{b}{b-1})^{\log_ba}=O(\frac{n^{\log_ba}}{a^j})\end{aligned} 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 ) ) log ⁡ b a c(1+b/(b-1))^{\log_ba} c(1+b/(b1))logba 是常量。因此,情况 2 2 2 得证,情况 1 1 1 的证明几乎是一样的。关键是证明界 f ( n j ) = O ( ( n / b j ) log ⁡ b a − ϵ ) f(n_j)=O((n/b^j)^{\log_b a-\epsilon}) f(nj)=O((n/bj)logbaϵ) ,这部分与情况 2 2 2 证明中的对应部分相似,尽管使用的代数方法更复杂些。
  现在我们已经对所有整数 n n n 证明了主定理的上界,下界的证明类似。

二. 维基百科上的master定理

1. 一般形式

   The master theorem often yields asymptotically tight bounds to some recurrences from divide and conquer algorithms that partition an input into smaller subproblems of equal sizes, solve the subproblems recursively, and then combine the subproblem solutions to give a solution to the original problem. The time for such an algorithm can be expressed by adding the work that they perform at the top level of their recursion (to divide the problems into subproblems and then combine the subproblem solutions) together with the time made in the recursive calls of the algorithm. If T ( n ) {\displaystyle T(n)} T(n) denotes the total time for the algorithm on an input of size n {\displaystyle n} n, and f ( n ) {\displaystyle f(n)} f(n) denotes the amount of time taken at the top level of the recurrence then the time can be expressed by a recurrence relation that takes the form:
T ( n ) = a    T  ⁣ ( n b ) + f ( n ) T(n)=a\;T\!\left({\frac{n}{b}}\right)+f(n) T(n)=aT(bn)+f(n)
   Here n {\displaystyle n} n is the size of an input problem, a {\displaystyle a} a is the number of subproblems in the recursion, and b {\displaystyle b} b is the factor by which the subproblem size is reduced in each recursive call. The theorem below also assumes that, as a base case for the recurrence, T ( n ) = Θ ( 1 ) {\displaystyle T(n)=\Theta (1)} T(n)=Θ(1) when n {\displaystyle n} n is less than some bound κ > 0 {\displaystyle \kappa >0} κ>0, the smallest input size that will lead to a recursive call.
   Recurrences of this form often satisfy one of the three following regimes, based on how the work to split/recombine the problem f ( n ) {\displaystyle f(n)} f(n) relates to the critical exponent c crit ⁡ = log ⁡ b a {\displaystyle c_{\operatorname {crit} }=\log _{b}a} ccrit=logba. (The table below uses standard big O notation.)
在这里插入图片描述
第四章 分治策略 4.6 证明主定理_第3张图片
A useful extension of Case 2 handles all values of k {\displaystyle k} k:
第四章 分治策略 4.6 证明主定理_第4张图片

三.

*4.6-1

  对 b b b 是正整数而非任意实数的情况,给出公式 ( 4.27 ) (4.27) 4.27 n j n_j nj 的简单而准确的表达式。

  解: n j = ⌈ n b j ⌉ n_j=\lceil\frac{n}{b^j}\rceil nj=bjn    对任意正整数 a a a b b b ,任意实数 x x x ,有 ⌈ x a ⌉ − 1 < x a ≤ ⌈ x a ⌉ \lceil\frac{x}{a}\rceil-1<\frac{x}{a}\leq\lceil\frac{x}{a}\rceil ax1<axax 1 b ( ⌈ x a ⌉ − 1 ) < x a b ≤ 1 b ⌈ x a ⌉ \frac{1}{b}(\lceil\frac{x}{a}\rceil-1)<\frac{x}{ab}\leq\frac{1}{b}\lceil\frac{x}{a}\rceil b1(ax1)<abxb1ax    显然 P = ⌈ x / a ⌉ P=\lceil x/a\rceil P=x/a 是整数,令 P = q ⋅ b − r P=q\cdot b-r P=qbr ,其中 0 < r ≤ b 00<rb ,且 P > ( q − 1 ) b P>(q-1)b P>(q1)b ,从而 P − 1 ≥ ( q − 1 ) b P-1\geq(q-1)b P1(q1)b 。因此有 q − 1 ≤ P − 1 b < x a b ≤ P b ≤ q q-1\leq\frac{P-1}{b}<\frac{x}{ab}\leq\frac{P}{b}\leq q q1bP1<abxbPq    即 ⌈ x a b ⌉ = ⌈ 1 b ⌈ x a ⌉ ⌉ \lceil\frac{x}{ab}\rceil=\lceil\frac{1}{b}\lceil\frac{x}{a}\rceil\rceil abx=b1ax    故 n j = ⌈ n j − 1 b ⌉ = ⌈ 1 b ⌈ n b j − 1 ⌉ ⌉ = n b j n_j=\lceil\frac{n_{j-1}}{b}\rceil=\lceil\frac{1}{b}\lceil\frac{n}{b^{j-1}}\rceil\rceil=\frac{n}{b^j} nj=bnj1=b1bj1n=bjn    然而对任意实数 P > ( q − 1 ) b P>(q-1)b P>(q1)b 是推不出 P − 1 ≥ ( q − 1 ) b P-1\geq(q-1)b P1(q1)b

*4.6-2

  证明:如果 f ( n ) = Θ ( n log ⁡ b a lg ⁡ k n ) f(n)=\Theta(n^{\log_b a}\lg^kn) f(n)=Θ(nlogbalgkn) ,其中 k ≥ 0 k\geq0 k0 ,那么主递归式的解为 T ( n ) = Θ ( n log ⁡ b a lg ⁡ k + 1 n ) T(n)=\Theta(n^{\log_b a}\lg^{k+1}n) T(n)=Θ(nlogbalgk+1n) 。为简单起见,假定 n n n b b b 的幂。

  证明:首先设 g ( n ) = ∑ j = 0 log ⁡ b n − 1 a j f ( n b j ) g(n)=\sum_{j=0}^{\log_b n-1}a^jf(\frac{n}{b^j}) g(n)=j=0logbn1ajf(bjn)       因此 f ( n b j ) = Θ ( ( n b j ) log ⁡ b a lg ⁡ k ( n b j ) ) f(\frac{n}{b^j})=\Theta((\frac{n}{b^j})^{\log_ba}\lg^k(\frac{n}{b^j})) f(bjn)=Θ((bjn)logbalgk(bjn))       于是 g ( n ) = Θ ( ∑ j = 0 log ⁡ b n − 1 a j ( n b j ) log ⁡ b a lg ⁡ k ( n b j ) ) g(n)=\Theta(\sum_{j=0}^{\log_bn-1}a^j(\frac{n}{b^j})^{\log_ba}\lg^k(\frac{n}{b^j})) g(n)=Θ(j=0logbn1aj(bjn)logbalgk(bjn))      从而有 ∑ j = 0 log ⁡ b n − 1 a j ( n b j ) log ⁡ b a lg ⁡ k n b j = n log ⁡ b a ∑ j = 0 log ⁡ b n − 1 ( a b log ⁡ b a ) j lg ⁡ k n b j = n log ⁡ b a ∑ j = 0 log ⁡ b n − 1 lg ⁡ k n b j \begin{aligned}\sum_{j=0}^{\log_b n-1}a^j(\frac{n}{b^j})^{\log_ba}\lg^k\frac{n}{b^j}&=n^{\log_ba}\sum_{j=0}^{\log_bn-1}(\frac{a}{b^{\log_ba}})^j\lg^k\frac{n}{b^j}\\&=n^{\log_ba}\sum_{j=0}^{\log_bn-1}\lg^k\frac{n}{b^j}\end{aligned} j=0logbn1aj(bjn)logbalgkbjn=nlogbaj=0logbn1(blogbaa)jlgkbjn=nlogbaj=0logbn1lgkbjn      而 l g k n d = ( lg ⁡ n − lg ⁡ d ) k = lg ⁡ k n + o ( lg ⁡ k n ) lg^k\frac{n}{d}=(\lg n-\lg d)^k=\lg^kn+o(\lg^kn) lgkdn=(lgnlgd)k=lgkn+o(lgkn)      于是 ∑ j = 0 log ⁡ b n − 1 lg ⁡ k n b j = ∑ j = 0 log ⁡ b n − 1 ( lg ⁡ k n + o ( lg ⁡ k n ) ) = log ⁡ b n lg ⁡ k n + log ⁡ b n ⋅ o ( lg ⁡ k n ) = Θ ( log ⁡ b n lg ⁡ k n ) = Θ ( lg ⁡ k + 1 n ) \begin{aligned}\sum_{j=0}^{\log_bn-1}\lg^k\frac{n}{b^j}&=\sum_{j=0}^{\log_bn-1}(\lg^kn+o(\lg^kn))\\&=\log_bn\lg^kn+\log_bn\cdot o(\lg^kn)\\&=\Theta(\log_bn\lg^kn)\\&=\Theta(\lg^{k+1}n)\end{aligned} j=0logbn1lgkbjn=j=0logbn1(lgkn+o(lgkn))=logbnlgkn+logbno(lgkn)=Θ(logbnlgkn)=Θ(lgk+1n)      从而 T ( n ) = Θ ( n log ⁡ b a lg ⁡ k + 1 n ) T(n)=\Theta(n^{\log_ba}\lg^{k+1}n) T(n)=Θ(nlogbalgk+1n)

*4.6-3

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

  证明:对于式子 a f ( n / b ) ≤ c f ( n ) af(n/b)\leq cf(n) af(n/b)cf(n)      令 α = a / c \alpha=a/c α=a/c ,则 α f ( n / b ) ≤ f ( n ) \alpha f(n/b)\leq f(n) αf(n/b)f(n)      即 α f ( n ) ≤ f ( n / b ) \alpha f(n)\leq f(n/b) αf(n)f(n/b)      令 n = b i n=b^i n=bi ,不断迭代 α i f ( 1 ) ≤ f ( b i ) \alpha^if(1)\leq f(b^i) αif(1)f(bi)      而 i = log ⁡ b n i=\log_bn i=logbn      于是 f ( n ) ≥ α log ⁡ b n f ( 1 ) = n log ⁡ b α f(n)\geq\alpha^{\log_bn}f(1)=n^{\log_b\alpha} f(n)αlogbnf(1)=nlogbα      由于 c < 1 c<1 c<1 ,于是 α > a \alpha>a α>a      令 α = a + d ,   d > 0 \alpha=a+d,\space d>0 α=a+d, d>0      故而 f ( n ) = log ⁡ b a + log ⁡ b d = n log ⁡ b a + ϵ f(n)={\log_ba+\log_bd}=n^{\log_ba+\epsilon} f(n)=logba+logbd=nlogba+ϵ      其中 ϵ = log ⁡ b d \epsilon=\log_bd ϵ=logbd

四.

4-1 (递归式例子)

  对下列每个递归式,给出 T ( n ) T(n) T(n) 的渐近上界和渐近下界。假定 n ≤ 2 n\leq2 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 / 2 ) + n T(n)=2T(n/2)+\sqrt n T(n)=2T(n/2)+n
  g. T ( n ) = T ( n − 1 ) + n 2 T(n)=T(n-1)+n^2 T(n)=T(n1)+n2

  解:
    a. Θ ( n 4 ) \Theta(n^4) Θ(n4)
    b. Θ ( n ) \Theta(n) Θ(n)
    c. Θ ( n 2 lg ⁡ n ) \Theta(n^2\lg n) Θ(n2lgn)
    d. Θ ( n 2 ) \Theta(n^2) Θ(n2)
    e. Θ ( n lg ⁡ 7 ) \Theta(n^{\lg 7}) Θ(nlg7)
    f. Θ ( n lg ⁡ n ) \Theta(\sqrt n\lg n) Θ(n lgn)
    g. Θ ( n 3 ) \Theta(n^3) Θ(n3)

4-2 (参数传递代价)

  我们有一个贯穿本书的假设——过程调用中的参数传递花费常量时间,即使传递一个 N N N 个元素的数组也是如此。在大多数系统中,这个假设是成立的,因为传递的是指向数组的指针,而非数组本身。本体讨论三种参数传递策略:

  1. 数组通过指针来传递。时间 = Θ ( 1 ) =\Theta(1) =Θ(1)
  2. 数组通过元素复制来传递。时间 = Θ ( N ) =\Theta(N) =Θ(N) ,其中 N N N 是数组的规模。
  3. 传递数组时,只复制过程可能访问的子区域。若子数组 A [ p . . q ] A[p . . q] A[p..q] 被传递,则时间 = Θ ( p − q + 1 ) =\Theta(p-q+1) =Θ(pq+1)

  a. 考虑在有序数组中查找元素的递归二分查找算法(参见练习 2. 3-5)。分别给出上述三种参数传递策略下,二分查找最坏情况运行时间的递归式,并给出递归式解的好的上界。
   令 N N N 为原问题的规模, n n n 为子问题的规模。
  b. 对 2.3.1 节的 MERGE-SORT 算法重做 (a) 。

  解.a. 1. T ( n ) = T ( n / 2 ) + c = Θ ( lg ⁡ n ) T(n)=T(n/2)+c=\Theta(\lg n) T(n)=T(n/2)+c=Θ(lgn)
     2. T ( n ) = T ( n / 2 ) + c N = Θ ( n lg ⁡ n ) T(n)=T(n/2)+cN=\Theta(n\lg n) T(n)=T(n/2)+cN=Θ(nlgn)
     3. T ( n ) = T ( n / 2 ) + c n = Θ ( n ) T(n)=T(n/2)+cn=\Theta(n) T(n)=T(n/2)+cn=Θ(n)
    b. 1. T ( n ) = 2 T ( n / 2 ) + c n = Θ ( n lg ⁡ n ) T(n)=2T(n/2)+cn=\Theta(n\lg n) T(n)=2T(n/2)+cn=Θ(nlgn)
     2. T ( n ) = 2 T ( n / 2 ) + c n + 2 N = Θ ( n 2 ) T(n)=2T(n/2)+cn+2N=\Theta(n^2) T(n)=2T(n/2)+cn+2N=Θ(n2)
     3. T ( n ) = 2 T ( n / 2 ) + c n + 2 n / 2 = Θ ( n lg ⁡ n ) T(n)=2T(n/2)+cn+2n/2=\Theta(n\lg n) T(n)=2T(n/2)+cn+2n/2=Θ(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
  b. T ( n ) = 3 T ( n / 3 ) + n / lg ⁡ n T(n)=3T(n/3)+n/\lg n T(n)=3T(n/3)+n/lgn
  c. T ( n ) = 4 T ( n / 2 ) + n 2 n T(n)=4T(n/2)+n^2\sqrt n T(n)=4T(n/2)+n2n
  d. T ( n ) = 3 T ( n / 3 − 2 ) + n / 2 T(n)=3T(n/3-2)+n/2 T(n)=3T(n/32)+n/2
  e. T ( n ) = 2 T ( n / 2 ) + n / lg ⁡ n T(n)=2T(n/2)+n/\lg n T(n)=2T(n/2)+n/lgn
  f. T ( n ) = T ( n / 2 ) + T ( n / 4 ) + T ( n / 8 ) + n T(n)=T(n/2)+T(n/4)+T(n/8)+n T(n)=T(n/2)+T(n/4)+T(n/8)+n
  g. T ( n ) = T ( n − 1 ) + 1 / n T(n)=T(n-1)+1/n T(n)=T(n1)+1/n
  h. T ( n ) = T ( n − 1 ) + lg ⁡ n T(n)=T(n-1)+\lg n T(n)=T(n1)+lgn
  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

  解:a. Θ ( n log ⁡ 3 4 ) \Theta(n^{\log_3 4}) Θ(nlog34)
    b. Θ ( n lg ⁡ lg ⁡ n ) \Theta(n\lg\lg n) Θ(nlglgn) ,证明如下: T ( n ) = 3 T ( n / 3 ) + 3 lg ⁡ n = n Θ ( 1 ) + ∑ i = 0 log ⁡ 3 n − 1 n lg ⁡ n − i = n Θ ( 1 ) + n ∑ i = 1 + lg ⁡ n − log ⁡ 3 n lg ⁡ n 1 i = Θ ( n lg ⁡ lg ⁡ n ) \begin{aligned}T(n)&=3T(n/3)+\frac{3}{\lg n}\\&=n\Theta(1)+\sum_{i=0}^{\log_3n-1}\frac{n}{\lg n-i}\\&=n\Theta(1)+n\sum_{i=1+\lg n - \log_3 n}^{\lg n}\frac{1}{i}\\&=\Theta(n\lg\lg n)\end{aligned} T(n)=3T(n/3)+lgn3=nΘ(1)+i=0log3n1lgnin=nΘ(1)+ni=1+lgnlog3nlgni1=Θ(nlglgn)

    c. Θ ( n 2 n ) \Theta(n^2\sqrt n) Θ(n2n )
    d. Θ ( n lg ⁡ n ) \Theta(n\lg n) Θ(nlgn)
    e. Θ ( n lg ⁡ lg ⁡ n ) \Theta(n\lg \lg n) Θ(nlglgn),证明同b.
    f. Θ ( n ) \Theta(n) Θ(n) ,证明如下:
     当 k < n kk<n 时, T ( k ) ≤ c k T(k)\leq ck T(k)ck,则: T ( n ) = T ( n / 2 ) + T ( n / 4 ) + T ( n / 8 ) + n ≤ c n / 2 + c n / 4 + c n / 8 + n ≤ 7 c n / 8 + n ≤ c n 当  c ≥ 8  时成立 \begin{aligned}T(n)&=T(n/2)+T(n/4)+T(n/8)+n\\&\leq cn/2+cn/4+cn/8+n\\&\leq7cn/8+n\\&\leq cn&\text{当 $c\geq8$ 时成立}\end{aligned} T(n)=T(n/2)+T(n/4)+T(n/8)+ncn/2+cn/4+cn/8+n7cn/8+ncn c时成立     当 k < n kk<n 时, T ( k ) ≥ k T(k)\geq k T(k)k,则: T ( n ) = T ( n / 2 ) + T ( n / 4 ) + T ( n / 8 ) + n ≥ n / 2 + n / 4 + n / 8 + n ≥ n \begin{aligned}T(n)&=T(n/2)+T(n/4)+T(n/8)+n\\&\geq n/2+n/4+n/8+n\\&\geq n \end{aligned} T(n)=T(n/2)+T(n/4)+T(n/8)+nn/2+n/4+n/8+nn

    g. E u l a r Eular Eular 常数: lim ⁡ n → ∞ ( 1 + 1 2 + . . . + 1 n − ln ⁡ n ) = C \lim_{n\rightarrow\infin}(1+\frac{1}{2}+...+\frac{1}{n}-\ln n)=C nlim(1+21+...+n1lnn)=C      可知复杂度为 Θ ( lg ⁡ n ) \Theta(\lg n) Θ(lgn)
    h. Θ ( n lg ⁡ n ) \Theta(n\lg n) Θ(nlgn),证明如下: T ( n ) = T ( n − 1 ) + lg ⁡ n = ∑ i = 0 n − 1 lg ⁡ ( n − i ) = ∑ i = 1 n lg ⁡ i = Θ ( lg ⁡ ( n ! ) ) = Θ ( n lg ⁡ n ) \begin{aligned}T(n)&=T(n-1)+\lg n=\sum_{i=0}^{n-1}\lg(n-i)=\sum_{i=1}^{n}\lg i\\&=\Theta(\lg(n!))=\Theta(n\lg n)\end{aligned} T(n)=T(n1)+lgn=i=0n1lg(ni)=i=1nlgi=Θ(lg(n!))=Θ(nlgn)

    i. Θ ( lg ⁡ lg ⁡ n ) \Theta(\lg\lg n) Θ(lglgn),证明如下: T ( n ) = T ( n − 2 ) + 1 lg ⁡ n = 1 lg ⁡ n + . . . + Θ ( 1 ) = ∑ i = 0 n / 2 − 1 1 lg ⁡ ( n − 2 i ) = ∑ i = 2 n 1 lg ⁡ i = ∑ i = 1 lg ⁡ n 1 i = Θ ( lg ⁡ lg ⁡ n ) \begin{aligned}T(n)&=T(n-2)+\frac{1}{\lg n}=\frac{1}{\lg n}+...+\Theta(1)\\&=\sum_{i=0}^{n/2-1}\frac{1}{\lg(n-2i)}=\sum_{i=2}^{n}\frac{1}{\lg i}\\&=\sum_{i=1}^{\lg n}\frac{1}{i}\\&=\Theta(\lg\lg n)\end{aligned} T(n)=T(n2)+lgn1=lgn1+...+Θ(1)=i=0n/21lg(n2i)1=i=2nlgi1=i=1lgni1=Θ(lglgn)

    j. Θ ( n lg ⁡ lg ⁡ n ) \Theta(n\lg\lg n) Θ(nlglgn),证明如下:
     令 S ( n ) = T ( n ) / n S(n)=T(n)/n S(n)=T(n)/n ,则 S ( n ) = S ( n ) + 1 S(n)=S(\sqrt n)+1 S(n)=S(n )+1 ,当 n = 2 m n=2^m n=2m ,有 S ( 2 m ) = S ( 2 m / 2 ) + 1 S(2^m)=S(2^{m/2})+1 S(2m)=S(2m/2)+1 。令 P ( m ) = S ( 2 m ) P(m) = S(2^m) P(m)=S(2m) ,得 P ( m ) = P ( m / 2 ) + 1 P(m)=P(m/2)+1 P(m)=P(m/2)+1 。于是 P ( m ) = Θ ( lg ⁡ m ) P(m)=\Theta(\lg m) P(m)=Θ(lgm) 。则 T ( n ) = Θ ( n lg ⁡ lg ⁡ n ) T(n)=\Theta(n\lg\lg n) T(n)=Θ(nlglgn)

4-4 (斐波那契数)

  本题讨论递归式(3.22)定义的斐波那契数的性质。我们将使用生成函数技术来求斐波那契递归式。生成函数(又称为形式幂级数 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}^{\infin}F_iz^i=0+z+z^2+2z^3+3z^4+5z^5+8z^6+13z^7+21z^8+... 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-\hat\phi z)}=\frac{1}{\sqrt 5}(\frac{1}{1-\phi z}-\frac{1}{1-\hat\phi z}) F(z)=1zz2z=(1ϕz)(1ϕ^z)z=5 1(1ϕz11ϕ^z1)
   其中 ϕ = 1 + 5 2 = 1.61803... ϕ ^ = 1 − 5 2 = − 0.61803... \begin{aligned}\phi&=\frac{1+\sqrt5}{2}=1.61803...\\\hat\phi&=\frac{1-\sqrt5}{2}=-0.61803...\end{aligned} ϕϕ^=21+5 =1.61803...=215 =0.61803...
  c. 证明: F ( z ) = ∑ i = 0 ∞ 1 5 ( ϕ i − ϕ ^ i ) z i \mathscr{F}(z)=\sum_{i=0}^{\infin}\frac{1}{\sqrt5}(\phi^i-\hat\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 |\hat\phi|<1 ϕ^<1 。)

  证明:a. z + F ( z ) + z 2 F ( z ) = z + z ∑ i = 0 ∞ F i z i + z 2 ∑ i = 0 ∞ F i z i = z + ∑ i = 1 ∞ F i − 1 z i + ∑ i = 2 ∞ F i − 2 z i = z + F 1 z + ∑ i = 2 ∞ ( F i − 1 + F i − 2 ) z i = z + F 1 z + ∑ i = 2 ∞ F i z i = F ( z ) \begin{aligned}z+\mathscr{F}(z)+z^2\mathscr F(z)&=z+z\sum_{i=0}^{\infin}F_iz^i+z^2\sum_{i=0}^{\infin}F_iz^i\\&=z+\sum_{i=1}^{\infin}F_{i-1}z^i+\sum_{i=2}^{\infin}F_{i-2}z^i\\&=z+F _1z+\sum_{i=2}^{\infin}(F_{i-1}+F_{i-2})z^i\\&=z+F_1z+\sum_{i=2}^{\infin}F_iz^i\\&=\mathscr F(z)\end{aligned} z+F(z)+z2F(z)=z+zi=0Fizi+z2i=0Fizi=z+i=1Fi1zi+i=2Fi2zi=z+F1z+i=2(Fi1+Fi2)zi=z+F1z+i=2Fizi=F(z)

     b. F ( z ) = F ( z ) ( 1 − z − z 2 ) 1 − z − z 2 = F ( z ) − z F ( z ) − z 2 F ( z ) − z + z 1 − z − z 2 = F ( z ) − F ( z ) + z 1 − z − z 2 = z 1 − z − z 2 = z 1 − ( ϕ + ϕ ^ ) z − z 2 = z ( 1 − ϕ z ) ( 1 − ϕ ^ z ) = z ( 1 1 − ϕ z − 1 1 − ϕ ^ z ) 5 z = 1 5 ( 1 1 − ϕ z − 1 1 − ϕ ^ z ) \begin{aligned}\mathscr F(z)&=\frac{\mathscr F(z)(1-z-z^2)}{1-z-z^2}\\&=\frac{\mathscr F(z)-z\mathscr F(z)-z^2\mathscr F(z)-z+z}{1-z-z^2}\\&=\frac{\mathscr F(z)-\mathscr F(z)+z}{1-z-z^2}\\&=\frac{z}{1-z-z^2}\\&=\frac{z}{1-(\phi+\hat\phi)z-z^2}\\&=\frac{z}{(1-\phi z)(1-\hat\phi z)}\\&=\cfrac{z(\cfrac{1}{1-\phi z}-\cfrac{1}{1-\hat\phi z})}{\sqrt 5z}\\&=\frac{1}{\sqrt 5}(\frac{1}{1-\phi z}-\frac{1}{1-\hat\phi z})\end{aligned} F(z)=1zz2F(z)(1zz2)=1zz2F(z)zF(z)z2F(z)z+z=1zz2F(z)F(z)+z=1zz2z=1(ϕ+ϕ^)zz2z=(1ϕz)(1ϕ^z)z=5 zz(1ϕz11ϕ^z1)=5 1(1ϕz11ϕ^z1)

     c. 由于 1 1 − x = ∑ k = 0 ∞ x k      当|x|<1时 \frac{1}{1-x}=\sum_{k=0}^{\infin}x^k \space\space\space\space\space\text{当|x|<1时} 1x1=k=0xk     |x|<1

      于是 F ( z ) = 1 5 ( 1 1 − ϕ z − 1 1 − ϕ ^ z ) = 1 5 ( ∑ i = 0 ∞ ϕ i z i − ∑ i = 0 ∞ ϕ ^ i z i ) = ∑ i = 0 ∞ 1 5 ( ϕ i − ϕ ^ i ) z i \begin{aligned}\mathscr F(z)&=\frac{1}{\sqrt5}(\frac{1}{1-\phi z}-\frac{1}{1-\hat\phi z})\\&=\frac{1}{\sqrt5}(\sum_{i=0}^{\infin}\phi^iz^i-\sum_{i=0}^{\infin}\hat\phi^iz^i)\\&=\sum_{i=0}^{\infin}\frac{1}{\sqrt5}(\phi^i-\hat\phi^i)z^i\end{aligned} F(z)=5 1(1ϕz11ϕ^z1)=5 1(i=0ϕizii=0ϕ^izi)=i=05 1(ϕiϕ^i)zi

     d. 显然 F i = 1 5 ( ϕ i − ϕ ^ i ) \begin{aligned}F_i=\frac{1}{\sqrt5}(\phi^i-\hat\phi^i)\end{aligned} Fi=5 1(ϕiϕ^i)

      于是 0 < ∣ ϕ ^ i ∣ < 1 0<|\hat\phi ^i|<1 0<ϕ^i<1
      故而 F i ≈ ϕ i 5 F_i\approx\frac{\phi^i}{\sqrt5} Fi5 ϕi

4-5 (芯片检测)

   Diogenes 教授有 n n n 片可能完全一样的集成电路芯片,原理上可以用来相互检测。教授的测试夹具同时只能容纳两块芯片。当夹具装载上时,每块芯片都检测另一块,并报告它是好是坏。一块好的芯片总能准确报告另一块芯片的好坏,但教授不能信任坏芯片报告的结果。因此,4 种可能的测试结果如下:

芯片 A A A 的结果 芯片 B B B 的结果 结论
B B B 是好的 A A A 是好的 两片都是好的,或都是坏的
B B B 是好的 A A A 是坏的 至少一块是坏的
B B B 是坏的 A A A 是好的 至少一块是坏的
B B B 是坏的 A A A 是坏的 至少一块是坏的

  a. 证明:如果超过 n / 2 n/2 n/2 块芯片是坏的,使用任何基于这种逐对检测操作的策略,教授都不能确定哪些芯片是好的。假定坏芯片可以合谋欺骗教授。
  b. 考虑从 n n n 块芯片中寻找一块好芯片的问题,假定超过 n / 2 n/2 n/2 块芯片是好的。证明:进行 ⌊ n / 2 ⌋ \lfloor n/2\rfloor n/2 次逐对检测足以将问题规模减半。
  c. 假定超过 n / 2 n/2 n/2 块芯片是好的。证明:可以用 Θ ( n ) \Theta(n) Θ(n) 次逐对检测找出好的芯片。给出描述检测次数的递归式,并求解它。

  证

你可能感兴趣的:(算法导论,笔记)