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ị
Trang 1GVGD: Tr ng Ph c H i
(devide and conquer)
Trang 3 Chia bài toán thành các bài toán con có kích th 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 đ đ c l i gi i cho bài toán ban đ u
Trang 7Ph ng pháp chia đ tr
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ài toá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
Ph ng trình đ quy
v i đ nh
ng c l i
Trang 9Tì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 trong dãy A hay không, n u có ch ra v trí xu t hi n
Input: A[0…N-1], x
Output
index = -1, n u x không t n t i trong A
index ≥ 0 n u A[index] = x
Trang 10Tìm ki m nh phân
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
x
Trang 14Bài toán tìm c c tr c a dãy
Trang 15Bài toán tìm c c tr c a dãy
Minh h a tìm giá tr max c a dãy b ng ph ng pháp chia đ tr
Trang 16Bài toán tìm c c tr c a dãy
Chia đ tr cho bài toán tìm max c a dãy
Chia: chia dãy A[l r] thành 2 dãy con A[l m] và A[m+1 r]
Trang 17Bài toán tìm c c tr c a dãy
Gi i thu t tìm max theo ph ng pháp chia đ tr
left = Max (A, l, m)
right = Max (A, m + 1, r)
return (left > right)?left:right
Cu i Max
Trang 18Bài toán tìm c c tr c a dãy
return (maxL > maxR)? maxL: maxR;
}
Trang 23Merge Sort
T t ng chia đ tr c a Merge Sort
Chia: phân ph i các đ ng ch y t dãy A sang 2 dãy con B
và C theo nguyên t c luân phiên
Tr : áp d ng t t ng trên đ ti p t c phân chia 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
Trang 26Merge Sort
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++]
C[nC++] = A[i++]
If (A[i] < A[i-1]) Then
turn = NOT (turn) //chuy n dãy
Cu i While
Cu i PhanPhoi
Trang 27Merge Sort
Cài đ t hàm phân ph i các đ ng ch y trên A
void Distribute( int A[], int N, int B[],
Trang 29Merge Sort
Cài đ t hàm tr n các đ ng ch y
void Merge( int B[], int nB, int C[], int &nC,
Trang 31 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
Trang 33Quick Sort
T t ng chia đ tr c a Quick Sort
Chia: Phân ho ch A[l1 r1] thành 2 dãy con: A[l1 r2] < x
Trang 37Quick Sort
Cài đ t hàm phân ho ch Partition
void PhanHoach( int A[], int l1, int r1,