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
11
Tìm kim nh phân
Gii thut chia đ tr áp dng 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)
Cui If
Cui If
Cui BinSearch
12
Tìm kim nh phân
Cài đt ngôn ng
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, l, m – 1, x);
else return BinSearch(A, m + 1, r, x);
}
}
13
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
14
Bài toán tìm cc tr ca dãy
Bài toán
Cho dãy A gm N phn t, tìm giá tr ln nht ca dãy A
T tng chia đ tr
Chia dãy thành 2 dãy con và tìm giá tr ln nht trên tng
dãy con
So sánh các giá tr ln nht ca mi dãy con đ tìm ra giá
tr ln nht ca dãy ban đu
15
Bài toán tìm cc tr ca dãy
Minh ha tìm giá tr max ca dãy bng 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 dãy
Chia đ tr cho bài toán tìm max ca dãy
Chia: chia dãy A[l r] thành 2 dãy con A[l m] và A[m+1 r]
vi m = (l + r) div 2
Tr: tìm max ca mi dãy con mt cách đ quy. t left là
max ca dãy A[l m], right là max ca dãy A[m+1 r]
Gp: so sánh giá tr ca left và right đ tìm max cho dãy
ban đu
17
Bài toán tìm cc tr ca dãy
Gii thut tìm max theo phng pháp chia đ tr
Max(A[], l, r)
If (l = r) Then
return A[l]
Cui If
m = (l + r) div 2
left = Max(A, l, m)
right = Max(A, m + 1, r)
return (left> right)?left:right
Cui Max
18
Bài toán tìm cc tr ca dãy
Cài đt ngôn ng
int Max(int A[], int l, int r)
{
if (l == r)
return A[l];
int m = (l + r)/2;
int maxL = Max(A, l, m);
int maxR = Max(A, m + 1, r);
return (maxL > maxR)? maxL: maxR;
}
19
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
20
Merge Sort
Ý tng phng pháp trn t nhiên
Tách và phân phi luân phiên các đng chy trên A vào 2
dãy B và C
Trn ln lt tng cp đng chy trên B và C vào A vi
mc đích gim dn s đng chy trên A
Dãy đc sp th t nu ch tn ti 1 đng chy
21
Merge Sort
Ví d minh ha
Cho dãy: 2 2 8 16 4 6 13 15 6 20 3 9
Tách đng chy: 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
Trn 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
Trn B2 và C2 vào C: 3 4 6 9 13 15
Trn B và C vào A: 2 2 3 4 6 6 8 9 13 15 16 20
22
Merge Sort
Cây minh ha quá trình chia đ tr
A
2 2 8 16 4 6 13 15 6 20 3 9
B
2 2 8 16 6 20
C
4 6 13 15 3 9
B1
2 2 8 16
C1
6 20
B2
4 6 13 15
C2
3 9
23
Merge Sort
T tng chia đ tr ca Merge Sort
Chia: phân phi các đng chy t dãy A sang 2 dãy con B
và C theo nguyên tc luân phiên
Tr: áp dng t tng trên đ tip tc phân chia các dãy B
và C mt cách đ quy
Gp: trn tng cp đng chy trên B và C đ to thành
dãy A mi
24
Merge Sort
Gii thut trn t nhiên theo p.pháp chia đ tr
TronTuNhien(A[], N)
If (N > 0) Then
PhanPhoi(A, N, B, nB, C, nC) //chia
//Nu s đng chy ca A > 1
If (nB > 0) AND (nC > 0) Then
TronTuNhien(B, nB) //tr
TronTuNhien(C, nC) //tr
Cui If
Tron(B, nB, C, nC, A, N) //gp
Cui If
Cui TronTuNhien
25
Merge Sort
Cài đt hàm sp xp trn
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 > 0 && nC > 0)
{
MergeSort(B, nB);
MergeSort(C, nC);
}
Merge(B, nB, C, nC, A, N);
}
}