算法导论课后习题解析 第四章 上

时间:2022-09-05 00:23:38

4.1-1
返回只包含绝对值最小的元素的子数组。

 

4.1-2

Maximun-Subarray(A)
max = -infinity
for i = 1 to A.length
sum = 0
for j = i to A.length
sum = sum + A[i]
if sum > max
max = sum
low = i
high = j
return (low, high, max)

每次内循环都利用上次累加的结果,避免重复运算。外层循环执行n次,第i次外循环内层循环执行n-i+1次,所以总的时间复杂度为$\Theta (n^2)$。

 

4.1-3
这道题$n_0$的结果因人而异,我这里的结果是$n_0 = 63$。利用这种方法虽然可以改善总体的运行速度,但是不能够改变两种方法运行时间相同时输入规模的大小。

 

4.1-4
在算法的最后判断最大子数组的总和是否小于零,如果小于零则返回空子数组(empty subarray)。

 

4.1-5
算法的思想就是从前往后累加,如果当前子数组的累加和小于零,则意味着最大子数组(maximun subarray)肯定不包括该子数组,所以果断舍弃,重新开始累加。

Maximun-Subarray(A)
max = 0, sum = 0, cur_low = 1
for i = 1 to A.length
sum = sum + A[i]
if sum > max
max = sum
low = cur_low
high = i
else if sum < 0
cur_low = i + 1
sum = 0
if max > 0
return (low, high, max)
return NIL

 

4.2-1
突然发现这个算法算起来真够麻烦的。$$S_1 = \{6\} \quad S_2=\{4\} \quad S_3=\{12\} \quad S_4=\{-2\} \quad S_5=\{6\}$$$$S_6 = \{8\} \quad S_7=\{-2\} \quad S_8=\{6\} \quad S_9=\{-6\} \quad S_{10}=\{14\}$$$$P_1 = \{6\} \quad P_2=\{8\} \quad P_3=\{72\} \quad P_4=\{-10\} \quad P_5=\{48\}\quad P_6=\{-12\}\quad P_7=\{-84\}$$$$C_{11}=\{18\} \quad C_{12}=\{14\} \quad C_{21}=\{62\} \quad C_{22}=\{66\}$$

 

4.2-2
伪码还是比实际代码简单得多的,不用考虑一些中间存储的问题。

Strassen-Method(A, B)
n = A.rows
let C be a new m*n matrix
if n == 1
c11 = a11 * b11
else
S1 = B12 - B22
S2 = A11 + A12
S3 = A21 + A22
S4 = B21 - B11
S5 = A11 + A22
S6 = B11 + B22
S7 = A12 - A22
S8 = B21 + B22
S9 = A11 - A21
S10 = B11 + B12
P1 = Strassen-Method(A11, S1)
P2 = Strassen-Method(S2, B22)
P3 = Strassen-Method(S3, B11)
P4 = Strassen-Method(A22, S4)
P5 = Strassen-Method(S5, S6)
P6 = Strassen-Method(S7, S8)
P7 = Strassen-Method(S9, S10)
C11 = P5 + P4 - P2 + P6
C12 = P1 + P2
C21 = P3 + P4
C22 = P5 + P1 - P3 - P7
return C

 

4.2-3
如果分割矩阵的时候矩阵的行数或列数为奇数,那么就把一个全零行或列补在矩阵上。最坏的情况下,每次分割都需要补行和列,所以递推公式变为$$T(n)=7T(n/2 + 1)+\Theta((n+1)^2)=7T(n/2 + 1)+\Theta(n^2)$$可得最终时间复杂度保持不变,还是$\Theta (n^{\lg 7})$

 

4.2-4
利用这种方法的递推公式为$$T(n)=kT(n/3)+\Theta(n^2)$$所以可以根据主方法(master method)算出k

  • 如果$\log_3 k =2 \ \Rightarrow \ k=9$,那么满足第2种情况,$T(n)=\Theta (n^2 \lg n)=o(n^{\lg 7})$
  • 如果$\log_3 k < 2 \ \Rightarrow \ k < 9$,那么满足第1种情况,$T(n)=\Theta (n^2)=o(n^{\lg 7})$
  • 如果$\log_3 k > 2 \ \Rightarrow \ k > 9$,那么满足第3种情况,这时$\log_3 k < \lg 7 \Rightarrow k < 3^{\lg 7} \approx 21$

