Tài liệu tham khảo bài giảng môn Cấu trúc dữ liệu - Phần 6 Chia để trị
Ph ng pháp chia đ tr (devide and conquer) GVGD: Tr ng Ph cH i N i dung Ph ng pháp chia đ tr Tìm ki m nh phân Bài tốn tìm c c tr c a dãy Merge Sort Quick Sort Ph T t ng pháp chia đ ng Chia nh toán l n thành nh ng toán d quy t h n gi i tốn kích th tr gi i cN Chia toán thành tốn có kích th c nh h n Có th s d ng k thu t chia đ tr đ ti p t c chia nh toán Gi i toán r i t ng h p l i đ toán ban đ u đ c l i gi i cho Ph ng pháp chia đ tr Mơ hình t ng quát c a k thu t chia đ tr problem P … … p1 p2 Bài toán c s (base problem) pk Ph Các b ng pháp chia đ c ti p c n ph tr ng pháp chia đ tr B c 1: chia (divide) toán thành hay nhi u toán nh h n B c 2: tr (conquer) (gi i) toán theo ph pháp m t cách đ quy ng B c 3: g p (combine) l i gi i toán đ thành l i gi i cho toán ban đ u t o Ph ng pháp chia đ tr Gi i thu t t ng quát DAC(P) If (P đ nh ) Then return L iGi i(P) Else Chia P thành th hi n p1, p2, pk Áp d ng chia đ tr cho t ng th hi n pi K t H p (DAC(p1), DAC(p2), , DAC(pk)) End If Cu i DAC Ph ng pháp chia đ tr ph c t p c a gi i thu t Ph T(N): th i gian gi i tốn kích th c N a: s tốn N/b: kích th c c a tốn D(N): th i gian chia nh toán ban đ u C(N): th i gian k t h p tốn ng trình đ quy v i đ nh ng cl i N i dung Ph ng pháp chia đ tr Tìm ki m nh phân Bài tốn tìm c c tr c a dãy Merge Sort Quick Sort Tìm ki m nh phân Cho dãy A g m N ph n t đ c s p th t không gi m Cho bi t ph n t x có t n t i dãy A hay không, n u có ch v trí xu t hi n Input: A[0…N-1], x Output index = -1, n u x không t n t i A index ≥ n u A[index] = x Tìm ki m nh phân Gi i thu t chia đ tr cho toán Chia: chia dãy A thành n a dãy m x Tr : d a vào tính ch t có th x n a dãy t c a A đ G p: không c n tìm dãy A 10 xác đ nh nên tìm Merge Sort T t ng chia đ tr c a Merge Sort Chia: phân ph i đ ng ch y t C theo nguyên t c luân phiên dãy A sang dãy B Tr : áp d ng t t ng đ ti p t c phân chia dãy B C m t cách đ quy G p: tr n t ng c p đ dãy A m i ng ch y B C đ 23 t o thành Merge Sort Gi i thu t tr n t nhiên theo p.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 > 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 24 Merge Sort Cài đ t hàm s p x p tr n void MergeSort(int A[], int N) { int B[MAX], nB = 0, C[MAX], nC = 0; if (N > 0) { Distribute(A, N, B, nB, C, nC); if (nB > && nC > 0) { MergeSort(B, nB); MergeSort(C, nC); } Merge(B, nB, C, nC, A, N); } } 25 Merge Sort Gi i thu t phân ph i đ ng ch y 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 26 Merge Sort Cài đ t hàm phân ph i đ ng ch y A void Distribute(int A[], int N, int B[], int &nB, int C[], int &nC) { bool turn = true; int i = 0; while (i < N) { if (turn) B[nB++] = A[i++]; else C[nC++] = A[i++]; if (A[i] < A[i – 1]) turn = !turn; } } 27 Merge Sort Gi i thu t tr n đ ng ch y Tron (B[], nB, C[], nC, A[], &N) i = 0, j = 0, N = 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 < A[N++] While (j < A[N++] Cu i Tron nB) Do = B[i++] nC) Do = C[j++] 28 Merge Sort Cài đ t hàm tr n đ ng ch y void Merge(int B[], int nB, int C[], int &nC, int A[], int &N) { int i = 0, j = 0; N = 0; while (i < nB && j < nC) { if (B[i] < C[j] A[N++] = B[i++]; else A[N++] = C[j++]; } while (i < nB) A[N++] = B[i++]; while (j < nC) A[N++] = C[j++]; } 29 N i dung Ph ng pháp chia đ tr Tìm ki m nh phân Bài tốn tìm c c tr c a dãy Merge Sort Quick Sort 30 Quick Sort Bài toán s p x p dãy A b ng ph QuickSort theo t t ng chia đ tr ng pháp Phân ho ch dãy A thành dãy Dãy g m nh ng ph n t có giá tr nh h n x Dãy g m nh ng ph n t có giá tr l n h n x V i x m t giá tr tùy ý thu c dãy A Ti p t c phân ho ch dãy m t cách đ quy 31 Quick Sort Ví d A: 2 16 13 15 20 Ch n x = tiêu chí phân ho ch (ph n t chia thành dãy sau A: 2 13 15 20 16 Dãy 1: 2 Dãy 2: 13 15 20 16 32 gi a dãy), A đ c Quick Sort T t ng chia đ tr c a Quick Sort Chia: Phân ho ch A[l1 r1] thành dãy con: A[l1 r2] < x A[l2 r1] > x A[l1 r2] < x l1 A[l2 r1] > x r2 l2 r1 Tr : ti p t c phân ho ch dãy A[l1 r2] A[l2 r1] m t cách đ quy G p: không c n thao tác Chia đ dãy A 33 c th c hi n Quick Sort Gi i thu t Quick Sort QuickSort(A[], l1, r1) If (l1 < r1) Then PhanHoach(A, l1, r1, l2, r2) QuickSort(A, l1, r2) QuickSort(A, l2, r1) Cu i If Cu i QuickSort 34 //chia //tr //tr Quick Sort Cài đ t hàm QuickSort void QuickSort(int A[], { int l2, r2; if (l1 < r1) { PhanHoach(A, l1, QuickSort(A, l1, QuickSort(A, l2, } } 35 int l1, int r1) r1, l2, r2); r2); r1); Quick Sort Gi i thu t phân ho ch PhanHoach(A[], l1, r1, &l2, &r2) l2 = l1, r2 = r1 x = A[(l2+r2)/2] While (l2 < r2) Do While (A[l2] < x) Do l2++ While (A[r2] > x) Do r2-If (l2 x) r2 ; if (l2