1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Đề cương thiết kế và phân tích thuật toán

94 145 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

MỤC LỤC MỤC LỤC Bài THUẬT TOÁN 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ật toán 1.3 Tại phải phân tích thuật toán 1.4 Những vấn đề phát sinh phân tích thiết kế thuật toán BÀI THIẾT KẾ PHÂN TÍCH THUẬT TOÁN 2.1 Lý thuyết chung phân tích thuật toán 2.2 Các quy tắc đánh giá độ phức tạp thuật toán 10 BÀI THẢO LUẬN VỀ ĐỘ PHỨC TẠP THUẬT TOÁN 14 BÀI THUẬT TOÁN CHIA ĐỂ TRỊ 15 4.1 Đệ quy 15 4.2 Định lý Master 15 4.3 Cơ thuật toá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ẬT TOÁN CHIA ĐỂ TRỊ 23 5.1 Bài toán hoán đổi 23 5.2 Thuật toán Strassen nhân ma trận 25 BÀI CÁC BÀI TOÁN SỬ DỤNG THUẬT TOÁN CHIA ĐỂ TRỊ (TIẾP) 30 6.1 Thuật toán QuickSort 30 6.2 Thuật toán MergSort 35 8.1.Sơ đồ chung thuật toá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ẬT TOÁ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ẬT TOÁ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 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ẬT TOÁN 64 BÀI 15 THỰC HÀNH THUẬT TOÁN CHIA ĐỂ TRỊ (2) 74 BÀI 16 THỰC HÀNH THUẬT TOÁN QUY HOẠCH ĐỘNG (1) 78 BÀI 17 THỰC HÀNH THUẬT TOÁN QUY HOẠCH ĐỘNG (2) 83 BÀI 18 THỰC HÀNH THUẬT TOÁN THAM LAM (1) 86 Đề cương giảng môn: Thiết kế phân tích thuật toán LỜI NÓI ĐẦU Những kiến thức thuật toán cách thiết kế, đánh giá thuật toá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ân tích thiết kế 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ết kế thuật toán quan trọng nhƣ: tham lam, chia-để-trị, quy hoạch động, nhánh cận, quay lui, thuật toá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ật toá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ật toán mã giả Khoa Công nghệ thông tin Trang Đề cương giảng môn: Thiết kế phân tích thuật toán Bài THUẬT TOÁN 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ân tích thiết kế thuật thuât Modul trình bày cách thiết kế phân tích toá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ết kế thuật toán quan trọng nhƣ: tham lam, chia-để-trị, quy hoạch động, nhánh cận, quay lui, thuật toá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ân tích thiết kế 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ết kế thuật toá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ật toán đệ qui - Xác định đƣợc độ phức tạp thời gian không gian thuật toá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ết kế toán nhƣ phân tích độ phức tạp tính toán Trang Đề cương giảng môn: Thiết kế phân tích thuật toán Cài đặt thuật toá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ật toán sang chƣơng trình - Áp dụng kỹ thuật, chiến lƣợc thiết kế thuật toá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ật thiết kế thuật toá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ật toán Đây module cung cấp cho ngƣời học kỹ thuật công cụ cho việc phân tích thiết kế thuật thuât Modul trình bày cách thiết kế phân tích toá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ết kế thuật toán quan trọng nhƣ: tham lam, chia-để-trị, quy hoạch động, nhánh cận, quay lui, thuật toá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ết kế phân tích thuật toán Ngoài việc học phân tích thiết kế 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ết kế thuật toá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ật toán đệ qui - Xác định đƣợc độ phức tạp thời gian không gian thuật toá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ết kế toán nhƣ phân tích độ phức tạp tính toán - Cài đặt thuật toá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ật toán sang chƣơng trình - Áp dụng kỹ thuật, chiến lƣợc thiết kế thuật toá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ật thiết kế thuật toá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ết kế phân tích thuật toá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ân tích thuật toán Giả sử, với số toán có số thuật toán giải Một câu hỏi xuất là, cần chọn thuật toán số thuật toán để áp dụng Việc phân tích thuật toán, đánh giá độ phức tạp thuật toán nội dung phần dƣới giải vấn đề 1.4 Những vấn đề phát sinh phân tích thiết kế thuật toán 1.4.1 Thiết kế thuật toán Để giải toán máy tính điện tử (MTĐT), điều trƣớc tiên phải có thuật toán Một câu hỏi đặt làm để tìm đƣợc thuật toá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ật toán giải lớp toán khác khác Tuy nhiên, có số kỹ thuật thiết kế thuật toá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ết kế thuật toán quan trọng cần thiết, giúp cho ta dễ tìm thuật toán cho toán đƣợc đƣa 1.4.2 Tính đắn thuật toán Khi thuật toán đƣợc làm ra, ta cần phải chứng minh rằng, thuật toá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ật toán Việc chứng minh tính đắn thuật toá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ết kế phân tích thuật toán Sau ta rằng, thực thuật toá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ân tích thuật toán Giả sử, với số toán có số thuật toán giải Một câu hỏi xuất là, cần chọn thuật toán số thuật toán để áp dụng Việc phân tích thuật toán, đánh giá độ phức tạp thuật toán nội dung phần dƣới giải vấn đề 1.4.4 Đánh giá hiệu thuật toán Khi giải vấn đề, cần chọn số thuật toán, thuật toán mà cho “tốt” Vậy ta cần lựa chọn thuật toán dựa sở nào? Thông thƣờng ta dựa hai tiêu chuẩn sau đây: Thuật toán đơn giản, dễ hiểu, dễ cài đặt (dễ viết chƣơng trình) Thuật toá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ết kế phân tích thuật toán trƣờng hợp ta cần dựa tiêu chuẩn (2) Ta cài đặt thuật toá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ật toán Tính hiệu thuật toá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ật toán Thời gian cần thiết để thực thuật toá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ật toán có hiệu đƣợc xem thuật toán có thời gian chạy so với thuật toán khác Trang Đề cương giảng môn: Thiết kế phân tích thuật toán BÀI THIẾT KẾ PHÂN TÍCH THUẬT TOÁN 2.1 Lý thuyết chung phân tích thuật toán 2.1.1 Đặt vấn đề: Khi xây dựng đƣợc thuật toán để giải toán có loạt vấn đề đƣợc đặt để phân tích Thƣờng vấn đề sau: - Yêu cầu tính đắn thuật toán, thuật toán có cho lời giải - Tính đơn giản thuật toán Thƣờng ta mong muốn có đƣợc thuật toán đơn giản, dễ hiểu, dễ lập trình Đặc biệt thuật toá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ật toán thƣờng lớn nhiều so với thời gian thực - Yêu cầu không gian : thuật toá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ật toán có nhanh không ? Một toán thƣờng có nhiều thuật toán để giải, yêu cầu thuật toá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ật toán Ta lƣu ý thời gian chạy thuật toá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ật toá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ật toá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ân tích đánh giá thời gian chạy thuật toán - Bƣớc phân tích thời gian chạy thuật toán quan tam đến kích thƣớc liệu nhƣ liệu nhập thuật toán định phân tích thích hợp Ta xem thời gian chạy thuật toá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ật toá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ết kế phân tích thuật toán - Bƣớc thứ hai việc phân tích đánh giá thời gian chạy thuật toán nhận thao tác trừu tƣợng thuật toán để tách biệt phân tí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ật toá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ật toán - Bƣớc thứ ba việc phân tích đánh giá thời gian chạy thuật toán phân tí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ật toá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ật toán 2.2.1 O(f(x)) đánh giá thời gian thực thuật toá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ật toán có thời gian thực T(n) = O(f(n)) , ta nói thuật toá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ết kế phân tích thuật toá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ết kế phân tích thuật toá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ết kế phân tích thuật toán –5 –4 -7 Thì kết tổng Gợi ý: + Cách 1: Áp dụng chiến lược thiết kế “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ết kế chia để trị quy hoạch động Trang 82 Đề cương giảng môn: Thiết kế phân tích thuật toán BÀI 17 THỰC HÀNH THUẬT TOÁ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ết kế phân tích thuật toá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ết kế phân tích thuật toán } } Bài tập tự giải Bài 2: Cho n thiết bị (pi )1

Ngày đăng: 24/10/2017, 15:51

Xem thêm: Đề cương thiết kế và phân tích thuật toán

TỪ KHÓA LIÊN QUAN

w