所以最大的k为21。

 

4.2-5

  • 第一种情况下的复杂度递推公式为$T(n)=132464 T(n/68) + \Theta (n^2)$,$\log_{68} {132464} \approx 2.79512849$
  • 第二种情况下的复杂度递推公式为$T(n)=143640 T(n/70) + \Theta (n^2)$,$\log_{70} {143640} \approx 2.79512269$
  • 第二种情况下的复杂度递推公式为$T(n)=155424 T(n/72) + \Theta (n^2)$,$\log_{72} {155424} \approx 2.79514739$

所以三种情况都比Strassen的方法稍好,其中第二种方法最好。

 

4.2-6
分别将两个将矩阵拆分为k个$n \times n$矩阵,然后再利用Strassen方法计算n阶方阵乘法。$$\begin{pmatrix} A_1 \\ A_2 \\ \vdots \\ A_k \end{pmatrix} \cdot \begin{pmatrix} B_1 & B_2 & \cdots & B_k \end{pmatrix} = \begin{pmatrix} A_1 B_1 & A_1 B_2 & \cdots & A_1 B_k \\ A_2 B_1 & A_2 B_2 & \cdots & A_2 B_k \\ \vdots & \vdots & \ddots & \vdots \\ A_k B_1 & A_k B_2 & \cdots & A_k B_k \end{pmatrix}$$$$\begin{pmatrix} B_1 & B_2 & \cdots & B_k \end{pmatrix} \cdot \begin{pmatrix} A_1 \\ A_2 \\ \vdots \\ A_k \end{pmatrix} = \begin{pmatrix} A_1 B_1 + A_2 B_2 + \cdots + A_k B_k \end{pmatrix}$$

 

4.2-7
由于$(a+bi)(c+di) = (ac-bd) + (ad+bc)i$,需要4次乘法,为了节省一次乘法需要利用到之前计算的结果。可以发现$ad+bc=(a+b)(c+d)-ac-bd$,所以只需要计算3次乘法即可。

 

4.3-1
假定有$\forall m < n, T(m) \le cm^2$,代入递推式可得$$\eqalign { T(n) & \le c(n-1)^2 + n \\ & = cn^2 + (1-2c)n + c \\ & \le cn^2 & (n > 0, c \ge 1)}$$

 

4.3-2
假定有$\forall m < n, T(m) \le c \lg m$,代入递推式可得$$\eqalign { T(n) & \le c \lg {\lceil \frac n2 \rceil} + 1 \\ & \le c \lg {(\frac n2 +1)} + 1 \\ & = c \lg {(\frac{n}{2} \frac {n+2}{n})} + 1 \\ & = c \lg {n} -c + c \lg {\frac {n+2}{n}} + 1 \\ & \le c\lg n -c+c \lg {\frac53} + 1 & (n \ge 3) \\ & \le c \lg n & (c \ge \ (1-\lg {\frac 53})^{-1}) }$$或者,假定有$\forall m < n, T(m) \le c \lg {(m-d)}$,代入递推式可得$$\eqalign { T(n) & \le c \lg {(\lceil \frac n2 \rceil - d)} + 1 \\ & \le c\lg {(\frac n2 -d+1)}+1 \\ & = c\lg {(n-2d+2)}-c+1 \\ & \le c \lg {(n-d)} & (c \ge 1, d \ge 2)}$$

 

