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)$