Phương pháp chia để trị
Devide and conquer
ThS. Trương Phước Hải
Nội dung
1. Phương pháp chia để trị
2. Binary Search
3. Bài tốn tìm cực trị
4. Merge Sort
5. Quick Sort
6. Giải thuật Strassen
2
Trương Phước Hải
Phương pháp chia để trị
Tư tưởng: chia nhỏ bài toán lớn thành
những bài toán con dễ giải quyết hơn.
Để giải bài tốn kích thước n:
Chia bài tốn thành các bài tốn con có kích
thước nhỏ hơn. Có thể sử dụng kỹ thuật chia
để trị để tiếp tục chia nhỏ bài toán con.
Giải các bài toán con rồi tổng hợp lại để được
lời giải cho bài toán ban đầu.
Giải Thuật
3
Trương Phước Hải
Phương pháp chia để trị
Mơ hình tổng qt của kỹ thuật chia để trị
problem P
…
…
p1
Giải thuật
p2
Bài toán cơ sở
(base problem)
4
pk
Trương Phước Hải
Phương pháp chia để trị
Các bước tiếp cận phương pháp chia để
trị:
Bước 1: chia (divide) bài toán thành 2 hay
nhiều bài toán con nhỏ hơn.
Bước 2: trị (conquer) (giải) các bài toán con
theo phương pháp này một cách đệ quy.
Bước 3: gộp (combine) lời giải các bài toán
con để tạo thành lời giải cho bài toán ban
đầu.
Giải thuật
5
Trương Phước Hải
Phương pháp chia để trị
Giải thuật tổng quát
CDT(P)
If (P đủ nhỏ) Then
return LờiGiải(P)
Else
chia P thành các thể hiện p1, p2, ..pk
Áp dụng CDT cho từng thể hiện pi
KếtHợp (CDT(p1), CDT(p2), ..., CDT(pk))
End If
Cuối CDT
Giải thuật
6
Trương Phước Hải
Phương pháp chia để trị
Độ phức tạp của giải thuật:
T(n): thời gian giải bài tốn kích thước n.
a: số bài tốn con; n/b: kích thước của các bài
tốn con.
D(n): thời gian chia nhỏ bài toán ban đầu.
C(n): thời gian kết hợp các bài tốn con.
Phương trình đệ quy:
𝑂 1 ,
𝑛 ≤ 𝑐 𝑣ớ𝑖 𝑐 đủ 𝑛ℎỏ
𝑛
𝑇 𝑛 =
𝑎. 𝑇
+ 𝐷 𝑛 + 𝐶 𝑛 , 𝑛𝑔ượ𝑐 𝑙ạ𝑖
𝑏
Giải thuật
7
Trương Phước Hải
Nội dung
1. Phương pháp chia để trị
2. Binary Search
3. Bài tốn tìm cực trị
4. Merge Sort
5. Quick Sort
6. Giải thuật Strassen
8
Trương Phước Hải
Binary Search
Cho dãy A gồm các phần tử được sắp thứ
tự khơng giảm. Cho biết có tồn tại phần tử
x trong dãy A?
Input: A[1…n], x
Output: index với A[index] = x
Giải thuật
9
Trương Phước Hải
Binary Search
Giải thuật chia để trị cho bài toán:
Chia: chia dãy A thành 2 nửa dãy con.
m
>m
x
Trị: dựa vào tính chất có thứ tự của A để xác
định nên tìm x trong nửa dãy con nào.
Gộp: khơng cần vì tìm ngay trên dãy A.
Giải thuật
10
Trương Phước Hải
Binary Search
Giải thuật chia để trị:
BinSearch(A[], l, r, x)
If (l > r) Then return -1
Else
m = [(l + r)/2]
If (A[m] = x) Then return m
Else If (x < A[m]) Then
return BinSearch(A, l, m-1, x)
Else
return BinSearch(A, m+1, r, x)
Cuối If
Cuối If
Cuối BinSearch
Giải thuật
11
Trương Phước Hải
Nội dung
1. Phương pháp chia để trị
2. Binary Search
3. Bài tốn tìm cực trị
4. Merge Sort
5. Quick Sort
6. Giải thuật Strassen
12
Trương Phước Hải
Tìm phần tử cực trị
Bài tốn: cho dãy A gồm N phần tử, tìm
cực trị (cực tiểu, cực đại) của dãy A.
Tư tưởng chia để trị:
Chia dãy thành 2 dãy con và tìm cực trị trên
từng dãy con.
Tìm cực trị trên các giá trị cực trị của mỗi dãy
con để tìm ra cực trị của dãy ban đầu.
Giải thuật
13
Trương Phước Hải
Tìm phần tử cực trị
Minh họa tìm giá trị min bằng phương
pháp chia để trị:
Min = 3
10, 16, 7, 39, 3, 24, 17, 41
3
3, 24, 17, 41
7
10, 16, 7, 39
10
10, 16
10
Giải thuật
16
7
7
3
7, 39
3, 24
39
3
14
17
24
17, 41
17
41
Trương Phước Hải
Tìm phần tử cực trị
Chia để trị cho bài tốn tìm cực trị:
Chia: chia dãy A[l..r] thành 2 dãy con A[l..m]
và A[m+1..r] với m = (l + r) div 2.
Trị: tìm cực trị của mỗi dãy con một cách đệ
quy. Đặt left là cực trị của dãy A[l..m], right là
cực trị của dãy A[m+1..r].
Gộp: so sánh giá trị của left và right để tìm
cực trị cho dãy ban đầu.
Giải thuật
15
Trương Phước Hải
Tìm phần tử cực trị
Giải thuật tìm cực trị theo phương pháp chia
để trị:
CucTri(A[], l, r)
If (l = r) Then
return A[l]
Cuối If
m = (l + r) div 2
left = CucTri(A, l, m)
right = CucTri(A, m + 1, r)
return (left < right)?left:right
Cuối CucTri
Giải thuật
16
Trương Phước Hải
Nội dung
1. Phương pháp chia để trị
2. Binary Search
3. Bài tốn tìm cực trị
4. Merge Sort
5. Quick Sort
6. Giải thuật Strassen
17
Trương Phước Hải
Merge Sort
Ý tưởng phương pháp trộn tự nhiên:
Tách và phân phối luân phiên các đường
chạy trên A vào 2 dãy B và C.
Trộn lần lượt từng cặp đường chạy trên B và
C vào A với mục đích giảm dần số đường
chạy trên A.
Giải thuật
18
Trương Phước Hải
Merge Sort
Ví dụ minh họa:
Dãy ban đầu: 2 2 8 16 4 6 13 15 6 20 3 9
A: 2 2 8 16 4 6 13 15 6 20 3 9
Tách B: 22 8 16 6 20
C: 4 6 13 15 3 9
Trộn A: 4 6 8 13 15 16 22
3 6 9 20
Tách B: 4 6 8 13 15 16 22
C: 3 6 9 20
Trộn A: 3 4 6 6 8 9 13 15 16 20 22
Giải thuật
19
Trương Phước Hải
Merge Sort
Tư tưởng chia để trị của Merge Sort:
Chia: phân phối các đường chạy từ dãy A
sang 2 dãy con B và C theo nguyên tắc luân
phiên.
Trị: áp dụng tư tưởng trên để tiếp tục phân
chia các dãy B và C một cách đệ quy.
Gộp: trộn từng cặp đường chạy trên B và C
để tạo thành dãy A mới.
Giải thuật
20
Trương Phước Hải
Merge Sort
Giải thuật trộn tự nhiên theo phương pháp
chia để trị:
TronTuNhien(A[], N)
If (N > 0) Then
PhanPhoi(A, N, B, nB, C, nC) //chia
//Nếu số đường chạy của A > 1
If (nB > 0) AND (nC > 0) Then
TronTuNhien(B, nB) //trị
TronTuNhien(C, nC) //trị
Cuối If
Tron(B, nB, C, nC, A, N) //gộp
Cuối If
Cuối TronTuNhien
Giải thuật
21
Trương Phước Hải
Merge Sort
Giải thuật phân phối đường chạy trên A:
PhanPhoi(A[], N, B[], &nB, C[], &nC)
nB = 0, nC = 0, i = 0, turn = True
While (i < N) Do
If (turn = True) Then
B[nB++] = A[i++]
Else
C[nC++] = A[i++]
Cuối If
If (A[i] < A[i-1]) Then
turn = NOT(turn) ‘chuyển dãy
Cuối If
Cuối While
Cuối PhanPhoi
Giải thuật
22
Trương Phước Hải
Merge Sort
Giải thuật trộn các đường chạy:
Tron (B, nB, C, nC, A[], &N)
i = 0, j = 0, n = 0
While (i < nB AND j < nC) Do
If (B[i] < C[j]) Then
A[n++] = B[i++]
Else
A[n++] = C[j++]
Cuối If
Cuối While
While (i < nB) Do A[n++] = B[i++]
While (j < nC) Do A[n++] = C[j++]
Cuối Tron
Giải thuật
23
Trương Phước Hải
Nội dung
1. Phương pháp chia để trị
2. Binary Search
3. Bài tốn tìm cực trị
4. Merge Sort
5. Quick Sort
6. Giải thuật Strassen
24
Trương Phước Hải
Quick Sort
Bài toán sắp xếp dãy A bằng phương pháp
QuickSort:
Phân hoạch dãy A thành 3 dãy con:
• Dãy 1 gồm những phần tử có giá trị nhỏ hơn x.
• Dãy 2 gồm những phần tử có giá trị bằng x.
• Dãy 3 gồm những phần tử có giá trị lớn hơn x.
Với x là một giá trị tùy ý thuộc dãy A.
Tiếp tục phân hoạch các dãy con một cách đệ
quy.
Giải thuật
25
Trương Phước Hải