Giáo trình Thiết kế & Đánh giá thuật toán - Bài giảng 10: Lập trình động - Lê Nguyên Khôi

Kiểm tra tất cả các dãy con của x[1 . . m] xem có phải dãy con của y[1 . . n] không Phân tích Kiểm tra = 0 (n) cho mỗi dãy con. Có 2^m dãy con của x. Thời gian chạy xấu nhất = 0 (n2m), thời gian hàm mũ.

pdf22 trang | Chia sẻ: thucuc2301 | Lượt xem: 577 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Giáo trình Thiết kế & Đánh giá thuật toán - Bài giảng 10: Lập trình động - Lê Nguyên Khôi, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Thiết Kế & Đánh Giá Thuật Toán Lập Trình Động TS. Lê Nguyên Khôi Trường Đại Học Công Nghệ - ĐHQGHN Nội Dung  Kỹ thuật thiết kế dưới lên (bottom-up)  Một số bài toán tiêu biểu 1 Chia Để Trị - Nhắc Lại  Kỹ thuật thiết kế thuật toán  Ý tưởng  Thiết kế trên xuống (top-down design)  Chia bài toán lớn thành bài toán nhỏ không giao nhau  Giải các bài toán nhỏ (theo phương pháp đệ quy)  Gộp lời giải bài toán nhỏ thành lời giải bài toán lớn  Ví dụ  Sắp xếp gộp (merge sort)  Sắp xếp nhanh (quick sort)  Tính số Fibonacci 2 Lập Trình Động  Kỹ thuật thiết kế thuật toán  Ý tưởng  Thiết kế dưới lên (bottom-up design)  Lần lượt giải bài toán từ nhỏ nhất đến lớn  Xây dựng lời giải bài toán lớn dựa trên lời giải bài toán nhỏ  Ví dụ  Sắp xếp chèn (insertion sort)  Tính số Fibonacci 3 Lập Trình Động  Bài toán có tính chất  Các bài toán con gối nhau (overlapping)  Cấu trúc con tối ưu (optimal structure) Lời giải tối ưu của bài toán con có thể sử dụng để xây dựng lời giải tối ưu cho bài toán toàn cục 4 Lập Trình Động  Áp dụng cho bài toán tối ưu  Có nhiều lời giải khả thi Mỗi lời giải có giá trị đặc trưng  Tìm lời giải có giá trị đặc trưng tối ưu  Có thể có nhiều lời giải có cùng giá trị đặc trưng tối ưu  Thiết kế cấu trúc (bảng) để lưu kết quả 5 Lập Trình Động  Dựa trên các bước sau 1. Đưa ra cách tính nghiệm của các bài toán con 2. Tìm công thức xây dựng nghiệm của bài toán thông qua nghiệm của các bài toán con 3. Thiết kế bảng để lưu nghiệm của các bài toán 4. Tính nghiệm của các bài toán từ nhỏ đến lớn 5. Xây dựng nghiệm của bài toán cần tìm từ bảng 6 Chia Để Trị – Lập Trình Động  Lựa chọn đúng kỹ thuật rất quan trọng  Áp dụng chia để trị cho bài toán mà bài toán con gối nhau  Giải lại các bài toán con  Không hiệu quả  Ví dụ: tính số Fibonacci 7 Bài Toán  Dãy Fibonacci  Hệ số nhị thức  Dãy con tăng dài nhất  Bài toán ba lô  Dãy con chung dài nhất  Cắt dây 8 Dãy Fibonacci  =   = 0,1 +  ≥ 2  Chia để trị  Bài toán con có giao nhau  Lập trình động  Bảng lưu kết quả các giá trị  đã tính 9 Hệ Số Nhị Thức  ,  =  =  − 1  − 1 +  − 1   Chia để trị  Bài toán con có giao nhau  Lập trình động  Bảng lưu kết quả các giá trị  ,  đã tính 10 Dãy Con Tăng Dài Nhất  Tìm dãy con tăng dài nhất của dãy số S  Ví dụ  S = { 14, 1, 17, 2, 16, 17, 3, 15, 4, 1, 5, 18, 13, 6, 7, 19, 8, 12, 1, 9, 10, 8 }  Dãy tăng S’ = { 14, 1, 17, 2, 16, 17, 3, 15, 4, 1, 5, 18, 13, 6, 7, 19, 8, 12, 1, 9, 10, 8 }  Dãy tăng dài nhất S = { 14, 1, 17, 2, 16, 17, 3, 15, 4, 1, 5, 18, 13, 6, 7, 19, 8, 12, 1, 9, 10, 8 } 11 Dãy Con Tăng Dài Nhất  Bài toán con: Tìm dãy con tăng dài nhất kết thúc tại phần tử thứ k  Thuật toán  Nếu tất cả các phần tử trước k đều lớn hơn hoặc bằng S[k], trả về dãy con chỉ chứa S[k]  Nếu có t phần tử đứng trước k nhỏ hơn S[k], gọi W là dãy dài nhất trong các dãy con tăng kết thúc tại các phần tử này. Trả về W ∪ S[k] 12 s1 14 {14} s2 1 {1} s3 17 {14|1, 17} s4 2 {1, 2} s5 16 s6 17 s7 3 s8 15 s9 4 s10 1 s11 5 s12 18 s13 13 s14 6 s15 7 s16 19 s17 8 s18 12 s19 1 s20 9 s21 10 s22 8 Dãy Con Tăng Dài Nhất S = { 14, 1, 17, 2, 16, 17, 3, 15, 4, 1, 5, 18, 13, 6, 7, 19, 8, 12, 1, 9, 10, 8 } Sử dụng tất cả các Si đã được xây dựng để tiếp tục xây dựng Sj 13 s1 14 {14} s2 1 {1} s3 17 {14|1, 17} s4 2 {1, 2} s5 16 {1, 2, 16} s6 17 {1, 2, 16, 17} s7 3 {1, 2, 3} s8 15 {1, 2, 3, 15} s9 4 {1, 2, 3, 4} s10 1 {1} s11 5 {1, 2, 3, 4, 5} s12 18 {1, 2, 3, 4, 5, 18} s13 13 {1, 2, 3, 4, 5, 13} s14 6 {1, 2, 3, 4, 5, 6} s15 7 {1, 2, 3, 4, 5, 6, 7} s16 19 {1, 2, 3, 4, 5, 6, 7, 19} s17 8 {1, 2, 3, 4, 5, 6, 7, 8} s18 12 {1, 2, 3, 4, 5, 6, 7, 8, 12} s19 1 {1} s20 9 {1, 2, 3, 4, 5, 6, 7, 8, 9} s21 10 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} s22 8 {1, 2, 3, 4, 5, 6, 7, 8} Dãy Con Tăng Dài Nhất S = { 14, 1, 17, 2, 16, 17, 3, 15, 4, 1, 5, 18, 13, 6, 7, 19, 8, 12, 1, 9, 10, 8 } Sử dụng tất cả các Si đã được xây dựng để tiếp tục xây dựng Sj 14 Ba Lô Có N đồ vật, đồ vật i có khối lượng wi và giá trị ti 1 chiếc ba lô có thể mang được không quá M kg Tìm cách mang một số đồ vật để tổng giá trị lấy được là lớn nhất. Ví dụ N = 5, M = 10 i A B C D E wi 1 3 5 7 9 ti $100 $200 $301 $400 $500 15 Ba Lô for mọi ô [x, y] if x = 0 và y = 0 then cell[x, y] = 0kg $0 {} else gọi m là đồ vật thêm vào ở cột y gọi w là khối lượng của m if w > khối lượng cực đại của hàng cell[x, y] = cell[x, y-1] else cell[x, y] = max {cell[x, y-1], (cell[x-w, y-1] U {m})} 16 tập rỗng A A/B A/B/C A/B/C/D A/B/C/D/E kg ≤0 0kg $0 {} 0kg $0 {} 0kg $0 {} ?kg $? {} ?kg $? {} ?kg $? {} kg ≤1 0kg $0 {} 1kg $100 {A} 1kg $100 {A} ?kg $? {} ?kg $? {} ?kg $? {} kg ≤2 0kg $0 {} 1kg $100 {A} 1kg $100 {A} ?kg $? {} ?kg $? {} ?kg $? {} kg ≤3 0kg $0 {} 1kg $100 {A} 3kg $200 {B} ?kg $? {} ?kg $? {} ?kg $? {} kg ≤4 0kg $0 {} 1kg $100 {A} 4kg $300 {A, B} ?kg $? {} ?kg $? {} ?kg $? {} kg ≤5 0kg $0 {} 1kg $100 {A} ?kg $? {} ?kg $? {} ?kg $? {} ?kg $? {} kg ≤6 0kg $0 {} 1kg $100 {A} ?kg $? {} ?kg $? {} ?kg $? {} ?kg $? {} kg ≤7 0kg $0 {} 1kg $100 {A} ?kg $? {} ?kg $? {} ?kg $? {} ?kg $? {} kg ≤8 0kg $0 {} 1kg $100 {A} ?kg $? {} ?kg $? {} ?kg $? {} ?kg $? {} kg ≤9 0kg $0 {} 1kg $100 {A} ?kg $? {} ?kg $? {} ?kg $? {} ?kg $? {} kg ≤10 0kg $0 {} 1kg $100 {A} ?kg $? {} ?kg $? {} ?kg $? {} ?kg $? {} Đồ vật Khối lượng Giá trị A 1kg $100 B 3kg $200 C 5kg $301 D 7kg $400 E 9kg $500 Ba Lô for mọi ô [x, y] if x = 0 và y = 0 then cell[x, y] = 0kg $0 {} else gọi m là đồ vật thêm vào ở cột y gọi w là khối lượng của m if w > khối lượng cực đại của hàng cell[x, y] = cell[x, y-1] else cell[x, y] = max {cell[x, y-1], (cell[x-w, y-1] U {m})} 17 Đồ vật Khối lượng Giá trị A 1kg $100 B 3kg $200 C 5kg $301 D 7kg $400 E 9kg $500 tập rỗng A A/B A/B/C A/B/C/D A/B/C/D/E kg ≤0 0kg $0 {} 0kg $0 {} 0kg $0 {} 0kg $0 {} 0kg $0 {} 0kg $0 {} kg ≤1 0kg $0 {} 1kg $100 {A} 1kg $100 {A} 1kg $100 {A} 1kg $100 {A} 1kg $100 {A} kg ≤2 0kg $0 {} 1kg $100 {A} 1kg $100 {A} 1kg $100 {A} 1kg $100 {A} 1kg $100 {A} kg ≤3 0kg $0 {} 1kg $100 {A} 3kg $200 {B} 3kg $200 {B} 3kg $200 {B} 3kg $200 {B} kg ≤4 0kg $0 {} 1kg $100 {A} 4kg $300 {A, B} 4kg $300 {A, B} 4kg $300 {A, B} 4kg $300 {A, B} kg ≤5 0kg $0 {} 1kg $100 {A} 4kg $300 {A, B} 5kg $301 {C} 5kg $301 {C} 5kg $301 {C} kg ≤6 0kg $0 {} 1kg $100 {A} 4kg $300 {A, B} 6kg $401 {A,C} 6kg $401 {A,C} 6kg $401 {A,C} kg ≤7 0kg $0 {} 1kg $100 {A} 4kg $300 {A, B} 6kg $401 {A,C} 6kg $401 {A,C} 6kg $401 {A,C} kg ≤8 0kg $0 {} 1kg $100 {A} 4kg $300 {A, B} 8kg $501 {B,C} 8kg $501 {B,C} 8kg $501 {B,C} kg ≤9 0kg $0 {} 1kg $100 {A} 4kg $300 {A, B} 9kg $601 {A, B, C} 9kg $601 {A, B, C} 9kg $601 {A, B, C} kg ≤10 0kg $0 {} 1kg $100 {A} 4kg $300 {A, B} 9kg $601 {A, B, C} 9kg $601 {A, B, C} 9kg $601 {A, B, C} Dãy Con Chung Dài Nhất Cho 2 dãy [1 . . ] và [1 . . ], tìm dãy con chung dài nhất của chúng. : A B C B D A B : B D C A B A Dãy con chung: ? AB ? BCDB ? BCBA 18 Dãy Con Chung Dài Nhất Cho 2 dãy [1 . . ] và [1 . . ], tìm dãy con chung dài nhất của chúng. : A B C B D A B : B D C A B A LCS(, ) = BCBA 19 Dãy Con Chung Dài Nhất  Kiểm tra tất cả các dãy con của [1 . . ] xem có phải dãy con của [1 . . ] không  Phân tích  Kiểm tra =   cho mỗi dãy con.  Có 2 dãy con của .  Thời gian chạy xấu nhất =  2 , thời gian hàm mũ. 20 Cắt Dây  Đọc Mục 15.1 Tr.360 21

Các file đính kèm theo tài liệu này:

  • pdfthiet_ke_danh_gia_thuat_toanbaigiang10_laptrinhdong_4172_2032097.pdf