算法設計與分析課程複習筆記4——分治法

算法設計與分析課程複習筆記4——分治法

分治法

回顧:合併排序
分割、遞歸處理、合併

分治法

  • 將一個問題分割成幾個規模小、性質相同的獨立的子問題
  • 通常通過遞歸方法解決子問題
  • 合併每個子問題的解得到整個問題的解
  • 前提假設:原始問題的解能夠通過子問題的求解獲得

算法描述:

Solve(I)
n = size(I)
if (n <= smallsize)
	solution = directlySolve(I);
else
	divide I into I1, …, Ik.
	for each i in {1, …, k}
		Si = solve(Ii);
	solution = combine(S1, …, Sk);
return solution;

爲什麼要採用分治法?

  • 有時候它是最簡單的方法
  • 通常更有效
  • 與其他方法的效率可能相同甚至更壞
  • 必須分析分治算法的代價
  • 不肯定是遞歸的

分治法的開銷

  1. 分割開銷
  2. 子問題解決開銷
  3. 合併開銷

形式:
T(n) = D(n) + Sum[ T(size(IiI_i) ] + C(n)
更一般化:T(n) = a T(n/b) + f(n)

二分搜索

輸入: 排序好的序列a0a_0, a1a_1, …,an1a_{n-1}和數值X
思想:
將X與中值比較
左、右比較
規模逐漸減小

example:
3 7 11 12 15 19 24 33 41 55
     24
     ↓
19 24 33 41 55
   24
   ↓
  19 24
  24

二分搜索的時間複雜性
T(n)={1 ifT(n2)+1 otherwise T(n)=\left\{ \begin{aligned} 1 ifn=1\\ T(\lfloor\frac n2\rfloor)+1 otherwise \end{aligned} \right.

矩陣乘法

Z=XYZ=XY
X,YX,Y均爲n*n
時間開銷:O(n3)
對於XX(n*m)*YY(m*q)的情況,開銷O(nmq)

矩陣乘法
I=AE+BGI=AE+BG
J=AF+BHJ=AF+BH
K=CE+DGK=CE+DG
L=CF+DHL=CF+DH

考慮:分割成8個(n/2)*(n/2)相乘和另外4個矩陣加

T(n)=8T(n/2)+bn2T(n) = 8T(n/2) + bn^2
T(n)Θ(n3)T(n)仍然是Θ(n^3)

矩陣Strassen算法
如下定義S1S_1~S7S_7:
S1=A(FH)S_1=A(F-H)
S2=(A+B)HS_2=(A+B)H
S3=(C+D)ES_3=(C+D)E
S4=D(GE)S_4=D(G-E)
S5=(A+D)(E+H)S_5=(A+D)(E+H)
S6=(BD)(G+H)S_6=(B-D)(G+H)
S7=(AC)(E+F)S_7=(A-C)(E+F)

I=S5+S6+S4S2I=S_5+S_6+S_4-S_2
J=S1+S2J=S_1+S_2
K=S3+S4K=S_3+S_4
L=S1S7S3+S5L=S_1-S_7-S_3+S_5

現在Z=XYZ=XY只使用了7個遞歸相乘
T(n)=7T(n/2)+bn2T(n) = 7T(n/2) + bn^2
通過主方式求解:Θ(n2.808)Θ(n^{2.808})

實例比較:
當我們將兩個100*100的矩陣相乘時,n3是1000000,而n2.808是413048

實際上有更優秀的算法,可達到Θ(n2.376)Θ(n^{2.376}),n2.376僅爲56494.(需另外查資料)

大整數相乘

大整數相乘
時間開銷:Θ(n2)Θ(n^2)

分治法:
X= a    b X= a  |  b 
Y= c    d Y= c  |  d 

X=a2n/2+bX=a*2^{n/2}+b
Y=c2n/2+dY=c*2^{n/2}+d
XY=ac2n+(ad+bc)2n/2+bdXY=ac2^n+(ad+bc)2^{n/2}+bd

算法如下:

Mult(X,Y)
if|X|=|Y|=1 then do return XY
else return
Mult(a,c)2n+(Mult(a,d)+Mult(b,c))2n/2+Mult(b,d)

開銷函數:
T(n)={1 if4T(n2)+Θ(n) if T(n)=\left\{ \begin{aligned} 1 ifn=1\\ 4T(\frac n2)+Θ(n) ifn>1 \end{aligned} \right.

主方式法求解:Θ(n2)Θ(n^2)

更好的方法(Karatsuba 1962)
利用高斯等式:
ad+bc=(a+b)(c+d)acbdad+bc=(a+b)(c+d)-ac-bd

算法如下:
Mult(X,Y)
if|X|=|Y|=1 then do return XY
else
A1A_1=Mult(a,c);
A2A_2=Mult(b,d);
A3A_3=Mult((a+b),(c+d));
return A12n+(A3A1A2)2n/2+A2A_12^n+(A_3-A_1-A_2)2^{n/2}+A_2

開銷函數:
T(n)={1 if3T(n2)+Θ(n) if T(n)=\left\{ \begin{aligned} 1 ifn=1\\ 3T(\frac n2)+Θ(n) ifn>1 \end{aligned} \right.

主方式求解:Θ(nlog23)Θ(n^{log_23})=Θ(n1.58)Θ(n^{1.58})

最近點對問題

蠻力法:計算出兩兩之間的距離然後比較的方法

分治法求解
假設:各點x座標互異,各點y座標互異
在一維空間上求解:排列,從左到右求最小距離

1️⃣分割
分割
2️⃣遞歸解決
遞歸解決
3️⃣整合
整合
L和R中是否各存在一點,它們之間的距離小於δ?
如果沒有,結束。如果有,此類點對中距離最近的點即是整個問題的解。
4️⃣繼續整合
繼續整合
只需考慮上圖中帶條S內的點的距離。S中的點最多要與S中的7個點進行比較。

算法如下:
ClosestPair(P)
Preprocessing:預處理,遞增排列
  Construct PxP_x and PyP_y as sorted-list by x- and y-coordinates
Divide:分割
 Construct LL,LxL_x,LyL_y and RR,RxR_x,RyR_y
Conquer:治理
 Let δ1δ_1 = ClosestPair(LL,LxL_x,LyL_y)
 Let δ2δ_2 = ClosestPair(RR,RxR_x,RyR_y)
Combination:整合
 Let δ = min(δ1δ_1,δ2δ_2)
 Construct S and SyS_y(按y座標排序)
 For each point in SyS_y , check each of its next 7 points down the list(檢查與後續7個點之間的距離)
 If the distance is less than δ, update the δ as this smaller distance(如果存在小於δ的距離,則爲距離最短點對)

時間開銷:
預處理:O(nlgn)O(n lg n)
分割:O(n)O(n)
治理:2T(n/2)2T(n/2)
整合:O(n)O(n)

total:O(nlgn)O(n lg n)

參考:任課教師邱德紅教授的課件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章