Bài giảng Thuật toán ứng dụng: Chia để trị
Số trang: 31
Loại file: pdf
Dung lượng: 286.35 KB
Lượt xem: 53
Lượt tải: 0
Xem trước 4 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Bài giảng Thuật toán ứng dụng: Chia để trị. Chương này cung cấp cho học viên những nội dung về: tổng quan chia để trị; ví dụ minh họa; độ phức tạp chia để trị; sắp xếp trộn; giảm để trị;... Mời các bạn cùng tham khảo chi tiết nội dung bài giảng!
Nội dung trích xuất từ tài liệu:
Bài giảng Thuật toán ứng dụng: Chia để trị THUẬT TOÁN ỨNG DỤNG CHIA ĐỂ TRỊ Phạm Quang Dũng Bộ môn KHMT dungpq@soict.hust.edu.vn 1 NộI dung Tổng quan chia để trị Ví dụ minh họa Độ phức tạp chia để trị Giảm để trị 2 Tổng quan chia để trị Chia bài toán cần giải ban đầu thành các bài toán con độc lập nhau Giải (trị) các bài toán con Tổng hợp lời giải của các bài toán con để dẫn ra lời giải của bài toán xuất phát 3 Ví dụ minh họa Bài toán dãy con dài nhất: cho dãy số nguyên a = a1, a2, …, an. Tìm dãy con gồm một số liên tiếp các phần tử có tổng lớn nhất Phân chia: ký hiệu P(i, j) là lời giải của bài toán tìm dãy con liên tiếp của dãy ai, ai+1,…, aj có tổng cực đại Tổng hợp lời giải Ký hiệu PL(i, j) là lời giải của bài toán tìm dãy con liên tiếp của dãy ai, ai+1,…, aj sao cho phần tử cuối cùng là aj có tổng cực đại Ký hiệu PR(i, j) là lời giải của bài toán tìm dãy con liên tiếp của dãy ai, ai+1,…, aj sao cho phần tử đầu tiên là ai có tổng cực đại 4 Ví dụ minh họa Xét đoạn [l,l+1,...,r]. Ký hiệu m = (l+r)/2 P(l,r) = MAX{P(l, m), P(m+1,r), PL(l,m) + PR(m+1,r)} l P(l,m) P(m+1,r) r m m+1 PL(l,m) PR(m+1,r) 5 Ví dụ minh họa #include using namespace std; #define INF 1e9 #define MAX 1000000 int a[MAX]; int n; void input(){ cin >> n; for(int i = 0; i < n; i++) cin >> a[i]; } 6 Ví dụ minh họa int PL(int l, int r){ int rs = -INF; int s = 0; for(int i = r; i >= l; i--){ s += a[i]; rs = max(rs,s); } return rs; } int PR(int l, int r){ int rs = -INF; int s = 0; for(int i = l; i Ví dụ minh họa int P(int l, int r){ if(l == r) return a[r]; int m = (l+r)/2; return max(max(P(l,m),P(m+1,r)), PL(l,m)+PR(m+1,r)); } void solve(){ cout Độ phức tạp tính toán Chia bài toán xuất phát thành a bài procedure D-and-C(n) { toán con, mỗi bài toán con kích 1. if(n n0) thước n/b 2. xử lý trực tiếp T(n): thời gian của bài toán kích 3. else{ thước n 4. chia bài toán xuất phát Thời gian phân chia (dòng 4): D(n) thành a bài toán con kích thước Thời gian tổng hợp lời giải (dòng 6): n/b C(n) 5. gọi đệ quy a bài toán con Công thức truy hồi: 6. tổng hợp lời giải 7. } Q 1 , ≤ 0 T = } + + , > 0 9 Độ phức tạp tính toán Độ phức tạp của thuật toán chia để trị (định lí thợ) Công thức truy hồi: T(n) = aT(n/b) + cnk, với các hằng số a 1, b > 1, c > 0 Nếu a > bk thì T(n) = Q( ) Nếu a = bk thì T(n) = Q( ) với logn = Nếu a < bk thì T(n) = Q( ) 10 Độ phức tạp tính toán Độ phức tạp của thuật toán chia để trị (định lí thợ) Công thức truy hồi: T(n) = aT(n/b) + cnk, với các hằng số a 1, b > 1, c > 0 Nếu a > bk thì T(n) = Q( ) Nếu a = bk thì T(n) = Q( ) với logn = Nếu a < bk thì T(n) = Q( ) Thuật toán chia để trị giải bài toán tổng con cực đại có độ phức tạp là O(nlogn) 11 Sắp xếp trộn Phân chia: Chia dãy a1, …, an thành 2 dãy con có độ dài bằng nhau Trị đệ quy: Sắp xếp 2 dãy con bằng thuật toán sắp xếp trộn Tổng hợp: Trộn 2 dãy con đã được sắp với nhau để thu được dãy ban đầu được sắp thứ tự 12 Sắp xếp trộn Trộn hai dãy đã được sắp xếp thành dãy mới được sắp xếp i j a 1 3 8 9 20 4 5 10 11 23 k ta 13 Sắp xếp trộn Trộn hai dãy đã được sắp xếp thành dãy mới được sắp xếp i j a 1 3 8 9 20 4 5 10 11 23 k ta 1 14 Sắp xếp trộn Trộn hai dãy đã được sắp xếp thành dãy mới được sắp xếp i j a 1 3 8 9 20 4 5 10 11 23 k ta 1 3 15 Sắp xếp trộn Trộn hai dãy đã được sắp xếp thành dãy mới được sắp xếp i j a 1 3 8 9 20 4 5 10 11 23 k ta 1 3 4 16 Sắp xếp trộn Trộn hai dãy đã được sắp xếp thành dãy mới được sắp xếp i j a 1 3 8 9 20 4 5 10 11 23 k ta 1 3 4 5 17 Sắp xếp trộn Trộn hai dãy đã được sắp xếp thành dãy mới được sắp xếp i j a 1 3 8 9 20 4 5 10 11 23 k ta 1 3 4 5 8 18 Sắp xếp trộn Trộn hai dãy đã được sắp xếp thành dãy mới được sắp xếp i j a 1 3 8 9 20 4 5 10 11 23 k ta 1 3 4 5 8 9 19 Sắp xếp trộn Trộn hai dãy đã được sắp xếp thành dãy mới được sắp xếp i j a 1 3 ...
Nội dung trích xuất từ tài liệu:
Bài giảng Thuật toán ứng dụng: Chia để trị THUẬT TOÁN ỨNG DỤNG CHIA ĐỂ TRỊ Phạm Quang Dũng Bộ môn KHMT dungpq@soict.hust.edu.vn 1 NộI dung Tổng quan chia để trị Ví dụ minh họa Độ phức tạp chia để trị Giảm để trị 2 Tổng quan chia để trị Chia bài toán cần giải ban đầu thành các bài toán con độc lập nhau Giải (trị) các bài toán con Tổng hợp lời giải của các bài toán con để dẫn ra lời giải của bài toán xuất phát 3 Ví dụ minh họa Bài toán dãy con dài nhất: cho dãy số nguyên a = a1, a2, …, an. Tìm dãy con gồm một số liên tiếp các phần tử có tổng lớn nhất Phân chia: ký hiệu P(i, j) là lời giải của bài toán tìm dãy con liên tiếp của dãy ai, ai+1,…, aj có tổng cực đại Tổng hợp lời giải Ký hiệu PL(i, j) là lời giải của bài toán tìm dãy con liên tiếp của dãy ai, ai+1,…, aj sao cho phần tử cuối cùng là aj có tổng cực đại Ký hiệu PR(i, j) là lời giải của bài toán tìm dãy con liên tiếp của dãy ai, ai+1,…, aj sao cho phần tử đầu tiên là ai có tổng cực đại 4 Ví dụ minh họa Xét đoạn [l,l+1,...,r]. Ký hiệu m = (l+r)/2 P(l,r) = MAX{P(l, m), P(m+1,r), PL(l,m) + PR(m+1,r)} l P(l,m) P(m+1,r) r m m+1 PL(l,m) PR(m+1,r) 5 Ví dụ minh họa #include using namespace std; #define INF 1e9 #define MAX 1000000 int a[MAX]; int n; void input(){ cin >> n; for(int i = 0; i < n; i++) cin >> a[i]; } 6 Ví dụ minh họa int PL(int l, int r){ int rs = -INF; int s = 0; for(int i = r; i >= l; i--){ s += a[i]; rs = max(rs,s); } return rs; } int PR(int l, int r){ int rs = -INF; int s = 0; for(int i = l; i Ví dụ minh họa int P(int l, int r){ if(l == r) return a[r]; int m = (l+r)/2; return max(max(P(l,m),P(m+1,r)), PL(l,m)+PR(m+1,r)); } void solve(){ cout Độ phức tạp tính toán Chia bài toán xuất phát thành a bài procedure D-and-C(n) { toán con, mỗi bài toán con kích 1. if(n n0) thước n/b 2. xử lý trực tiếp T(n): thời gian của bài toán kích 3. else{ thước n 4. chia bài toán xuất phát Thời gian phân chia (dòng 4): D(n) thành a bài toán con kích thước Thời gian tổng hợp lời giải (dòng 6): n/b C(n) 5. gọi đệ quy a bài toán con Công thức truy hồi: 6. tổng hợp lời giải 7. } Q 1 , ≤ 0 T = } + + , > 0 9 Độ phức tạp tính toán Độ phức tạp của thuật toán chia để trị (định lí thợ) Công thức truy hồi: T(n) = aT(n/b) + cnk, với các hằng số a 1, b > 1, c > 0 Nếu a > bk thì T(n) = Q( ) Nếu a = bk thì T(n) = Q( ) với logn = Nếu a < bk thì T(n) = Q( ) 10 Độ phức tạp tính toán Độ phức tạp của thuật toán chia để trị (định lí thợ) Công thức truy hồi: T(n) = aT(n/b) + cnk, với các hằng số a 1, b > 1, c > 0 Nếu a > bk thì T(n) = Q( ) Nếu a = bk thì T(n) = Q( ) với logn = Nếu a < bk thì T(n) = Q( ) Thuật toán chia để trị giải bài toán tổng con cực đại có độ phức tạp là O(nlogn) 11 Sắp xếp trộn Phân chia: Chia dãy a1, …, an thành 2 dãy con có độ dài bằng nhau Trị đệ quy: Sắp xếp 2 dãy con bằng thuật toán sắp xếp trộn Tổng hợp: Trộn 2 dãy con đã được sắp với nhau để thu được dãy ban đầu được sắp thứ tự 12 Sắp xếp trộn Trộn hai dãy đã được sắp xếp thành dãy mới được sắp xếp i j a 1 3 8 9 20 4 5 10 11 23 k ta 13 Sắp xếp trộn Trộn hai dãy đã được sắp xếp thành dãy mới được sắp xếp i j a 1 3 8 9 20 4 5 10 11 23 k ta 1 14 Sắp xếp trộn Trộn hai dãy đã được sắp xếp thành dãy mới được sắp xếp i j a 1 3 8 9 20 4 5 10 11 23 k ta 1 3 15 Sắp xếp trộn Trộn hai dãy đã được sắp xếp thành dãy mới được sắp xếp i j a 1 3 8 9 20 4 5 10 11 23 k ta 1 3 4 16 Sắp xếp trộn Trộn hai dãy đã được sắp xếp thành dãy mới được sắp xếp i j a 1 3 8 9 20 4 5 10 11 23 k ta 1 3 4 5 17 Sắp xếp trộn Trộn hai dãy đã được sắp xếp thành dãy mới được sắp xếp i j a 1 3 8 9 20 4 5 10 11 23 k ta 1 3 4 5 8 18 Sắp xếp trộn Trộn hai dãy đã được sắp xếp thành dãy mới được sắp xếp i j a 1 3 8 9 20 4 5 10 11 23 k ta 1 3 4 5 8 9 19 Sắp xếp trộn Trộn hai dãy đã được sắp xếp thành dãy mới được sắp xếp i j a 1 3 ...
Tìm kiếm theo từ khóa liên quan:
Bài giảng Thuật toán ứng dụng Thuật toán ứng dụng Chia để trị Thuật toán chia để trị Công thức truy hồi Tìm kiếm nhị phânTài liệu có liên quan:
-
Bài giảng chuyên đề Phân tích và thiết kế thuật toán: Chia để trị
27 trang 240 0 0 -
Giáo trình Lập trình cơ bản với C++ - Phan 2
69 trang 218 0 0 -
Tài liệu tham khảo: Cấu trúc dữ liệu và giải thuật
229 trang 148 0 0 -
Bài giảng Thuật toán ứng dụng: Tarjan DFS algorithm for finding bridges and articulation points
21 trang 65 0 0 -
Bài giảng Thuật toán ứng dụng: Graphs
141 trang 45 0 0 -
Phương pháp tìm giới hạn dãy số cho bởi công thức truy hồi bằng đồ thị hàm số
7 trang 40 0 0 -
16 trang 37 0 0
-
Bài giảng Thuật toán ứng dụng: Chương 1 - Đỗ Phan Thuận
46 trang 34 0 0 -
Tóm tắt luận văn Thạc sĩ Khoa học: Công thức truy hồi và ứng dụng
26 trang 32 0 0 -
Bài giảng Thuật toán ứng dụng: Chương 3 - Đỗ Phan Thuận
32 trang 31 0 0