1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Phân tích thiết kế giải thuật Dynamic Programming (tiếp) GV. Hà Đại Dương

18 241 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

Bài giảng gồm các bài tập minh họa cho phương pháp Qui hoạch động bài toán tìm xâu con chung dài nhất, đường đi ngắn nhất Thuật toán Floyd và bài toán cây nhị phân tìm kiếm tối ưu. Tài liệu hữu ích dành cho các bạn sinh viên ngành Công nghệ thông tin. Mời các bạn cùng tham khảo.

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

Ngày đăng: 16/05/2017, 15:36

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN