算法導論課后習題解析 第四章 上


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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM