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

谁都会走 提交于 2020-01-17 00:19:54

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


\bigstar 4.6 主定理的证明

4.6.1 取正合幂时的证明

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

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

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

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

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

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

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

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

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

j=0logbn1aj(n/bj)logbaϵ=nlogbaϵj=0logbn1(abϵ/blogba)j=nlogbaϵj=0logbn1(bϵ)j=nlogbaϵ(bϵlogbn1bϵ1)=nlogbaϵ(nϵ1bϵ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})
因为 bbϵ\epsilon 是常数,所以可将最后一个表达式写为 nlogbaϵO(nϵ)=O(nlogba)n^{\log_ba-\epsilon}O(n^{\epsilon}) = O(n^{\log_b a})
将该表达式代入式 (4.23),得 g(n)=O(nlogba)g(n) = O(n^{\log_b a}),情况1 即证。

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

j=0logbn1aj(n/bj)logba=nlogbaj=0logbn1(a/blogba)j=nlogbaj=0logbn11=nlogbalogbn\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

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

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

代入式 (4.22),当nn 足够大这个假设不成立时,使用 O(1)O(1) 项进行补偿。
g(n)=j=0logbn1ajf(n/bj)j=0logbn1cjf(n)+O(1)f(n)j=0cj+O(1)=f(n)11c+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))
因为 cc 是常数。因此,g(n)=Θ(f(n))g(n) = \Theta(f(n)) 对于 bb 的正合幂成立,情况3 即证。

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

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

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

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

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

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

确定深度 kk,使 nkn_k 是一个常数。使用不等式 xx+1\lceil x \rceil \le x + 1,得
n0nn_0 \le n
n1nb+1n_1 \le \frac{n}{b} + 1
n2nb2+1b+1n_2 \le \frac{n}{b^2} + \frac{1}{b} + 1
……
njnbj+i=0j11bi<nbj+i=01bi=nbj+bb1n_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}

j=logbnj = \lfloor \log_b n \rfloor,有 nlogbn<nblogbn+bb1<nblogbn1+bb1=nn/b+bb1=b+bb1=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)
因此,在深度 logbn\lfloor \log_b n \rfloor,问题规模为常数。

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

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

情况2,有 f(n)=Θ(nlogba)f(n) = \Theta(n^{\log_ba})。如果可以证明 f(nj)=O(nlogab/aj)=O((n/bj)logba)f(n_j) = O(n^{\log_a b}/a^j) = O((n/b^j)^{\log_ba}),那么就能套用引理 4.3 的情况2 的证明。
jlogbnj \le \lfloor \log_b n \rfloor,得 bj/n1b^j/n \le 1
由界 f(n)=O(nlogba)f(n) = O(n^{\log_b a}),得,存在常数 c>0c>0,对所有足够大的 njn_j,有
f(nj)c(nbj+bb1)logba=c(nbj(1+bjnbb1))logba=c(nlogbaaj)(1+bjnbb1)logbac(nlogbaaj)(1+bb1)logba=O(nlogbaaj)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})
因为 c(1+b/(b1))c(1+b/(b-1)) 是一个常数。
因此,情况2 即证。

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

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

练习

4.6-1 \bigstar 在式 (4.27) 中,若 bb 是个正整数,而不是任意实数,给出 njn_j 的一个简单且准确的表达式。
解: 对于任意实数 x0x\ge0 和整数 a,b>0a,b>0,有式 (3.4),x/ab=xab\lceil \frac{\lceil x/a \rceil}{b} \rceil = \lceil \frac{x}{ab}\rceil。则有
n0=nn_0 = n
n1=n/bn_1 = \lceil n/b \rceil
n2=n1/b=n/b2n_2 = \lceil n_1/b \rceil = \lceil n/b^2 \rceil
……
一般地,nj=n/bjn_j = \lceil n/b^j \rceil

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

g(n)=j=0logbn1ajf(n/bj)=j=0logbn1ajΘ((n/bj)logbalgk(n/bj))=j=0logbn1ajΘ((nlogba/aj)lgk(n/bj))=j=0logbn1Θ(nlogbalgk(n/bj))=Θ(nlogba)j=0logbn1lgk(n/bj)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)

h(n)=j=0logbn1lgk(n/bj)j=0logbn1lgkn=logbnlgkn=lgk+1n/lgbh(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,其中 lgb\lg b 为常数。
所以,h(n)=O(lgk+1n)h(n) = O(\lg^{k+1}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=14lgblgk+1n+14lgknh(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
因为 14lgb\frac{1}{4\lg b} 是常数,所以 h(n)=Ω(lgk+1n)h(n) = \Omega(\lg^{k+1}n)

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

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


思考题

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

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

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

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

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

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

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

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

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

n2i=1n-2i = 1,得递归树共有 (n1)/2(n-1)/2 层。
将所有层的代价相加,得
T(n)=i=0(n1)/21(n24in+4i2)=n2(n1)/24ni=0(n3)/2i+4i=0(n3)/2i2=n2(n1)/24n(((n1)/2)((n3)/2)2)+4(((n3)/2)((n1)/2)(n2)6)=n3/6+n2/2+n/31=Θ(n3)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)

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

解:

4-3 更多递归式的例子
给出下列递归式 T(n)T(n) 的渐近上下界。假设 nn 足够小时,T(n)T(n) 是常数。使界尽量紧确,并证明。
a. T(n)=4T(n/3)+nlgnT(n) = 4T(n/3) + n\lg n
b. T(n)=3(n/3)+n/lgnT(n) = 3(n/3) + n/\lg n
c. T(n)=4T(n/2)+n2nT(n) = 4T(n/2) + n^2 \sqrt n
d. T(n)=3T(n/32)+n/2T(n) = 3T(n/3-2) + n/2
e. T(n)=2T(n/2)+n/lgnT(n) = 2T(n/2) + n/\lg n
f. T(n)=T(n/2)+T(n/4)+T(n/8)+nT(n) = T(n/2) + T(n/4) + T(n/8) + n
g. T(n)=T(n1)+1/nT(n) = T(n-1) + 1/n
h. T(n)=T(n1)+lgnT(n) = T(n-1) + \lg n
i. T(n)=T(n2)+1/lgnT(n) = T(n-2) + 1/\lg n
j. T(n)=nT(n)+nT(n) = \sqrt nT(\sqrt n) + n

解:

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

其中,FiF_i 是第 ii 个斐波那契数。

a. 证明:F(z)=z+zF+z2F\mathscr{F}(z) = z + z\mathscr{F} + z^2\mathscr{F}
b. 证明:F(z)=z1zz2=z(1ϕz)(1ϕ^z)=15(11ϕz11ϕ^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})

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

解:

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

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

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

证:

4-6 Monge 数组


本章节的其他内容:
【算法导论】第4章 分而治之 (1)
【算法导论】第4章 分而治之 (2)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!