Tư tưởng: chia nhỏ bài toán lớn thànhnhững bài toán con dễ giải quyết hơn.Để giải bài toán kích thước n: Chia bài toán thành các bài toán con có kíchthước nhỏ hơn.. Bước 2: trị con
Trang 1Phương pháp chia để trị
Devide and conquer
ThS Trương Phước Hải
Trang 2Trương Phước Hải
Trang 3Tư tưởng: chia nhỏ bài toán lớn thànhnhững bài toán con dễ giải quyết hơn.
Để giải bài toán kích thước n:
Chia bài toán thành các bài toán con có kíchthướ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 để đượclời giải cho bài toán ban đầu
Phương pháp chia để trị
Trang 4Trương Phước Hải
Mô hình tổng quát của kỹ thuật chia để trị
Trang 5Cá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 haynhiều bài toán con nhỏ hơn
Bước 2: trị (conquer) (giải) các bài toán contheo 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áncon để tạo thành lời giải cho bài toán banđầu
Phương pháp chia để trị
Trang 6Trương Phước Hải
Giải thuật tổng quát
End If Cuối CDT
Phương pháp chia để trị
6
Giải thuật
Trang 7Độ phức tạp của giải thuật:
T(n): thời gian giải bài toán kích thước n
a: số bài toán con; n/b: kích thước của các bàitoá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 toán con
Trang 8Trương Phước Hải
Trang 9Cho 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
Binary Search
Trang 10Trương Phước Hải
Giải thuật chia để trị cho bài toán:
Chia: chia dãy A thành 2 nửa dãy con
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
Trang 11Giả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
Binary Search
Trang 12Trương Phước Hải
Trang 13Bài toán: cho dãy A gồm N phần tử, tìmcự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êntừng dãy con
Tìm cực trị trên các giá trị cực trị của mỗi dãycon để tìm ra cực trị của dãy ban đầu
Tìm phần tử cực trị
Trang 14Trương Phước Hải
Min = 3
Trang 15Chia để trị cho bài toá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ìmcực trị cho dãy ban đầu
Tìm phần tử cực trị
Trang 16Trương Phước Hải
Giải thuật tìm cực trị theo phương pháp chia
return (left < right)?left:right
Cuối CucTri
16
Giải thuật
Tìm phần tử cực trị
Trang 18Trương Phước Hải
Ý tưởng phương pháp trộn tự nhiên:
Tách và phân phối luân phiên các đườngchạ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ố đườngchạy trên A
Merge Sort
18
Giải thuật
Trang 19Tách B: 4 6 8 13 15 16 22
C: 3 6 9 20Trộn A: 3 4 6 6 8 9 13 15 16 20 22
Merge Sort
Trang 20Trương Phước Hải
Tư tưởng chia để trị của Merge Sort:
Chia: phân phối các đường chạy từ dãy Asang 2 dãy con B và C theo nguyên tắc luânphiên
Trị: áp dụng tư tưởng trên để tiếp tục phânchia 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
Merge Sort
20
Giải thuật
Trang 21Giải thuật trộn tự nhiên theo phương phápchia để trị:
Trang 22Trương Phước Hải
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
Merge Sort
22
Giải thuật
Trang 23Giải thuật trộn các đường chạy:
Tron (B, nB, C, nC, A[], &N)
While (i < nB) Do A[n++] = B[i++]
While (j < nC) Do A[n++] = C[j++]
Cuối Tron
Merge Sort
Trang 24Trương Phước Hải
Trang 25Bài toán sắp xếp dãy A bằng phương phápQuickSort:
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
Quick Sort
Trang 26Trương Phước Hải
Ví dụ:
A: 2 2 8 16 4 6 13 15 6 20 3 5
Chọn x = 6 là tiêu chí phân hoạch (phần
tử giữa dãy), A được chia thành 3 dãy sau:
Trang 27Tư tưởng chia để trị của Quick Sort:
Chia: Phân hoạch A[l1 r1] thành 3 dãy con:A[l1 r2] < x, A[r2+1 l2-1] = x và A[l2 r1] > x
Trị: tiếp tục phân hoạch các dãy con A[l1 r1]
Trang 28Trương Phước Hải
Giải thuật Quick Sort:
Trang 29Giải thuật phân hoạch:
PhanHoach (A[], l1, r1, &l2, &r2)
Cuối If Cuối While
Cuối PhanHoach
Quick Sort
Trang 30Trương Phước Hải
Trang 31Bài toán: cho 2 ma trận A (n x n) và B (n
x n), tìm ma trận tích C = A x B
Công thức tính phần tử 𝑐𝑖𝑗 của ma trận C:
Độ phức tạp của công thức: O(n3)
Giải thuật Strassen
𝑐𝑖𝑗 = 𝑎𝑖𝑘𝑏𝑘𝑗
𝑛−1
𝑘=0
Trang 32Trương Phước Hải
Trang 33Giải thuật Strassen (đề xuất năm 1969)cho tích 2 ma trận vuông cấp n:
Giả sử n là lũy thừa của 2
Chia mỗi ma trận thành 4 ma trận vuông con:
Trang 34Trương Phước Hải
Công thức Strassen đề xuất:
Với 𝑀𝑖 là các ma trận con sau:
độ phức tạp: O(n log7 ) ≈ O(n 2.81 )
Giải thuật Strassen
Trang 35Phương pháp chia để trị cho giải thuậtStrassen:
Chia: chia ma trận A, B thành từng 4 ma trậncon 𝐴𝑖𝑗, 𝐵𝑖𝑗
Trị: tìm ma trận con kết quả 𝐶𝑖𝑗 theo công thứcStrassen
Gộp: ghép các ma trận con kết quả để tạothành ma trận kết quả C
Giải thuật Strassen
Trang 36Trương Phước Hải
Nếu n không phải là lũy thừa của 2:
Thêm các cột và dòng đệm giá trị 0 vào matrận
Giải thuật Strassen