Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 25 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
25
Dung lượng
612,72 KB
Nội dung
DATA STRUCTURE AND ALGORITHM Dynamic Programming CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Qui hoạch động Dr Dao Nam Anh Data Structure and Algorithm Resource - Reference Slides adapted from James B D Joshi, edit by Dao Nam Anh Major Reference: • Robert Sedgewick, and Kevin Wayne, “Algorithms” Princeton University, 2011, Addison Wesley • Algorithm in C (Parts 1-5 Bundle)- Third Edition by Robert Sedgewick, Addison-Wesley • • Cấu trúc liệu giải thuật, Đinh Mạnh Tường Giải thuật lập trình, Lê Minh Hồng, Đại Học Sư Phạm, 2002 Data Structure and Algorithm Divide and Conquer Chia Trị • Một số chương trình đệ qui gọi cho hai tập liệu có kích thước ½ Chia vấn đề thành phần thực phần • • Chi phí thời gian: TN = Tk + TN-k + Many recursive programs use recursive calls on two subsets of inputs (two halves usually) Divide the problem and solve them – divide and conquer paradigm Complexity: TN = Tk + TN-k + Data Structure and Algorithm Find max- Divide and Conquer Tìm số lớn – theo cách chia trị 317 Item max(Item a[], int l, int r) { Item u, v; int m = (l+r)/2; if (l == r) return a[l]; u = max(a, l, m); v = max(a, m+1, r); if (u > v) return u; else return v; } Data Structure and Algorithm Find max- Divide and Conquer Tìm số lớn – theo cách chia trị 317 2 Item max(Item a[], int l, int r) { Item u, v; int m = (l+r)/2; if (l == r) return a[l]; u = max(a, l, m); v = max(a, m+1, r); if (u > v) return u; else return v; } Data Structure and Algorithm Find max- Divide and Conquer Tìm số lớn – theo cách chia trị 317 2 3 Item max(Item a[], int l, int r) { Item u, v; int m = (l+r)/2; if (l == r) return a[l]; u = max(a, l, m); v = max(a, m+1, r); if (u > v) return u; else return v; } Data Structure and Algorithm Find max- Divide and Conquer Tìm số lớn – theo cách chia trị 317 2 2 Item max(Item a[], int l, int r) { Item u, v; int m = (l+r)/2; if (l == r) return a[l]; u = max(a, l, m); v = max(a, m+1, r); if (u > v) return u; else return v; } Data Structure and Algorithm Find max- Divide and Conquer Tìm số lớn – theo cách chia trị 317 2 2 Item max(Item a[], int l, int r) { Item u, v; int m = (l+r)/2; if (l == r) return a[l]; u = max(a, l, m); v = max(a, m+1, r); if (u > v) return u; else return v; } Data Structure and Algorithm Find max- Divide and Conquer Tìm số lớn – theo cách chia trị 317 2 3 2 3 Item max(Item a[], int l, int r) { Item u, v; int m = (l+r)/2; if (l == r) return a[l]; u = max(a, l, m); v = max(a, m+1, r); if (u > v) return u; else return v; } Data Structure and Algorithm Find max- Divide and Conquer Tìm số lớn – theo cách chia trị 317 3 2 3 Item max(Item a[], int l, int r) { Item u, v; int m = (l+r)/2; if (l == r) return a[l]; u = max(a, l, m); v = max(a, m+1, r); if (u > v) return u; else return v; } Data Structure and Algorithm 10 Find max- Divide and Conquer Tìm số lớn – theo cách chia trị 317 3 2 3 Item max(Item a[], int l, int r) { Item u, v; int m = (l+r)/2; if (l == r) return a[l]; u = max(a, l, m); v = max(a, m+1, r); if (u > v) return u; else return v; } Data Structure and Algorithm 11 Find max- Divide and Conquer Tìm số lớn – theo cách chia trị 317 3 2 3 Item max(Item a[], int l, int r) { Item u, v; int m = (l+r)/2; if (l == r) return a[l]; u = max(a, l, m); v = max(a, m+1, r); if (u > v) return u; else return v; } Data Structure and Algorithm 12 Find max- Divide and Conquer Tìm số lớn – theo cách chia trị 317 3 2 3 10 Item max(Item a[], int l, int r) { Item u, v; int m = (l+r)/2; if (l == r) return a[l]; u = max(a, l, m); v = max(a, m+1, r); if (u > v) return u; else return v; } Data Structure and Algorithm 13 Find max- Divide and Conquer Tìm số lớn – theo cách chia trị 317 3 2 3 10 11 12 7 Item max(Item a[], int l, int r) { Item u, v; int m = (l+r)/2; if (l == r) return a[l]; u = max(a, l, m); v = max(a, m+1, r); if (u > v) return u; else return v; } Data Structure and Algorithm 14 Find max- Divide and Conquer Tìm số lớn – theo cách chia trị 317 13 3 2 3 10 11 12 7 Item max(Item a[], int l, int r) { Item u, v; int m = (l+r)/2; if (l == r) return a[l]; u = max(a, l, m); v = max(a, m+1, r); if (u > v) return u; else return v; } Data Structure and Algorithm 15 Find max- Divide and Conquer Tìm số lớn – theo cách chia trị 1 317 13 3 2 3 10 11 12 7 Item max(Item a[], int l, int r) { Item u, v; int m = (l+r)/2; if (l == r) return a[l]; u = max(a, l, m); v = max(a, m+1, r); if (u > v) return u; else return v; } Data Structure and Algorithm 16 Dynamic programming Qui hoạch động • • Các thuật tốn đệ quy có ưu điểm dễ cài đặt, nhiên chất trình đệ quy, chương trình thường kéo theo địi hỏi lớn khơng gian nhớ khối lượng tính tốn khổng lồ Quy hoạch động (Dynamic programming) kỹ thuật nhằm đơn giản hóa việc tính tốn cơng thức truy hồi cách lưu trữ tồn hay phần kết tính tốn bước với mục đích sử dụng lại Data Structure and Algorithm 17 Dynamic programming Qui hoạch động • • • Bản chất quy hoạch động thay mơ hình tính tốn “từ xuống” (Top-down) mơ hình tính tốn “từ lên” (Bottom-up) Từ “programming” khơng liên quan tới việc lập trình cho máy tính, thuật ngữ mà nhà toán học hay dùng để bước chung việc giải dạng toán hay lớp vấn đề Khơng có thuật toán tổng quát để giải tất toán quy hoạch động Data Structure and Algorithm 18 Dynamic programming Qui hoạch động • • Phép phân giải đệ quy toán lớn phân rã thành nhiều toán giải toán Việc giải tốn lại đưa phép phân rã tiếp thành nhiều toán nhỏ lại giải tiếp tốn nhỏ giải hay chưa Quy hoạch động việc giải tất toán nhỏ ( toán sở) để từ bước giải tốn lớn hơn, giải toán lớn (bài toán ban đầu) Data Structure and Algorithm 19 Dynamic programming Knapsack problem - Bài tốn Cái túi • Trong siêu thị có n gói hàng, gói hàng có trọng lượng khác W[i], có giá trị khác V[i] Một tên trộm đột nhập vào siêu thị, tên trộm mang theo túi mang tối đa trọng lượng M • Hỏi tên trộm lấy gói hàng để tổng giá trị lớn • Knapsack problem Given » N types of items of varying size and value » One knapsack (belongs to a thief!) Data Structure and Algorithm Find: the combination of items that maximize the total value 20 Dynamic programming Knapsack problem - Bài toán Cái túi Nếu gọi F[i, j] giá trị lớn có cách chọn gói {1, 2, …, i} với giới hạn trọng lượng j Thì giá trị lớn chọn số n gói với giới hạn trọng lượng M F[n, M] Data Structure and Algorithm 21 Dynamic programming Knapsack problem - Bài toán Cái túi Với giới hạn trọng lượng j, việc chọn tối ưu số gói {1, 2, …, i - 1, i} để có giá trị lớn có hai khả năng: a Nếu khơng chọn gói thứ i F[i, j] giá trị lớn cách chọn số gói {1, 2, …, i - 1} với giới hạn trọng lượng j Tức F[i, j] = F[i - 1, j] Data Structure and Algorithm 22 Dynamic programming Knapsack problem - Bài tốn Cái túi b Nếu có chọn gói thứ i (chỉ xét tới trường hợp mà W[i] ≤ j) F[i, j] giá trị gói thứ i V[i] cộng với giá trị lớn có cách chọn số gói {1, 2, …, i - 1} với giới hạn trọng lượng j - W[i] Tức mặt giá trị thu được: F[i, j] = V[i] + F[i - 1, j - W[i]] Vì theo cách xây dựng F[i, j] giá trị lớn có thể, nên F[i, j] max giá trị thu Data Structure and Algorithm 23 Dynamic programming Knapsack problem - Bài toán Cái túi Knapsack size: 17 Item A B C D E Size Val 10 11 13 int knap(int cap) { int i, space, max, t; for (i = 0, max = 0; i < N; i++) if ((space = cap - items[i].size) >= 0) if ((t = knap(space) + items[i].val) > max) max = t; return max; } int knap(int M) { int i, space, max, maxi, t; if (maxKnown[M] != unknown) return maxKnown[M]; for (i = 0, max = 0; i < N; i++) if ((space = M-items[i].size) >= 0) if ((t = knap(space) + items[i].val) > max) { max = t; maxi = i; } maxKnown[M] = max; itemKnown[M] = items[maxi]; return max; } Data Structure and Algorithm 24 Discussion – Câu hỏi • https://sites.google.com/site/daonamanhedu/datastructure-algorithm Data Structure and Algorithm 25 ... Qui hoạch động • • Phép phân giải đệ quy toán lớn phân rã thành nhiều toán giải tốn Việc giải toán lại đưa phép phân rã tiếp thành nhiều toán nhỏ lại giải tiếp tốn nhỏ giải hay chưa Quy hoạch động. .. máy tính, thuật ngữ mà nhà toán học hay dùng để bước chung việc giải dạng toán hay lớp vấn đề Khơng có thuật tốn tổng qt để giải tất toán quy hoạch động Data Structure and Algorithm 18 Dynamic programming... (Parts 1-5 Bundle)- Third Edition by Robert Sedgewick, Addison-Wesley • • Cấu trúc liệu giải thuật, Đinh Mạnh Tường Giải thuật lập trình, Lê Minh Hoàng, Đại Học Sư Phạm, 2002 Data Structure and