Professional Documents
Culture Documents
5 - Chia Va Tri
5 - Chia Va Tri
5 - Chia Va Tri
VC
BB
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
CHIA VÀ TRỊ
(Devide and Conquer)
03/06/23 nguyenmanhson@gmail.com 1
&
VC
BB
CHIA VÀ TRỊ
2
&
VC
BB
Thuật toán Chia và trị
Thuật toán chia để trị (Devide and Conquer)
Mục tiêu: Giảm thời gian chạy
Ý tưởng: Áp dụng đệ quy theo 3 bước
1. Devide (Chia). Chia bài toán lớn thành những bài toán con có
cùng kiểu với bài toán lớn.
2. Conquer (Trị). Giải các bài toán con. Thông thường các bài toán
con chỉ khác nhau về dữ liệu vào nên ta có thể thực hiện bằng một
thủ tục đệ quy.
3. Combine (Tổng hợp). Tổng hợp lại kết quả của các bài toán con
để nhận được kết quả của bài toán lớn.
3
&
VC
BB
Thuật toán Chia và trị
Áp dụng khi nào?
Bài toán có thể được chia thành các bài toán con
giống bài toán gốc nhưng với kích thước nhỏ hơn
Ứng dụng trong xử lý song song ...
4
&
VC
BB
Thuật toán Chia và trị
5
&
VC
BB
Phân tích độ phức tạp tính toán
Gọi T(n) là độ phức tạp tính toán, n0 là trường hợp dừng. Theo
thuật toán tổng quát
• T(n) = O(1) nếu n = n0
• T(n) = aT(n/b) + D(n) + C(n) nếu n>n0
Trong đó
• a: Số bài toán con
• n/b: Kích thước bài toán con
• D(n): Độ phức tạp thời gian của phần Devide
• C(n): Độ phức tạp thời gian của phần Combine
Ví dụ với b=2.
Theo định lý Master: T(n) = 2T(n/2) + n thì độ phức tạp sẽ là O(n
log n)
6
&
VC
BB
Một số ví dụ
7
&
VC 1. Tìm kiếm nhị phân
BB
Bài toán: Cho số x và mảng A[] các số nguyên được sắp xếp
theo thứ tự không giảm. Tìm i sao cho A[i] = x.
8
&
VC 1. Tìm kiếm nhị phân
BB
Giải thuật
index location(index low, index high){
index mid;
If (low > high) return 0;
Else {
mid = (low + high)/2 ;
If (x == A[mid]) return mid
Else
If (x < A[mid]) return location(low, mid - 1)
Else
Return location (mid + 1, high);
}
}
9
&
VC 1. Tìm kiếm nhị phân
BB
1 n 1
T ( n) n
T ( 2 ) 1 n 1
Kết luận:
T (n) O(log 2 n)
10
&
VC
BB
2. Phép nhân số nguyên lớn
Cải tiến 1:
Rút gọn phép nhân hai số nguyên n chữ số còn bốn phép nhân hai số
nguyên n/2
11
&
VC Phép nhân cổ điển
BB
Output: z x * y z 2 n 1 z 2 n 2 ...z1 z 0
Phân tích:
n 1
x xi *10 i x n 1 * 10 n1 x n 2 *10 n 2 ... x1 * 101 x0 * 10 0
i 0
n 1
y y i *10 i y n 1 *10 n 1 y n 2 *10 n 2 ... y1 *101 y 0 *10 0
i 0
2 n 1 n 1 n 1
z x* y i
z
i 0
* 10 i
( i
x * 10
i 0
i
) * ( i )
y * 10 i
i 0
12
&
VC Cải tiến 1
BB
a x n 1 x n 2 ...x n / 2 b x( n / 2 ) 1 x( n / 2 ) 2 ...x0
c y n 1 y n 2 ... y n / 2 d y ( n / 2) 1 y ( n / 2 ) 2 ...y 0
13
&
VC Cải tiến 1
BB
Áp dụng:
với n = 4; x = 1026 và y = 3547
thì a = 10, b = 26, c = 35, d = 47
Khi đó
x = 1026 = 10*102 + 26 = a*102 + b;
y = 3547 = 35*102 + 47 = c*102 + d
và z = x*y
= (10*35)*104 + (10*47+26*35)*102 + (26*47)
= 350*104 + 1380*102 + 1222
= 3.639.222
14
&
VC Cải tiến 2: Thuật toán Karatsuba
BB
15
&
VC Thuật toán Karatsuba
BB
16
&
VC Thuật toán Karatsuba
BB
1 n 1
T ( n) n
3T ( ) cn n 1
2
17
&
VC 3. Tìm tổng dãy con liên tục lớn nhất
BB
18
&
VC Tìm tổng dãy con liên tục lớn nhất
BB
19
&
VC
BB
Tìm tổng dãy con liên tục lớn nhất
20
&
VC Tìm tổng dãy con liên tục lớn nhất
BB
Thuật toán 2. Chia và trị ( Arr[], n): //Độ phức tạp O(nlog(n).
Cho A[] là một mảng n phần tử. Hãy sắp xếp các phần tử của
A theo thứ tự không giảm.
Giải thuật theo mô hình chia và trị:
MergeSort
QuickSort
22
&
VC Sắp xếp trộn (Merge Sort)
BB
Chia:
• Nếu n =1 thì return A
23
&
VC Sắp xếp trộn (Merge Sort)
BB
27 10 12 20 25 13 15 22
27 10 12 20 25 13 15 22
27 10 12 20 25 13 15 22
27 10 12 20 25 13 15 22
10 27 12 20 13 25 15 22
10 12 20 27 13 15 22 25
10 12 13 15 20 22 25 27
24
&
VC Sắp xếp trộn (Merge Sort)
BB
25
&
VC Sắp xếp trộn (Merge Sort)
BB
Vì g(n) là thao tác trộn hai dãy, có độ phức tạp O(n) nên độ
phức tạp thuật toán chỉ phụ thuộc số bước gọi đệ quy.
26
&
VC 5. Tính lũy thừa
BB
Bài toán:
Tính an
Điều kiện: a, n là các số nguyên và n không âm.
27
&
VC 4. Tính lũy thừa
BB
1 ,n 0
2 n / 2
n
a (a ) , n chẵn
a (a 2 ) n / 2 n lẻ
28
&
VC 4. Tính lũy thừa
BB
int power(int a, int n) {
if (n = 0) return 1;
int x = power(a,n/2)
if (n %2 == 0)
return x*x;
return a*x*x;
}
T(n) = O(logn).
Vấn đề:
Kiểu dữ liệu
Chia dư để tránh tràn số
29
&
VC
BB
Tính chất đồng dư
Với một giá trị m, các phép toán khi chia modulo
cho m sẽ có tính chất sau
• Phép cộng: (A+B) mod m = A mod m + B mod m
• Phép trừ: (A-B) mod m = (A mod m – B mod m + m) mod m
• Phép nhân: (A*B) mod m = (A mod m * B mod m) mod m
30
&
VC
BB
5. Bài toán Fibonacci Word
Dãy Fibonacci
F[1] = 1
F[2] = 1
F[n] = F[n-1] + F[n-2]
Các phần tử đầu tiên của dãy
1; 1; 2; 3; 5; 8; 13; 21; 34; 55; …
Bài toán Fibonacci Word
Cho trước hai xâu g1 và g2. Quy tắc tạo xâu tiếp theo như
sau (với dấu + là nối xâu)
• g(1) = A
• g(2) = B
• g(n) = g(n-2) + g(n-1)
31
&
VC
BB
5. Bài toán Fibonacci Word
33
&
VC
BB
6. Tính số Fibonacci thứ N
Ý tưởng
Nhận xét:
Tính lũy thừa ma trận theo cách tính lũy thừa O(logN)
34