Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 94 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
94
Dung lượng
0,96 MB
Nội dung
MỤC LỤC MỤC LỤC Bài THUẬTTOÁNVÀ CÁC VẤN ĐỀ LIÊN QUAN 1.1 Giới thiệu môn học, phƣơng pháp học 1.2 Khái niệm thuậttoán 1.3 Tại phải phântíchthuậttoán 1.4 Những vấn đề phát sinh phântíchthiếtkếthuậttoán BÀI THIẾTKẾVÀPHÂNTÍCHTHUẬTTOÁN 2.1 Lý thuyết chung phântíchthuậttoán 2.2 Các quy tắc đánh giá độ phức tạp thuậttoán 10 BÀI THẢO LUẬN VỀ ĐỘ PHỨC TẠP THUẬTTOÁN 14 BÀI THUẬTTOÁN CHIA ĐỂ TRỊ 15 4.1 Đệ quy 15 4.2 Định lý Master 15 4.3 Cơ thuậttoán chia để trị 17 4.4 Bài toán tìm kiếm nhị phân 19 4.5 Bài toán max 21 BÀI CÁC BÀI TOÁN SỬ DỤNG THUẬTTOÁN CHIA ĐỂ TRỊ 23 5.1 Bài toán hoán đổi 23 5.2 Thuậttoán Strassen nhân ma trận 25 BÀI CÁC BÀI TOÁN SỬ DỤNG THUẬTTOÁN CHIA ĐỂ TRỊ (TIẾP) 30 6.1 Thuậttoán QuickSort 30 6.2 Thuậttoán MergSort 35 8.1.Sơ đồ chung thuậttoán 39 8.1.Bài toán dãy chung dài 40 8.2.Bài toán dãy trọng lƣợng lớn 43 BÀI CÁC BÀI TOÁN SỬ DỤNG THUẬTTOÁN QUY HOẠCH ĐỘNG 45 9.1 Bài toán nhân ma trận 45 9.2 Tập độc lập lớn 52 BÀI 10 BÀI TẬP QUY HOẠCH ĐỘNG 54 BÀI 11 THUẬTTOÁN THAM LAM 55 11.1 Đặc trƣng chiến lƣợc tham lam 55 11.2 Bài toán lập lịch 56 11.3 Bài toán túi 58 BÀI 12 BÀI TẬP VÀ THẢO LUẬN TỔNG KẾT MÔN HỌC 59 BÀI 13 THỰC HÀNH ĐỘ PHỨC TẠP THUẬTTOÁN 64 BÀI 15 THỰC HÀNH THUẬTTOÁN CHIA ĐỂ TRỊ (2) 74 BÀI 16 THỰC HÀNH THUẬTTOÁN QUY HOẠCH ĐỘNG (1) 78 BÀI 17 THỰC HÀNH THUẬTTOÁN QUY HOẠCH ĐỘNG (2) 83 BÀI 18 THỰC HÀNH THUẬTTOÁN THAM LAM (1) 86 Đềcương giảng môn: Thiếtkếphântíchthuậttoán LỜI NÓI ĐẦU Những kiến thức thuậttoán cách thiết kế, đánh giá thuậttoán đóng vai trò quan trọng việc đào tạo cử nhân, kỹ sƣ công nghệ thông tin Ngoài việc học phântíchthiếtkếthuật toán, ngƣời học đƣợc cung cấp kiến thức, kỹ cần thiết giải toán hay gặp tin học để trở thành ngƣời lập trình viên chuyên nghiệp Về nội dung, sách chia thành tƣơng ứng sát với chƣơng trình học sinh viên khoa Công nghệ thông tin Sách trình bày chiến lƣợc thiếtkếthuậttoán quan trọng nhƣ: tham lam, chia-để-trị, quy hoạch động, nhánh cận, quay lui, thuậttoán dựa kinh nghiệm Trong chiến lƣợc thiết kế, bên cạnh việc đào sâu phân tích, chúng đƣợc thảo luận độ phức tạp thông qua toán cụ thể Ngoài ra, có tập thực hành hệ thống kiểm tra cài đặt thuậttoán Trong tài liệu sử dụng ngôn ngữ C# để minh họa, cài đặt Tuy nhiên ngƣời học dễ dàng cài đặt đƣợc ngôn ngữ lập trình khác nhƣ: VB.NET, C/C++, Pascal có mô tả thuậttoán mã giả Khoa Công nghệ thông tin Trang Đềcương giảng môn: Thiếtkếphântíchthuậttoán Bài THUẬTTOÁNVÀ CÁC VẤN ĐỀ LIÊN QUAN 1.1 Giới thiệu môn học, phương pháp học Đây module cung cấp cho ngƣời học kỹ thuật công cụ cho việc phântíchthiếtkếthuậtthuât Modul trình bày cách thiếtkếphântíchtoán sang mô hình toán học để tới lời giải theo thuật ngữ lập trình Modul trình bày chiến lƣợc thiếtkếthuậttoán quan trọng nhƣ: tham lam, chia-để-trị, quy hoạch động, nhánh cận, quay lui, thuậttoán dựa kinh nghiệm Trong chiến lƣợc thiết kế, bên cạnh việc đào sâu phân tích, chúng đƣợc thảo luận độ phức tạp thông qua toán cụ thể Ngoài việc học phântíchthiếtkếthuật toán, ngƣời học đƣợc cung cấp kiến thức, kỹ cần thiết giải toán hay gặp tin học để trở thành ngƣời lập trình viên chuyên nghiệp Module sử dụng ngôn ngữ C# để minh họa, cài đặt Tuy nhiên ngƣời học dễ dàng cài đặt đƣợc ngôn ngữ lập trình khác nhƣ: VB.NET, C/C++, Pascal Sau hoàn thành module này, người học có khả năng: - Trình bày đƣợc khái niệm kỹ thuậtđểthiếtkếthuậttoán hiệu - Thiết lập đƣợc phƣơng trình đệ qui để mô tả độ phức tạp thời gian không gian thuậttoánđệ qui - Xác định đƣợc độ phức tạp thời gian không gian thuậttoán xác định, trƣờng hợp: tốt nhất, trung bình nhƣ xấu - Nhận toán mà dùng phƣơng pháp quy hoạch động giải pháp hiệu - Áp dụng kỹ thuật chia-để-trị vào việc thiếtkếtoán nhƣ phântích độ phức tạp tính toán Trang Đềcương giảng môn: Thiếtkếphântíchthuậttoán Cài đặt thuậttoán tham lam (gready), chia để trị (divide-and-conquer), - quay lui (backtracking), nhánh-cận (branch-and-bound), quy hoạch động (dynamic programming) cho số toán - Chuyển đổi hiệu đƣợc từ sơ đồ thuậttoán sang chƣơng trình - Áp dụng kỹ thuật, chiến lƣợc thiếtkếthuậttoán cho toán: Lập kế hoạch cho quy trình sản xuất, tìm đƣờng đồ phức tạp, viết chƣơng trình Game, Áp dụng kỹ thuậtthiếtkếthuậttoán nhằm tăng hiệu cho dự - án cụ thể phát triển phần mềm Làm việc nhóm trình xây dựng tập lớn để đạt đƣợc mục tiêu - Để học tốt môn học ngƣời học phải tự xây dựng cho phƣơng pháp học thích hợp Nhƣng phƣơng pháp chung để học môn học ngƣời học phải hiểu thật kỹ phần lý thuyết sở, rèn luyện tƣ logic vấn đề vận dụng cách linh hoạt vào trƣờng hợp cụ thể, cài đặt thuật toán… 1.2 Khái niệm thuậttoán Đây module cung cấp cho ngƣời học kỹ thuật công cụ cho việc phântíchthiếtkếthuậtthuât Modul trình bày cách thiếtkếphântíchtoán sang mô hình toán học để tới lời giải theo thuật ngữ lập trình Modul trình bày chiến lƣợc thiếtkếthuậttoán quan trọng nhƣ: tham lam, chia-để-trị, quy hoạch động, nhánh cận, quay lui, thuậttoán dựa kinh nghiệm Trong chiến lƣợc thiết kế, bên cạnh việc đào sâu phân tích, chúng đƣợc thảo luận độ phức tạp thông qua toán cụ thể Trang Đềcương giảng môn: Thiếtkếphântíchthuậttoán Ngoài việc học phântíchthiếtkếthuật toán, ngƣời học đƣợc cung cấp kiến thức, kỹ cần thiết giải toán hay gặp tin học để trở thành ngƣời lập trình viên chuyên nghiệp Module sử dụng ngôn ngữ C# để minh họa, cài đặt Tuy nhiên ngƣời học dễ dàng cài đặt đƣợc ngôn ngữ lập trình khác nhƣ: VB.NET, C/C++, Pascal Sau hoàn thành module này, người học có khả năng: - Trình bày đƣợc khái niệm kỹ thuậtđểthiếtkếthuậttoán hiệu - Thiết lập đƣợc phƣơng trình đệ qui để mô tả độ phức tạp thời gian không gian thuậttoánđệ qui - Xác định đƣợc độ phức tạp thời gian không gian thuậttoán xác định, trƣờng hợp: tốt nhất, trung bình nhƣ xấu - Nhận toán mà dùng phƣơng pháp quy hoạch động giải pháp hiệu - Áp dụng kỹ thuật chia-để-trị vào việc thiếtkếtoán nhƣ phântích độ phức tạp tính toán - Cài đặt thuậttoán tham lam (gready), chia để trị (divide-and-conquer), quay lui (backtracking), nhánh-cận (branch-and-bound), quy hoạch động (dynamic programming) cho số toán - Chuyển đổi hiệu đƣợc từ sơ đồ thuậttoán sang chƣơng trình - Áp dụng kỹ thuật, chiến lƣợc thiếtkếthuậttoán cho toán: Lập kế hoạch cho quy trình sản xuất, tìm đƣờng đồ phức tạp, viết chƣơng trình Game, - Áp dụng kỹ thuậtthiếtkếthuậttoán nhằm tăng hiệu cho dự án cụ thể phát triển phần mềm - Làm việc nhóm trình xây dựng tập lớn để đạt đƣợc mục tiêu Trang Đềcương giảng môn: ThiếtkếphântíchthuậttoánĐể học tốt môn học ngƣời học phải tự xây dựng cho phƣơng pháp học thích hợp Nhƣng phƣơng pháp chung để học môn học ngƣời học phải hiểu thật kỹ phần lý thuyết sở, rèn luyện tƣ logic vấn đề vận dụng cách linh hoạt vào trƣờng hợp cụ thể, cài đặt thuật toán… 1.3 Tại phải phântíchthuậttoán Giả sử, với số toán có số thuậttoán giải Một câu hỏi xuất là, cần chọn thuậttoán số thuậttoánđể áp dụng Việc phântíchthuật toán, đánh giá độ phức tạp thuậttoán nội dung phần dƣới giải vấn đề 1.4 Những vấn đề phát sinh phântíchthiếtkếthuậttoán 1.4.1 ThiếtkếthuậttoánĐể giải toán máy tính điện tử (MTĐT), điều trƣớc tiên phải có thuậttoán Một câu hỏi đặt làm để tìm đƣợc thuậttoán cho toán đặt ra? Lớp toán đƣợc đặt từ ngành khoa học kỹ thuật, từ lĩnh vực hoạt động ngƣời phong phú đa dạng Các thuậttoán giải lớp toán khác khác Tuy nhiên, có số kỹ thuậtthiếtkếthuậttoán chung nhƣ: Chia để trị (divide-and-conque), phƣơng pháp tham ăn (greedy method), qui hoạch động (dynamic programming) Việc nắm đƣợc chiến lƣợc thiếtkếthuậttoán quan trọng cần thiết, giúp cho ta dễ tìm thuậttoán cho toán đƣợc đƣa 1.4.2 Tính đắn thuậttoán Khi thuậttoán đƣợc làm ra, ta cần phải chứng minh rằng, thuậttoán đƣợc thực cho ta kết với liệu vào hợp lệ Điều gọi chứng minh tính đắn thuậttoán Việc chứng minh tính đắn thuậttoán công việc không dễ dàng Trong nhiều trƣờng hợp, đòi hỏi ta phải có trình độ khả tƣ toán học tốt Trang Đềcương giảng môn: Thiếtkếphântíchthuậttoán Sau ta rằng, thực thuậttoán Euclid, g ƣớc chung lớn hai số nguyên dƣơng m, n Thật vậy, thực bƣớc 1, ta có m = qn + r ,trong q số nguyên Nếu r = n ƣớc m hiển nhiên n (do g) ƣớc chung lớn m n Nếu r ƣớc chung m n ƣớc chung n r (vì r=m-qn) Ngƣợc lại ƣớc chung n r ƣớc chung m n (vì m = qn + r) Do ƣớc chung lớn n r ƣớc chung lớn ma n Vì vậy, thực lặp lại bƣớc 1, với thay đổi giá trị m n, thay đổi giá trị n r, r=0 ta nhận đƣợc giá trị g ƣớc chung lớn giá trị m n ban đầu 1.4.3 Phântíchthuậttoán Giả sử, với số toán có số thuậttoán giải Một câu hỏi xuất là, cần chọn thuậttoán số thuậttoánđể áp dụng Việc phântíchthuật toán, đánh giá độ phức tạp thuậttoán nội dung phần dƣới giải vấn đề 1.4.4 Đánh giá hiệu thuậttoán Khi giải vấn đề, cần chọn số thuật toán, thuậttoán mà cho “tốt” Vậy ta cần lựa chọn thuậttoán dựa sở nào? Thông thƣờng ta dựa hai tiêu chuẩn sau đây: Thuậttoán đơn giản, dễ hiểu, dễ cài đặt (dễ viết chƣơng trình) Thuậttoán sử dụng tiết kiệm nguồn tài nguyên máy tính, đặc biệt chạy nhanh đƣợc Khi ta viết chƣơng trình để sử dụng số lần,và giá thời gian viết chƣơng trình vƣợt xa giá chạy chƣơng trình tiêu chuẩn (1) quan trọng Nhƣng có trƣờng hợp ta cần viết chƣơng trình (hoặc thủ tục, hàm) để sử dụng nhiều lần, cho nhiều ngƣời sử dụng, giá thời gian chạy chƣơng trình vƣợt xa giá viết Chẳng hạn, thủ tục xếp, tìm kiếm đƣợc sử dụng nhiều lần, nhiều ngƣời toán khác Trong Trang Đềcương giảng môn: Thiếtkếphântíchthuậttoán trƣờng hợp ta cần dựa tiêu chuẩn (2) Ta cài đặt thuậttoán phức tạp, miễn chƣơng trình nhận đƣợc chạy nhanh so với chƣơng trình khác Tiêu chuẩn (2) đƣợc xem tính hiệu thuậttoán Tính hiệu thuậttoán bao gồm hai nhân tố bản: Dung lƣợng không gian nhớ cần thiếtđể lƣu giữ liệu vào, kết tính toán trung gian kết thuậttoán Thời gian cần thiếtđể thực thuậttoán (ta gọi thời gian chạy) Chúng ta quan tâm đến thời gian thực thuậ toán, có nghĩa ta nói đến đánh giá thời gian thực Một thuậttoán có hiệu đƣợc xem thuậttoán có thời gian chạy so với thuậttoán khác Trang Đềcương giảng môn: Thiếtkếphântíchthuậttoán BÀI THIẾTKẾVÀPHÂNTÍCHTHUẬTTOÁN 2.1 Lý thuyết chung phântíchthuậttoán 2.1.1 Đặt vấn đề: Khi xây dựng đƣợc thuậttoánđể giải toán có loạt vấn đề đƣợc đặt đểphântích Thƣờng vấn đề sau: - Yêu cầu tính đắn thuật toán, thuậttoán có cho lời giải - Tính đơn giản thuậttoán Thƣờng ta mong muốn có đƣợc thuậttoán đơn giản, dễ hiểu, dễ lập trình Đặc biệt thuậttoán dùng vài lần ta cần coi trọng tính chất này, công sức thời gian bỏ để xây dựng thuậttoán thƣờng lớn nhiều so với thời gian thực - Yêu cầu không gian : thuậttoán đƣợc xây dựng có phù hợp với nhớ máy - Yêu cầu thời gian : Thời gian chạy thuậttoán có nhanh không ? Một toán thƣờng có nhiều thuậttoánđể giải, yêu cầu thuậttoán dẫn nhanh đến kết đòi hỏi đƣơng nhiên Trong phần ta quan tâm chủ yếu đến tốc độ thuậttoán Ta lƣu ý thời gian chạy thuậttoán dung lƣợng nhớ nhiều không cân đối đƣợc để có giải pháp trọn vẹn Chẳng hạn, thuậttoán xếp có thời gian chạy nhanh liệu đƣợc lƣu trữ nhớ trong, không phù hợp trƣờng hợp kích thƣớc liệu lớn Ngƣợc lại, thuậttoán xếp phù hợp với kích thƣớc liệu lớn liệu đƣợc lƣu trữ thiết bị ngoài, nhƣng tốc độ lại chậm 2.1.2 Phântích đánh giá thời gian chạy thuậttoán - Bƣớc phântích thời gian chạy thuậttoán quan tam đến kích thƣớc liệu nhƣ liệu nhập thuậttoán định phântích thích hợp Ta xem thời gian chạy thuậttoán hàm theo kích thƣớc liệu nhập Nếu gọi n kích thƣớc liệu nhập thời gian thực T thuậttoán đƣợc biểu diễn nhƣ hàm theo n, ký hiệu là: T(n) Trang Đềcương giảng môn: Thiếtkếphântíchthuậttoán - Bƣớc thứ hai việc phântích đánh giá thời gian chạy thuậttoán nhận thao tác trừu tƣợng thuậttoánđể tách biệt phântích cài đặt Bởi ta biết tốc độ xử lý máy tính dịch ngôn ngữ lập trình cấp cao ảnh hƣởng đến thời gian chạy thuật toán, nhƣng yếu tố ảnh hƣởng không đồng với lọai máy cài đặt thuật toán, dựa vào chúng để đánh giá thời gian chạy thuậttoán Ta thấy T(n) đƣợc biểu diễn giây, phút đƣợc; Cách tốt biểu diễn theo số thị thuậttoán - Bƣớc thứ ba việc phântích đánh giá thời gian chạy thuậttoánphântích mặt toán học với mục đích tìm giá trị trung bình trƣờng hợp xấu cho đại lƣợng Chẳng hạn, xếp dãy phần tử, thời gian chạy thuậttoán hiển nhiên phụ thuộc vào tính chất liệu nhập nhƣ: Dãy có thứ tự xếp Dãy có thức tự ngƣợc với thứ tự cần xếp Đã có thứ tự ngẫu nhiên 2.2 Các quy tắc đánh giá độ phức tạp thuậttoán 2.2.1 O(f(x)) đánh giá thời gian thực thuậttoán Khi đánh giá thời gian thực phƣơng pháp toán học, bỏ qua nhân tố phụ thuộc vào cách cài đặt tập trung vào xác định độ lớn thời gian thực T(n) Giả sử n số nguyên không âm T(n) f(n) hàm thực không âm Ta viết T(n)=O(f(n)) (đọc T(n) ô lớn f(n)), tồn số dƣơng c no cho T(n) ≤ c.f(n), với n ≥ no Nếu thuậttoán có thời gian thực T(n) = O(f(n)) , ta nói thuậttoán có thời gian thực cấp f(n) Từ định nghĩa ký hiệu ô lớn , ta xem hàm f(n) cận T(n) Trang 10 Đềcương giảng môn: Thiếtkếphântíchthuậttoán using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Max_Subarray_DP { class Program { static void Max_subarray(int[] a, int n) { int MaxS, MaxE, s, e,s1; /* Ý nghĩa biến: maxS: tổng dãy lớn maxE: tổng dãy có chứa phần tử cuối lớn s,e số đầu cuối dãy có tổng lớn s1 số đầu dãy lớn kết thúc i */ MaxS = a[0]; MaxE = a[0]; s = 1; e = 1; s1 = 1; for (int i=1; i0) MaxE=MaxE+a[i]; else { MaxE = a[i]; s1=i;} if (MaxE > MaxS) { MaxS= MaxE; e=i; s=s1; } } Console.WriteLine("Max subarray is {0}", MaxS); Trang 80 Đềcương giảng môn: Thiếtkếphântíchthuậttoán for (int i = s; i 1 Ví dụ: F(2)=1, F(3)= 2, F(4) = , F(5)=5, F(6)=8 + Cách 2: áp dụng chiến lược quy hoạch động: Bài 2: Bài The maximum-subarray problem Cho dãy n số nguyên {ai, giả sử i=1 n} Dãy liên tiếp dãy mà thành phần thành phần liên tiếp {a}, ta gọi tổng dãy tổng tất thành phần Tìm tổng lớn tất tổng dãy {a} Ví dụ n = 7; Trang 81 Đềcương giảng môn: Thiếtkếphântíchthuậttoán –5 –4 -7 Thì kết tổng Gợi ý: + Cách 1: Áp dụng chiến lược thiếtkế “chia để trị”: (3) Chia đôi mảng thành nửa (4) Trả giá trị lớn sau: a Tìm tổng lớn dãy dãy nửa bên trái ( gọi đệ quy) b Tìm tổng lớn dãy dãy nửa bên trái (gọi đệ quy) c Tìm tổng lớn dãy dãy xung quanh điểm + Cách 2: áp dụng chiến lược quy hoạch động * Nhận xét so sánh chiến lƣợc thiếtkế chia để trị quy hoạch động Trang 82 Đềcương giảng môn: Thiếtkếphântíchthuậttoán BÀI 17 THỰC HÀNH THUẬTTOÁN QUY HOẠCH ĐỘNG (2) Mục tiêu: - Vận dụng đƣợc chiến lƣợc quy hoạch động chia để trị để tìm đƣợc cách giải toán theo yêu cầu - Cài đặt đƣợc toán theo yêu cầu áp dụng chiến lƣợc Yêu cầu: Viết chƣơng trình cho ma trận A m x n ma trận Bn x p ma trận C p x k, thực nhân ma trận A*B*C Cách 1: - Đầu tiên ta viết hàm nhân ma trận dựa vào thuật toán: for(int i=0; i= 0) { if (P[i][w] == 1) { valueSum += list[i].v; weightSum += list[i].w; if(full){write(string.Format("{0}\n", list[i]));} w -= list[i].w; } i ; } Trang 92 Đềcương giảng môn: Thiếtkếphântíchthuậttoán write(string.Format("\nvalue sum: {0}\nweight sum: {1}", valueSum, weightSum)); } public static void PrintPicksMatrix(Action write) { write("\n\n"); foreach (var i in P) { foreach (var j in i) { var s = j.ToString(); var _ = s.Length > ? " " : " "; write(string.Concat(s,_)); } write("\n"); } } static int Max(int a, int b) { return a > b ? a : b; } } class Item { private static int _counter; public int Id { get; private set; } public int v { get; set; } // value public int w { get; set; } // weight public Item() { Id = ++_counter; } public override string ToString() { return string.Format("Id: {0} v: {1} w: {2}", Id, v, w); } Trang 93 Đềcương giảng môn: Thiếtkếphântíchthuậttoán } } Bài tập tự giải Bài 2: Cho n thiết bị (pi )1