4.3-3
假定有$\forall m < n, T(m) \ge c (m+d) \lg (m+d)$,代入递推式可得$$\eqalign {T(n) & \ge 2c (\lfloor \frac n2 \rfloor +d) \lg {(\lfloor \frac n2 \rfloor + d)}+n \\ & \ge 2c(\frac n2 +d-1) \lg {(\frac n2 -1+d)} + n \\ & = 2c(\frac n2+d-1) (\lg (n-2+2d) -1)+n \\ & = cn\lg {(n-2+2d)}+(1-c)n+2c(d-1)\lg {(n-2+2d)+2c(d-1)} \\ & \ge cn\lg {(n+d)}}$$其中$2d-2 \ge d, 1-c \ge 0, d-1 \ge 0, c \ge 0 \Rightarrow 0 \le c \le 1, d \ge 2$

 

4.3-4
假定有$\forall m < n, T(m) \le cm\lg m + d$,代入递推式可得$$\eqalign {T(n) & \le 2c \lfloor \frac n2 \rfloor \lg {\lfloor \frac n2 \rfloor} + 2d + n \\ & \le cn\lg {\frac n2} + n + 2d\\ & = cn\lg {n} - (c - 1)n + 2d \\ & \le cn \lg n + d}$$其中$(c-1)n + d \ge 0 \Rightarrow c \ge 1, d \le c-1$,为了保证$T(1)=1 \le c \cdot 1 \cdot \lg 1 + d = d$,所以$d \ge 1, c\ge d+1$

 

4.3-5
归并排序(merge sort)的时间复杂度递推公式为$T(n) = 2T(n/2) + n$,分别证明其上下界
假定有$\forall m < n, T(m) \le c m \lg m$,代入递推式可得$$\eqalign { T(n) & \le 2c \frac n2 \lg {\frac n2} +n \\ & = cn\lg n -cn + n \\ & \le cn \lg n & (c \ge 1)}$$假定有$\forall m < n, T(m) \ge c m \lg m$,代入递推式可得$$\eqalign { T(n) & \ge 2c \frac n2 \lg {\frac n2} +n \\ & = cn\lg n -cn + n \\ & \ge cn \lg n & (c \le 1)}$$

 

4.3-6
类似于4.3-3,假定有$\forall m < n, T(m) \le c (m-d) \lg {(m-d)}$,代入递推式可得$$\eqalign {T(n) & \le 2c (\lfloor \frac n2 \rfloor +17-d) \lg {(\lfloor \frac n2 \rfloor + 17-d)}+n \\ & \le 2c(\frac n2 +18-d) \lg {(\frac n2 +18-d)} + n \\ & = 2c(\frac n2+18-d) (\lg (n+36-2d) -1)+n \\ & = cn\lg {(n+36-2d)}-(c-1)n-2c(d-18)\lg {(n+36-2d)-2c(d-18)} \\ & \le cn\lg {(n-d)}}$$其中$2d-36 \ge d, c-1 \ge 0, d-18 \ge 0 \Rightarrow c \ge 1, d \ge 36$

 

4.3-7
假定有$\forall m < n, T(m) \le c m^{\log_3 4}$,代入递推式可得$$\eqalign { T(n) & \le 4c (\frac n3)^{\log_3 4} + n \\ & = cn^{\log_3 4} + n \\ & \ge cn^{\log_3 4} }$$证明失败,改变断言式为$\forall m < n, T(m) \le cm^{\log_3 4} - dm$,代入递推式可得$$\eqalign { T(n) & \le 4c (\frac n3)^{\log_3 4}-\frac43 dn + n \\ & = cn^{\log_3 4}-dn -(\frac 13 d-1)n \\ & \le cn^{\log_3 4} -dn & (c \ge 0, d \ge 3)}$$得证。

 

4.3-8
这道题目有错误,递推式应该为$T(n)=4T(n/2)+n$
假定有$\forall m < n, T(m) \le cm^2$,代入递推式可得$$\eqalign {T(n) & \le 4c (\frac n2)^2 + n \\ & = cn^2 + n \\ & \ge cn^2 }$$证明失败,改变断言式为$\forall m < n, T(m) \le cm^2-dm$,代入递推式可得$$\eqalign {T(n) & \le 4c(\frac n2)^2 - 4d \frac n2 + n \\ & = cn^2 -dn-(d-1)n \\ & \le cn^2-dn &(c\ge0, d \ge 1)}$$得证。

 

