cau truc du lieu, thuat toan, Kỹ thuật Chia để trị (Divide and Conquer) Kỹ thuật Tham ăn Háu ănTham lam (Greedy) Kỹ thuật Nhánh cận (Branch and Bound) Kỹ thuật Quy hoạch động (Dynamic Programming) Kỹ thuật Tìm kiếm địa phương (Local Search) Kỹ thuật Cắt tỉa alphabeta (AlphaBeta Pruning) trên Cây trò chơi Lỗi thiết kế có thể phải trả giá đắt nếu không được phát hiện và điều chỉnh sớm trong qua trình phát triển phần mềm. Theo báo cáo của Boehm và Papaccio (1988) ước lượng chi phí cho sửa lỗi phần mềm như sau: Kỹ thuật Chia để trị (Divide and Conquer) Kỹ thuật Tham ăn Háu ănTham lam (Greedy) Kỹ thuật Nhánh cận (Branch and Bound) Kỹ thuật Quy hoạch động (Dynamic Programming) Kỹ thuật Tìm kiếm địa phương (Local Search) Kỹ thuật Cắt tỉa alphabeta (AlphaBeta Pruning) trên Cây trò chơi Yêu cầu: Cần phải giải bài toán có kích thước n. Phương pháp: Chia bài toán ban đầu thành một số bài toán con đồng dạng với bài toán ban đầu có kích thước < n. Giải các bài toán con được các lời giải con Tổng hợp lời giải con lời giải bài toán ban đầu. Chú ý : Đối với từng bài toán con: chia chúng thành các bài toán con nhỏ hơn nữa. Quá trình phân chia dừng lại khi kích thước bài toán đủ nhỏ để giải dễ dàng: bài toán cơ sở. QuickSort: Sắp xếp mảng n số theo thứ tự tăng dần Áp dụng kỹ thuật chia để trị: Chia mảng n số thành 2 mảng con: Trước khi chia phải phân hoạch Giải 2 bài toán con: Sắp xếp mảng “bên trái” Sắp xếp mảng “bên phải” . Bài toán cơ sở: Sắp xếp mảng 1 số hoặc nhiều số có giá trị giống nhau. Tổng hợp kết quả : Không cần tổng hợp, đã bao hàm trong giai đoạn phân chia. Trường hợp xấu nhất: Mảng n số đúng thứ tự tăng dần Phân hoạch lệch: phần tử chốt có giá trị lớn nhất (cần n phép so sánh để biết nó là phần tử cuối cùng) Độ phức tạp : O(n2) Trường hợp tốt nhất: Phân hoạch cân bằng: phần tử chốt là phần tử giữa mảng (C(n) = 2 C(n2) + n) Độ phức tạp : O(nlogn) Trường hợp trung bình : Độ phức tạp : O(nlogn)
CHƯƠNG KỸ THUẬT THIẾT KẾ THUẬT TỐN Bộ mơn CƠNG NGHỆ PHẦN MỀM Khoa Cơng nghệ thơng tin Truyền thông Đại học Cần Thơ Võ Huỳnh Trâm Mục tiêu • Biết kỹ thuật thiết kế thuật toán: từ ý tưởng thuật toán chi tiết • Hiểu rõ nguyên lý kỹ thuật phân tích thiết kế thuật tốn • Vận dụng kỹ thuật phân tích thiết kế để giải tốn thực tế: tốn dạng áp dụng kỹ thuật Mơ hình từ tốn đến chương trình Thiết kế Lập trình Đánh giá Bài toán thực tế thuật toán Kỹ thuật thiết kế thuật toán: Chia để trị, quy hoạch động, … #include … Thuật tốntốt Kỹ thuật phân tích đánh giá thuật tốn: •Độ phức tạp thuật tốn •Cải tiến GT Chương trình Ngơn ngữ lập trình: •PASCAL, C/C++, JAVA, … Hậu sai sót • Lỗi thiết kế phải trả giá đắt khơng phát điều chỉnh sớm qua trình phát triển phần mềm • Theo báo cáo Boehm Papaccio (1988) ước lượng chi phí cho sửa lỗi phần mềm sau: Một số kỹ thuật thiết kế thuật tốn • • • • • • Kỹ thuật Chia để trị (Divide and Conquer) Kỹ thuật Tham ăn /Háu ăn/Tham lam (Greedy) Kỹ thuật Nhánh cận (Branch and Bound) Kỹ thuật Quy hoạch động (Dynamic Programming) Kỹ thuật Tìm kiếm địa phương (Local Search) Kỹ thuật Cắt tỉa alpha-beta (Alpha-Beta Pruning) Cây trò chơi Kỹ thuật Chia để trị • u cầu: Cần phải giải tốn có kích thước n • Phương pháp: - Chia toán ban đầu thành số toán đồng dạng với tốn ban đầu có kích thước < n - Giải toán lời giải - Tổng hợp lời giải → lời giải tốn ban đầu • Chú ý : Đối với toán con: chia chúng thành tốn nhỏ Q trình phân chia dừng lại kích thước tốn đủ nhỏ để giải dễ dàng: toán sở Kỹ thuật Chia để trị (Phân tích) Kỹ thuật Chia để trị (thuật tốn) Ví dụ: QuickSort • QuickSort: Sắp xếp mảng n số theo thứ tự tăng dần • Áp dụng kỹ thuật chia để trị: – Chia mảng n số thành mảng con: Trước chia phải phân hoạch – Giải toán con: Sắp xếp mảng “bên trái” Sắp xếp mảng “bên phải” – Bài toán sở: Sắp xếp mảng số nhiều số có giá trị giống – Tổng hợp kết : Không cần tổng hợp, bao hàm giai đoạn phân chia Ví dụ: QuickSort • QuickSort: Sắp xếp mảng n số theo thứ tự tăng dần • Áp dụng kỹ thuật chia để trị: – Chia mảng n số thành mảng con: Trước chia phải phân hoạch – Giải toán con: Sắp xếp mảng “bên trái” Sắp xếp mảng “bên phải” – Bài toán sở: Sắp xếp mảng số nhiều số có giá trị giống – Tổng hợp kết : Không cần tổng hợp, bao hàm giai đoạn phân chia 10 TSP: Ví dụ c(1,7) d(15,7) b(4,3) a(0,0) e(15,4) f(18,0) Ví dụ : Xét toán TSP với đỉnh cho tọa độ (Độ dài cạnh tính theo công thức khoảng cách Euclide !) TT Cạnh X1 Y1 X2 Y2 Độ dài de 15 15 3.00 ab 0 5.00 bc 5.00 ef 15 18 5.00 ac 0 7.07 df 15 18 7.62 be 15 11.05 bd 15 11.70 cd 15 14.00 10 bf 18 14.32 11 ce 15 14.32 12 ae 0 15 15.52 13 ad 0 15 16.55 14 af 0 18 18.00 15 cf 18 18.38 40 TSP: Kết c c d b a Phương án tốt (Greedy) a-b-c-d-e-f-a = 50 e d b f e a f Phương án tối ưu (Vét cạn) a-c-d-e-f-b-a = 48.39 41 TSP: Thuật toán tham ăn void TSP( ) { /*E tập hợp cạnh, Chu_trinh tập hợp cạnh chọn để đưa vào chu trình, khởiđầu Chu_trinh rỗng*/ /*Sắp xếp cạnh E theo thứ tự tăng độ dài*/ Chu_Trinh = Φ; Gia = 0.0; while (E != Φ) { if (cạnh e chọn) { Chu_Trinh = Chu_Trinh + [e]; Gia = Gia + độ dài e; } E := E-[e]; } } 42 TSP: Một cách tiếp cận khác Tiếp cận khác kỹ thuật Tham ăn: (1) Xuất phát từ đỉnh bất kỳ, chọn cạnh có độ dài nhỏ tất cạnh từ đỉnh để đến đỉnh (2) Từ đỉnh ta lại chọn cạnh có độ dài nhỏ từ đỉnh thoả mãn hai điều kiện nói để đến đỉnh (3) Lặp lại bước (2) tới đỉnh n quay trở đỉnh xuất phát 43 Bài tốn ba lơ • Bài tốn: Cho ba lơ đựng trọng lượng W n loại đồ vật, đồ vật i có trọng lượng gi giá trị vi Tất loại đồ vật có số lượng khơng hạn chế • u cầu: Tìm cách lựa chọn đồ vật đựng vào ba lô, chọn loại đồ vật nào, loại lấy cho tổng trọng lượng không vượt W tổng giá trị lớn ? 44 Bài toán ba lơ: Mơ hình hóa • Gọi X = (X1, X2, …, Xn) với Xi số nguyên không âm, phương án (Xi số lượng đồ vật thứ i) • Cần tìm phương án X cho: X1g1 + X2g2 +…+ Xngn ≤ W F(X) = X1v1 + X2v2 +…+ Xnvn → Max 45 Bài tốn ba lơ: Thuật tốn tham ăn Áp dụng kỹ thuật Tham ăn: (1) Tính đơn giá cho loại đồ vật (2) Xét loại đồ vật theo thứ tự đơn giá từ lớn đến nhỏ (3) Với đồ vật xét lấy số lượng tối đa mà trọng lượng lại ba lơ cho phép (4) Xác định trọng lượng cịn lại ba lô quay lại bước (3) khơng cịn chọn đồ vật 46 Bài tốn ba lơ: Ví dụ Ví dụ : Có ba lơ có trọng lượng 37 loại đồ vật với trọng lượng giá trị tương ứng cho bảng bên dưới: Loại đồ vật Trọng lượng Giá trị A 15 30 B 10 25 C 2 D 47 Bài tốn ba lơ: Thuật tốn Vét cạn 48 Bài tốn ba lơ: Thuật tốn Tham ăn ĐV TL GT ĐG B 10 25 2.5 A 15 30 2.0 D 1.5 C 2 1.0 Đơn giá (ĐG) = Tỷ lệ GT/TL • Phương án X = (XA, XB, XC, XD) • XB = 37/10 = W= 37 - 3*10 = • XA = 7/15 = • XD = 7/4 = W = – 4*1 = • XC = 3/2 = W=3–2=1 → Phương án X = (0, 3, 1, 1) • Tổng TL: 3*10 + 1*4 + 1*2 = 36 • Tổng GT: 3*25+1*6+1*2 = 83 49 Bài tốn ba lơ: Tổ chức liệu • Mỗi đồ vật biểu diễn mẩu tin có trường: – – – – – Ten: Lưu trữ tên đồ vật Trong_luong: Lưu trữ trọng lượng đồ vật Gia_tri: Lưu trữ giá trị đồ vật Don_gia: Lưu trữ đơn giá đồ vật Phuong_an: Lưu trữ số lượng đồ vật chọn theo phương án • Danh sách đồ vật biểu diễn mảng đồ vật 50 Bài toán ba lơ: Chương trình #define MAX_SIZE 100 typedef struct { char Ten [20]; float Trong_luong, Gia_tri, Don_gia; int Phuong_an; } Do_vat; typedef Do_vat Danh_sach_do_vat[MAX_SIZE]; void Greedy (Danh_sach_do_vat dsdv, float W) { int i; /*Sắp xếp mảng dsdv theo thứ tự giảm don_gia*/ for (i = 0; i < n; i++) { dsdv[i].Phuong_an = Chon(dsdv[i].Trong_luong, W); W = W – dsdv[i].phuong_an * dsdv[i].Trong_luong } } 51 Biến thể toán ba lơ • Có số biến thể tốn ba lơ sau: (1) Mỗi đồ vật i có số lượng si : Với tốn này, lựa chọn vật i ta khơng lấy số lượng vượt si (2) Mỗi đồ vật có cái: Với tốn này, với đồ vật ta chọn không chọn 52 Bài tập BT 9.1: Cho tốn ba lơ với trọng lượng ba lơ W = 30 loại đồ vật cho bảng bên Tất đồ vật có Giải tốn kỹ thuật tham ăn (Greedy) ? Loại đồ vật Trọng lượng Giá trị A 15 30 B 10 25 C 2 D E 24 53 Bài tập – Bài giải ĐV TL GT ĐG E 24 3.0 B 10 25 2.5 A 15 30 2.0 D 1.5 C 2 1.0 Đơn giá (ĐG) = Tỷ lệ GT/TL Phương án X = (XA, XB, XC, XD, XE) • XE = 30/8=3>1, XE = 1, W= 30 - = 22 • XB = 22/10=2>1, XB = 1, W= 22 - 10 = 12 • XA = 12/15=01, XD = 1, W= 12 - = • XC = 8/2=4>1, XC = 1, W= - = → Phương án X = (0, 1, 1, 1, 1) • Tổng TL: + 10+ + + = 24 • Tổng GT: 25+ + + 24 = 57 54 ... c? ??nh, Chu _trinh tập hợp c? ??nh chọn để đưa vào chu trình, khởiđầu Chu _trinh rỗng*/ /*Sắp xếp c? ??nh E theo thứ tự tăng độ dài*/ Chu _Trinh = Φ; Gia = 0.0; while (E != Φ) { if (c? ??nh e chọn) { Chu _Trinh. .. phần Xi X hoàn chỉnh (đủ n thành phần) Với Xi : chọn Xi tối ưu • Với c? ?ch bư? ?c cuối khơng c? ??n lựa chọn kh? ?c vi? ?c phải chấp nhận giá trị cuối c? ??n lại • Áp dụng kỹ thuật tham ăn cho thuật toán... theo c? ?ng th? ?c XY = AC10n + (AD + BC)10n/2 + BD Vi? ?c phân chia dẫn đến tốn nhân số c? ? chữ số: Đây toán sở 19 Đánh giá thuật toán • Theo c? ?ng th? ?c XY = AC10n + (AD + BC)10n/2 + BD : Ta th? ?c phép