1. Trang chủ
  2. » Công Nghệ Thông Tin

Cấu trúc dữ liệu - Phần 6

37 8 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

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

Ngày đăng: 09/05/2021, 18:25

w