4.3-9
令$m=\lg n$,得到$T(2^m)=3T(2^{m/2})+m$,再令$S(m)=T(2^m)$,得到$S(m)=3S(m/2)+m$,利用主方法(master method)可以求得$T(n)=T(2^m)=S(m)=O(m^{\lg 3})=O((\lg n)^{\lg 3})$。

 

4.4-1
第一层$n$,第二层$3/2n$,第三层$9/4n$,共$\lg n$层,最底层有$3^{\lg n}=n^{\lg 3}$个子过程,可得总时间$$\eqalign {T(n) & =\sum_{i=0}^{\lg n -1} {(\frac 32)^in} + \Theta (n^{\lg 3}) \\ & = \frac {(3/2)^{\lg n}-1}{(3/2)-1}n + \Theta (n^{\lg 3}) \\ & = 2(n^{\lg {3/2}}-1)n + \Theta (n^{\lg 3}) \\ & < 2n^{\lg 3}+\Theta (n^{\lg 3}) \\ & = O(n^{\lg 3})}$$证明:假定有$\forall m < n, T(m) \le cm^{\lg 3}-dm$,代入递推式可得$$\eqalign {T(n) & \le 3c (\frac n2)^{\lg 3} -3dn +n \\ & = cn^{\lg3} -d - (2d- 1)n \\ & \le cn^{\lg 3}-d & (c\ge 0, d\ge \frac 12)}$$

 

4.4-2
总时间为$$\eqalign {T(n) & = \sum_{i=0}^{\lg n-1} {2^{-i}n}+\Theta (n^2) \\ & \le 2n + \Theta (n^2) \\ & = O(n^2)}$$证明:假定有$\forall m < n, T(m) \le cm^2$,代入递推式可得$$\eqalign {T(n) &\le c(\frac n2)^2+n^2 \\ & = cn^2-(\frac 34c -1)n^2 \\ & \le cn^2 &(c\ge \frac 43)}$$

 

4.4-3
第一层$n$,第二层$2n+4 \times 2$,第三层$4n+4^2 \times (2+1)$,共$\lg n$层,最底层有$4^{\lg n}=n^2$个子过程,总时间为$$\eqalign {T(n) & = \sum_{i=0}^{\lg n-1} {2^in} + \sum_{i=1}^{\lg n-1}{(4^i \sum_{j=0}^i{2^{1-j}})} + \Theta (n^2) \\ & \le \sum_{i=0}^{\lg n-1} {2^in} + \sum_{i=1}^{\lg n-1}{4^i4} + \Theta (n^2) \\ & = \frac {2^{\lg n}-1}{2-1}n +4\frac {4^{\lg n}-1}{4-1} + \Theta (n^2) \\ & \le n^2 + \frac 43n^2 + \Theta (n^2) \\ & = O(n^2) }$$证明:假定有$\forall m < n, T(m) \le cm^2-dm$,代入递推式可得$$\eqalign {T(n) & \le 4c(\frac n2 + 2)^2 -4dn + n \\ & = cn^2+8cn+16c-4dn+n \\ & = cn^2-dn -(3d-8c)n+16c \\ & \le cn^2-dn}$$其中$(3d-8c-1)n-16c \ge 0 \Rightarrow c \ge 0, n > 0,d \ge \frac{16c+8cn+n}{3n}$

 

4.4-4
第i层总时间为$2^i(n-i)$,共n层,总时间为$$\eqalign {T(n) & = \sum_{i=0}^n {2^i(n-i)} \\ & = \sum_{i=0}^n2^in - \sum_{i=1}^n i2^i \\ & = 2^{n+1}n - (2^{n+1}n-2^{n+1}-1) \\ & = 2^{n+1}+1 \\ & = O(2^n)}$$证明:假定有$\forall m < n, T(m) \le c2^m - d$,代入递推式可得$$\eqalign {T(n) & \le 2c2^{n-1}-2d+1 \\ & = c2^n-d-(d-1) \\ & \le c2^n-d & (c\ge 0, d\ge 1)}$$

 

