Bài giảng Phân tích và thiết kế thuật toán - Bài 10: Dynamic Programming (Part 2)

pdf 18 trang phuongnguyen 4071
Bạn đang xem tài liệu "Bài giảng Phân tích và thiết kế thuật toán - Bài 10: Dynamic Programming (Part 2)", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_phan_tich_va_thiet_ke_thuat_toan_bai_10_dynamic_pr.pdf

Nội dung text: Bài giảng Phân tích và thiết kế thuật toán - Bài 10: Dynamic Programming (Part 2)

  1. 2/2/2017 Analysis and Design of Algorithms Lecture 9,10 Dynamic Programming Lecturer: Ha Dai Duong duonghd@mta.edu.vn 2/2/2017 1 Nội dung 1. Lược đồ chung 2. Bài toán tính số Fibonaci 3. Bài toán cái túi 4. Bài toán dãy con có tổng lớn nhất 5. Bài toán tìm xâu con chung dài nhất 6. Đường đi ngắn nhất - TT Floyd 7. Cây nhị phân tìm kiếm tối ưu 2/2/2017 2 Bài toán • Cho hai xâu X = (x1,x2, ,xm) và Y = (y1,y2, ,yn) • Hãy tìm xâu con chung dài nhất của hai dãy X và Y. • Ví dụ X = KHOA HOC HOA HO Y = HOA HONG 2/2/2017 3 1
  2. 2/2/2017 Ý tưởng thuật toán • Phân rã: – m: chiều dài xâu X, n: chiều dài xâu Y – Với mỗi 0≤ i ≤ m và 0 ≤ j ≤ n gọi C[i, j] là độ dài của dãy con chung dài nhất của hai dãy Xi=x1x2 xi và Yj =y1y2 yj (Qui ước X0 = rỗng, Y0= rỗng) – Khi đó C[m,n] là chiều dài xâu con chung dài nhất của X và Y. • Bài toán con: C[0,j]=0 j=1 n, C[i,0] = 0 i=1 m 2/2/2017 4 Tổng hợp • Với i > 0, j > 0 tính C[i, j] – Nếu xi = yj thì dãy con chung dài nhất của Xi và Yj sẽ thu được bằng việc bổ sung xi (cũng là yj) vào dãy con chung dài nhất của hai dãy Xi-1 và Yj-1 C[i,j] = C[i-1,j-1]+1 – Nếu xi ≠ yj thì dãy con chung dài nhất của Xi và Yj sẽ là dãy con dài hơn trong hai dãy con chung dài nhất của (Xi 1 và Yj) và của (Xi và Yj 1) C[i,j] = Max{C[i-1,j], C[i,j-1]} 2/2/2017 5 Cài đặt Procedure LCS(X,Y) { For i =1 to m do c[i,0]=0; For j =1 to n do c[0,j ]=0; For i =1 to m do for j = 1 to n do If xi = yj then { c[i,j]=c[i-1,j-1]+1; b[i,j]=’’ } else If c [i-1,j]≥ c[i,j-1] then { c[i,j]=c[i-1,j]; b[i,j]=’’;} else { c[i,j]=c[i,j-1]; b[i,j]=’’;} } 2/2/2017 6 2
  3. 2/2/2017 Minh họa • X= KHOAHOC, Y= HOAHONG K H O A H O C H O A H O N G 2/2/2017 7 Khởi tạo • Y= KHOAHOC, X= HOAHONG K H O A H O C 0 0 0 0 0 0 0 0 H 0 O 0 A 0 H 0 O 0 N 0 G 0 2/2/2017 8 Lặp • X= KHOAHOC, Y= HOAHONG K H O A H O C 0 0 0 0 0 0 0 0 H 0 0 O 0 A 0 H 0 O 0 N 0 G 0 2/2/2017 9 3
  4. 2/2/2017 Lặp • X= KHOAHOC, Y= HOAHONG K H O A H O C 0 0 0 0 0 0 0 0 H 0 0 1 O 0 A 0 H 0 O 0 N 0 G 0 2/2/2017 10 Lặp • X= KHOAHOC, Y= HOAHONG K H O A H O C 0 0 0 0 0 0 0 0 H 0 0 1 ? O 0 A 0 H 0 O 0 N 0 G 0 2/2/2017 11 Lặp • X= KHOAHOC, Y= HOAHONG K H O A H O C 0 0 0 0 0 0 0 0 H 0 0 1 1 O 0 A 0 H 0 O 0 N 0 G 0 2/2/2017 12 4
  5. 2/2/2017 Lặp • X= KHOAHOC, Y= HOAHONG K H O A H O C 0 0 0 0 0 0 0 0 H 0 0 1 1 1 1 1 1 O 0 A 0 H 0 O 0 N 0 G 0 2/2/2017 13 Lặp • X= KHOAHOC, Y= HOAHONG K H O A H O C 0 0 0 0 0 0 0 0 H 0 0 1 1 1 1 1 1 O 0 0 A 0 H 0 O 0 N 0 G 0 2/2/2017 14 Lặp • X= KHOAHOC, Y= HOAHONG K H O A H O C 0 0 0 0 0 0 0 0 H 0 0 1 1 1 1 1 1 O 0 0 ? A 0 H 0 O 0 N 0 G 0 2/2/2017 15 5
  6. 2/2/2017 Lặp • X= KHOAHOC, Y= HOAHONG K H O A H O C 0 0 0 0 0 0 0 0 H 0 0 1 1 1 1 1 1 O 0 0 1 A 0 H 0 O 0 N 0 G 0 2/2/2017 16 Lặp • X= KHOAHOC, Y= HOAHONG K H O A H O C 0 0 0 0 0 0 0 0 H 0 0 1 1 1 1 1 1 O 0 0 1 2 A 0 H 0 O 0 N 0 G 0 2/2/2017 17 Kết thúc • X= KHOAHOC, Y= HOAHONG K H O A H O C 0 0 0 0 0 0 0 0 H 0 0 1 1 1 1 1 1 O 0 0 1 2 2 2 2 2 A 0 0 1 2 3 3 3 3 H 0 0 1 2 3 4 4 4 O 0 0 1 2 3 4 5 5 N 0 0 1 2 3 4 5 5 G 0 0 1 2 3 4 5 5 2/2/2017 18 6
  7. 2/2/2017 Kết thúc • X= KHOAHOC, Y= HOAHONG K H O A H O C 0 0 0 0 0 0 0 0 H 0 0 1 1 1 1 1 1 O 0 0 1 2 2 2 2 2 A 0 0 1 2 3 3 3 3 H 0 0 1 2 3 4 4 4 O 0 0 1 2 3 4 5 5 N 0 0 1 2 3 4 5 5 G 0 0 1 2 3 4 5 5 2/2/2017 19 Nội dung 1. Lược đồ chung 2. Bài toán tính số Fibonaci 3. Bài toán cái túi 4. Bài toán dãy con có tổng lớn nhất 5. Bài toán tìm xâu con chung dài nhất 6. Đường đi ngắn nhất - TT Floyd 7. Cây nhị phân tìm kiếm tối ưu 2/2/2017 20 Bài toán • Đồ thị G=(V,E) – Đơn đồ thị liên thông (vô hướng hoặc có hướng) – Có trọng số. – V: Tập đỉnh – E: Tập cạnh • Tìm đường đi ngắn nhất từ giữa một cặp đỉnh nào đó của G. 2/2/2017 21 7
  8. 2/2/2017 Thuật toán Floyd • Tư tưởng: – Nếu k nằm trên đường đi ngắn nhất từ i đến j thì đường đi từ i đến k và từ k đến j cũng ngắn nhất (Nguyên lý Bellman). • Phân rã: – n là số đỉnh của G – Gọi d[i,j] là đường đi ngắn nhất từ đỉnh i đến đỉnh j – Qui ước pk[i,j] với (k=0 n) lưu giá trị từ 0 k (đỉnh) thể hiện đường đi ngắn nhất từ i đến j có qua đỉnh pk[i,j] 2/2/2017 22 Thuật toán Floyd • Phân rã: – n là số đỉnh của G, d[i,j], pk[i,j] – pk[i,j] = 0 đường đi ngắn nhất từ i đến j không đi qua pk[i,j], – pk[i,j] !=0 đường đi ngắn nhất từ i đến j đi qua pk[i,j] – Khi k = n thì pk[i,j] cho biết đường đi cần tìm. • Bài toán con: – d[i,j] = a[i,j] – p0[i,j] = 0 2/2/2017 23 Tổng hợp • Nếu d[i,j] là đường đi ngắn nhất từ i đến j đã xét ở bước k-1 (đã xét đi qua từ đỉnh 1 đến đỉnh k-1). • Ở bước k: d[i,j] = min (d[i,j], d[i,k]+d[k,j]) 2/2/2017 24 8
  9. 2/2/2017 Cài đặt • Biểu diễn đồ thị G qua ma trận trọng số cạnh • Khởi tạo d[i,j] = a[i, j] p[i,j] = 0 2/2/2017 25 2/2/2017 26 Minh họa 2/2/2017 27 9
  10. 2/2/2017 Khởi tạo 2/2/2017 28 Với k = 1 2/2/2017 29 Với K = 2 2/2/2017 30 10
  11. 2/2/2017 Với K = 3 2/2/2017 31 Với K = 4 2/2/2017 32 Kết quả Đường đi từ 1->3 ? p[1,3] = 4 Đường đi từ 1->4 ? p[1,4] = 2 Đường đi từ 1->3: 1 -> 2 -> 4 -> 3 (15) 2/2/2017 33 11
  12. 2/2/2017 Nội dung 1. Lược đồ chung 2. Bài toán tính số Fibonaci 3. Bài toán cái túi 4. Bài toán dãy con có tổng lớn nhất 5. Bài toán tìm xâu con chung dài nhất 6. Đường đi ngắn nhất - TT Floyd 7. Cây nhị phân tìm kiếm tối ưu 2/2/2017 34 Cây nhị phân tìm kiếm • Cây nhị phân tìm kiếm (binary search tree) là một cây nhị phân có tính chất sau: – Mỗi nút là một khóa tìm kiếm – Với mỗi cây con, khóa của nút gốc lớn hơn khóa của mọi nút của cây con trái và nhỏ hơn khóa của mọi nút của cây con phải • Ví dụ 2/2/2017 35 Cây nhị phân tìm kiếm • Nếu số lần tìm kiếm (tần xuất) các khóa trên cây là như nhau? Cấu trúc của cây không quan trọng 2/2/2017 36 12
  13. 2/2/2017 Cây nhị phân tìm kiếm • Số lần tìm kiếm các khóa khác nhau: Số lần duyệt qua nút có khóa là: (4) : 1+5+3 +4 + 2+3 = 18 (2) : 1+5+3 = 9 (6) : 2+3 = 5 (1) : 1 = 1 (3) : 3 = 3 (5) : 2 = 2 Cấu trúc cây Tổng = 38 2/2/2017quan trọng 37 Cây nhị phân tìm kiếm tối ưu • Vậy cấu trúc nào để cây nhị phân tìm kiếm có số lần duyệt nhỏ nhất (tối ưu)? 2/2/2017 38 Bài toán • Cho mảng A[1,2, ,n] đã sắp xếp theo chiều tăng dần trong đó các phần tử đôi một khác nhau. Mỗi phần tử A[i] có tần số tìm kiếm f[i] (i=1 n). • Tìm cây nhị phân với khóa là các phần tử của mảng A sao cho tổng số lượng các phép so sánh là nhỏ nhất 2/2/2017 39 13
  14. 2/2/2017 Tiếp cận bằng QHD (4) : 1+5+3 +4 + 2+3 = 18 • Nhận xét: Số lần duyệt ở gốc không phụ thuộc vào cấu trúc cây và SumF(n)= f[1]+f[2]+ +f[n] 2/2/2017 40 Phân rã • Gọi Op(1 n) là số phép so sánh của cây nhị phân tìm kiếm tối ưu của mảng A[1 n]. Nếu A[r] là khóa của nút gốc, ta có: Op(1 n) = Op(1 r-1) + Op(r+1 n) + SumF(1 n) (SumF(1 n)= f[1]+f[2]+ +f[n]) Vì Op(1 n) là tối ưu nên ta có Op(1 n) = min {Op(1 r-1) + Op(r+1 n): r=1 n} + SumF(1 n) 2/2/2017 41 Phân rã • Gọi C[i,j] là số phép so sánh của cây nhị phân tìm kiếm tối ưu cho mảng con A[i j] • Đặt F[i,j] = f[i]+f[i+1]+ +f[j]) • Ta có C[i,j] = min{C[i,r-1] + C[r+1,j]: r=i j} + F[i,j] 2/2/2017 42 14
  15. 2/2/2017 Tiếp cận bằng QHD • Bài toán con C[i,i] = F[i,i] • Tổng hợp: C[i,j] = min{C[i,r-1] + C[r+1,j]} + F[i,j] 2/2/2017 43 Tính F[i,j] • Hàm Tính F[i,j] 2/2/2017 44 Tính C[i,j] • Hàm Tính C[i,j] = min{C[i,r-1] + C[r+1,j]} + F[i,j] 2/2/2017 45 15
  16. 2/2/2017 Thuật toán 2/2/2017 46 Độ phức tạp tính toán • Hàm Là O(n2) • Hàm Là O(n) • Hàm Là O(n3) 2/2/2017 47 Mảng R[i,j] • Mảng R[i,j] trong thuật toán trên lưu lại gốc của cây nhị phân tìm kiếm tối ưu của mảng con A[i j]. • Mảng R[i,j] có thể được sử dụng để truy vết để tìm ra cây nhị phân tìm kiếm tối ưu (bài tập) 2/2/2017 48 16
  17. 2/2/2017 Bài tập 1. Thực hiện và ghi kết quả từng bước thuật toán tìm xâu con dài nhất của 2 xâu: TOANHOC và KHONHOC 2. Thực hiện và ghi kết quả từng bước thuật toán tìm xâu con dài nhất của 2 xâu: TINHYEU va HOAHONG 2/2/2017 49 Bài tập 3. Thực hiện và ghi kết quả tường bước thuật toán Floyd tìm đường đi ngắn nhất trên đồ thị sau: 2/2/2017 50 Bài tập 4. Cài đặt thuật toán tìm xâu con dài nhất của 2 xâu ký tự. Đánh giá độ phức tạp bằng thực nghiệm và so sánh với lý thuyết. 5. Cài đặt thuật toán Floyd tìm đường đi ngắn nhất trên đồ thị. Đánh giá độ phức tạp bằng thực nghiệm và so sánh với lý thuyết. 6. Cài đặt thuật toán xây dựng cây tìm kiếm nhị phân tối ưu. Đánh giá độ phức tạp bằng thực nghiệm và so sánh với lý thuyết. 2/2/2017 51 17
  18. 2/2/2017 Nội dung đã học 1. Lược đồ chung 2. Bài toán tính số Fibonaci 3. Bài toán cái túi 4. Bài toán dãy con có tổng lớn nhất 5. Bài toán tìm xâu con chung dài nhất 6. Đường đi ngắn nhất - TT Floyd 7. Cây nhị phân tìm kiếm tối ưu 2/2/2017 52 18