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