4.4-5
第一层$n$,第二层$(3/2)n-1$,第三层$(9/4)n-3-1/2$,最长的路径n层,由于该递归树不是满的,所以总时间小于满递归树$$\eqalign {T(n) & \le \sum_{i=0}^n{(\frac 32)^in} \\ &= \frac {(3/2)^{n+1}-1}{3/2-1}n \\ & \le 2n(\frac 32)^{n+1} \\ & = O(n(\frac 32)^n)}$$证明:假定有$\forall m < n, T(m) \le cm(3/2)^m$,代入递推式可得$$\eqalign {T(n) & \le c(n-1)(\frac 32)^{n-1} + c(\frac n2)(\frac 32)^{n/2} + n \\ & = cn(\frac 32)^n - \frac 12 cn(\frac 32)^{n-1}-c(\frac 32)^{n-1}+\frac 12 cn(\frac 32)^{n/2}+n \\ & = cn(\frac 32)^n -\frac 12cn(\frac 32)^{n/2}((\frac 32)^{n/2-1}-1)-(c(\frac 32)^{n-1}-n) \\ & \le cn(\frac 32)^n & (c \ge 1, n \ge 2)}$$

 

4.4-6
第一层$cn$,第二层$cn$,最短路径为$\log_3 n$层,所以总时间大于$\log_3 n$层的递归树$$T(n) \ge \sum_{i=0}^{\log_3 n}{cn} = cn \log_3n = \Omega (n \lg n)$$

 

4.4-7
第一层$n$,第二层$2n-4 \le 4 \lfloor n/2 \rfloor \le 2n$,最长$\lg n$层,最短$\lg n - 1$层,所以总时间$$\eqalign {T(n) & \le \sum_{i=0}^{\lg n-1}{2^i}cn +\Theta(n^2) \\ & \le cn^2 + \Theta(n^2) \\ & = O(n^2) }$$$$\eqalign {T(n) & \ge \sum_{i=0}^{\lg n-2}{2^i}cn - \sum_{i=1}^{\lg n -2}{(c \sum_{j=0}^{i-1}{4^i2^{-j}})} +\Theta(n^2) \Theta(n^2) \\ & \ge c(n-1)^2-2c\sum_{i=1}^{\lg n-2}{4^i} +\Theta(n^2) \\ & \ge c(n-1)^2-\frac 32c(n-1)^2 + \Theta(n^2) \\ & = \Omega(n^2)}$$证明:假定有$\forall m < n, T(m) \le dm^2 - bm$,代入递推式可得$$\eqalign { T(n) & \le 4d\lfloor \frac n2 \rfloor^2 - 4b\frac n2 + cn \\ & = dn^2 - bn -(b-c)n \\ & \le dn^2-bn & (d \ge 0, b \ge c) }$$假定有$\forall m < n, T(m) \le dm^2 - bm$,代入递推式可得$$\eqalign { T(n) & \ge 4d\lfloor \frac n2 \rfloor^2 +cn \\ & \ge 4d(\frac n2-1)^2+cn \\ & = dn^2-4dn+4d+cn \\ & \ge dn^2 }$$其中$cn+4d-4dn \ge 0 \Rightarrow n \ge 2, d \le \frac c2$

 

4.4-8
每一层都是$cn$,层数为$n/a$,所以$$\eqalign {T(n) = \sum_{i=0}^{n/a} {cn} = \frac ca n^2 = \Theta(n^2)} $$

 

4.4-9
类似于4.4-7,每层都是$cn$,最多$\log_{\min (\frac1{\alpha}, \frac1{1-\alpha})} n$层,最少$\log_{\max (\frac1{\alpha}, \frac1{1-\alpha})} n$层,所以$$T(n) \le cn log_{\min (\frac1{\alpha}, \frac1{1-\alpha})} n = O(n \lg n)$$$$T(n) \ge cn log_{\max (\frac1{\alpha}, \frac1{1-\alpha})} n = \Omega(n \lg n)$$综上$T(n) = \Theta (n \lg n)$