GVGD: Trng Phc Hi Phng pháp chia đ tr (devide and conquer) 2 Ni dung 1. Phng pháp chia đ tr 3. Bài toán tìm cc tr ca dãy 4. Merge Sort 2. Tìm kim nh phân 5. Quick Sort 3 Phng pháp chia đ tr T tng Chia nh bài toán ln thành nhng bài toán con d gii quyt hn gii bài toán kích thc N Chia bài toán thành các bài toán con có kích thc nh hn. Có th s dng k thut chia đ tr đ tip tc chia nh bài toán con Gii các bài toán con ri tng hp li đ đc li gii cho bài toán ban đu 4 Phng pháp chia đ tr Mô hình tng quát ca k thut chia đ tr … Bài toán c s (base problem) problem P … p 1 p 2 p k 5 Phng pháp chia đ tr Các bc tip cn phng pháp chia đ tr Bc 1: chia (divide) bài toán thành 2 hay nhiu bài toán con nh hn Bc 2: tr (conquer) (gii) các bài toán con theo phng pháp này mt cách đ quy Bc 3: gp (combine) li gii các bài toán con đ to thành li gii cho bài toán ban đu 6 Phng pháp chia đ tr Gii thut tng quát DAC(P) If (P đ nh) Then return LiGii(P) Else Chia P thành các th hin p1, p2, pk Áp dng chia đ tr cho tng th hin pi Kt Hp (DAC(p1), DAC(p2), , DAC(pk)) End If Cui DAC 7 Phng pháp chia đ tr phc tp ca gii thut T(N): thi gian gii bài toán kích thc N a: s bài toán con N/b: kích thc ca các bài toán con D(N): thi gian chia nh bài toán ban đu C(N): thi gian kt hp các bài toán con Phng trình đ quy vi đ nh ngc li 8 Ni dung 1. Phng pháp chia đ tr 3. Bài toán tìm cc tr ca dãy 4. Merge Sort 2. Tìm kim nh phân 5. Quick Sort 9 Tìm kim nh phân Cho dãy A gm N phn t đc sp th t không gim. Cho bit phn t x có tn ti trong dãy A hay không, nu có ch ra v trí xut hin Input: A[0…N-1], x Output index = -1, nu x không tn ti trong A index ≥ 0 nu A[index] = x 10 Tìm kim nh phân Gii thut chia đ tr cho bài toán Chia: chia dãy A thành 2 na dãy con Tr: da vào tính cht có th t ca A đ xác đnh nên tìm x trong na dãy con nào Gp: không cn vì tìm ngay trên dãy A < m > m m x [...]... Tách 2 2 8 16 4 6 13 15 6 20 3 9 : 2 2 8 16 4 6 13 15 6 20 3 9 Tách B: 2 2 8 16 6 20 Tách B1: 2 2 8 16 C1: 6 20 B1 và C1 vào B: 2 2 6 8 16 20 Tách C: 4 6 13 15 3 9 Tách B2: 4 6 13 15 C2: 3 9 B2 và C2 vào C: 3 4 6 9 13 15 B và C vào A: 2 2 3 4 6 6 8 9 13 15 16 20 21 Merge Sort Cây minh quá trình chia A 2 2 8 16 4 6 13 15 6 20 3 9 B 2 2 8 16 6 20 B1 2 2 8 16 C 4 6 13 15 3 9 C1 6 20 B2 4 6 13 15 22 C2... chia pháp dãy A thành 2 dãy con Dãy 1 có giá Dãy 2 có giá x là giá phân tùy ý x x dãy A các dãy con 31 cách quy Quick Sort Ví A: 2 2 8 16 4 6 13 15 6 20 3 5 x = 6 là tiêu chí phân chia thành 2 dãy sau A: 2 2 5 3 4 6 13 15 6 20 16 8 Dãy 1: 2 2 5 3 4 6 Dãy 2: 13 15 6 20 16 8 32 dãy), A Quick Sort chia Quick Sort Chia: Phân và A[l2 r1] > x A[l1 r1] thành 2 dãy con: A[l1 r2] < x A[l1 r2] < x A[l2 r1] > x... pháp chia max dãy Max = 41 10, 16, 7, 39, 3, 24, 17, 41 39 10, 16, 7, 39 39 16 7 24 7, 39 16 10, 16 10 41 3, 24, 17, 41 3, 24 39 3 15 41 24 17, 41 17 41 Chia cho bài toán tìm max dãy Chia: chia dãy A[l r] thành 2 dãy con A[l m] và A[m+1 r] m = (l + r) div 2 : tìm max dãy con cách quy left là max dãy A[l m], right là max dãy A[m+1 r] : so sánh giá left và right ban 16 tìm max cho dãy tìm max theo pháp...chia áp cho Binary Search 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) If If BinSearch 11 Cài ngôn int BinSearch(int A[], int l, int r, int x) { if (l > r) return -1 else { int m = (l + r)/2; if (A[m] == x) return m; else if (x < A[m]) return BinSearch(A,... r2); r2); r1); Quick Sort phân 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 . phng pháp chia đ tr 10, 16, 7, 39, 3, 24, 17, 41 10, 16, 7, 39 3, 24, 17, 41 10, 16 7, 39 3, 24 17, 41 10 16 7 39 3 24 17 41 16 24 41 39 41 39 Max = 41 16 Bài toán tìm cc tr ca. 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,. tn ti trong dãy A hay không, nu có ch ra v trí xut hin Input: A[0…N-1], x Output index = -1 , nu x không tn ti trong A index ≥ 0 nu A[index] = x 10 Tìm kim