Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 78 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
78
Dung lượng
1,48 MB
Nội dung
Chuyên Đề: PHÂN TÍCH THIẾT KẾ THUẬT TOÁN PHẦN 1: THUẬT TOÁN VÀ PHÂN TÍCH THUẬT TOÁN I KHÁI NIỆM BÀI TOÁN VÀ THUẬT TOÁN Khái niệm toán Trong phạm vi tin học, ta quan niệm toán việc ta muốn máy tính thực Một toán mô tả hai thành phần: tập liệu đầu vào cho trước (Input) tập kết cần nhận (Output) Thuật ngữ “một” toán hiểu theo nghĩa phổ dụng, toán có nhiều liệu khác Ví dụ: giải toán tìm ước chung lớn (UCLN) hai số nguyên dương M, N Thuật toán để giải toán phải đáp ứng với giá trị cụ thể liệu vào M, N Khái niệm thuật toán: Việc cho toán mô tả rõ Input Output Vấn đề làm để tìm Ouput? Đó lời giải toán Có nhiều xu hướng khác việc nghiên cứu lời giải toán Trong toán học có xu hướng nghiên cứu định tính, chứng minh tồn lời giải toán mà không cần thiết cách tường minh cách tìm lời giải đó.Trong việc nghiên cứu thuật toán đây, quan tâm tới cách tường minh để tìm Output từ Input toán Có nhiều định nghĩa khác thuật toán, định nghĩa thường dùng Thuật toán để giải toán dãy hữu hạn thao tác xếp theo trình tự xác định cho sau thực dãy thao tác ấy, từ Input toán, ta nhận Output cần tìm Các bƣớc giải toán máy tính: a Xác định toán: Việc xác định toán xác định rõ hai thành phần Input, Output mối liên hệ chúng Ví dụ: giải toán tìm ước chung lớn (UCLN) hai số nguyên dương M, N Input: hai số nguyên dương M, N Output: UCLN M N b Thiết kế lựa chọn thuật toán: Một toán có nhiều thuật toán để giải Nhưng thuật toán dùng để giải cho toán cụ thể mà Vấn đề đặt có nhiều thuật toán để giải toán ta nên chọn thuật toán nào? Dĩ nhiên ta chọn thuật toán tốt Nhưng thuật toán cho tốt nhất, đánh giá dựa tiêu chí nào? Tùy theo toán mà ta lựa chọn thuật toán theo tiêu chí sau đây: (1) Tính hiệu thời gian: thời gian để thực xong toán (2) Tính hiệu không gian: dung lượng cần thiết để lưu trữ liệu cần thiết xử lí toán (3) Tính khả thi cài đặt thuật toán: thuật toán cài đặt hay không, có tốn nhiều công sức người lập trình không Ví dụ: Đối với toán lớn số lần giải toán nhiều lần tiêu chí (1) ưu tiên hàng đầu Nhưng toán nhỏ số lần giải toán không nhiều thông thường ta chọn tiêu chí (3) làm tiêu chí chọn c Viết chương trình: Viết chương trình tổng hợp việc lựa chọn cách tổ chức liệu sử dụng ngôn ngữ lập trình để diễn đạt thuật toán Cấu trúc liệu (Data Structures): đơn vị cấu trúc (construct) ngôn ngữ lập trình dùng để biểu diễn mô hình liệu, ví dụ mảng (array), ghi (record), tệp (file), xâu (string), danh sách liên kết (list linked),… Các cấu trúc liệu lựa chọn cần có khả biểu diễn liệu vào Input liệu Output toán cần giải mà cần phải phù hợp với thao tác thuật toán cài đặt ngôn ngữ lập trình lựa chọn Hai bước b c thường thực không tách rời gắn kết chặt chẽ với chặt chẽ Vì có thuật toán thích ứng hiệu với cách tổ chức liệu định Như có thuật toán tốt chưa đủ mà phải chọn cấu trúc liệu thích hợp, đồng thời phải có kĩ thuật cài đặt chương trình tốt d Kiểm thử hiệu chỉnh: Sau viết xong, chương trình có nhiều lỗi khác chưa phát nên kết Vì vậy, cần phải kiểm thử tính đắn chương trình Có nhiều cách để thực điều đó, cách thường dùng thực chương trình với số Input tiêu biểu phù thuộc vào đặc thù toán mà cách ta biết trước kết Output tương ứng Các Input Output tương ứng gọi Test Trong trình kiểm thử phát có sai sót, ta phải hiệu chỉnh lại chương trình thử lại Trên sở đánh giá lỗi chương trình qua kiểm thử xác định ngôn ngữ lập trình, cấu trúc liệu chí thuật toán lựa chọn không phù hợp, cần thiết quay lại công việc bước trước e Viết tài liệu Tài liệu trình bày nội dung liên quan đến mô tả toán, thuật toán, cấu trúc liệu, thiết kế chương trình hướng dẫn sử dụng Tài liệu (bao gồm thích chương trình) cần thiết cho người dùng để khai thác tốt chương trình, đề xuất phương án để hoàn thiện chương trình mà cho người lập trình người đọc chương trình dễ dàng chỉnh sửa, nâng cấp chương trình cần thiết II PHÂN TÍCH THUẬT TOÁN Độ phức tạp thuật toán: Một tiêu chí thường lấy để đánh giá thuật toán thời gian thực thuật toán Vậy, làm để “đo được” thời gian thực chương trình (mô tả thuật toán)? a Dùng mẫu chuẩn Đây cách tự nhiên thường sử dụng Dựa vào thời gian thực tế thực chương trình viết ngôn ngữ lập trình cho thuật toán khác với liệu vào Input nhau, hệ thống máy tính để kết luận thuật toán nhanh, thuật toán chậm Tuy nhiên việc dễ mắc lỗi thực chương trình, yếu tố thuật toán yếu tố khác hệ thống, đặc trưng liệu chạy thử có ảnh hưởng đến thời gian chạy chương trình Vì để so sánh xác cần xây dựng liệu vào Input theo mẫu chuẩn (benchmark) cho thừa nhận chương trình thực tốt mẫu chuẩn coi tốt liệu vào b Phân tích thuật toán Một cách khác để đánh giá chương trình (thuật toán) dựa vào câu lệnh chương trình nguồn thực lần tập liệu vào Phần lớn môi trường lập trình có đếm lệnh (statement couter) công cụ để thực phép đo Mục tiêu phân tích thuật toán không để so sánh, đánh giá giúp cho việc lựa chọn thuật toán tốt mà dựa vào kết phân tích đánh giá để hiệu chỉnh, cải tiến thuật toán có tốt Nhiều chương trình cho thấy, tổng thời gian thực chương trình lớn thường tiêu phí cho phần “nhỏ” chương trình Về nguyên tắc, số thao tác trừu tượng thuật toán lớn Tuy nhiên thường tính thuật toán phục thuộc vào vài đại lượng Khi đánh giá thời gian thực thuật toán ta ý đặc biệt đến phép toán mà số lần thực không phép toán khác (chứa phần “nhỏ” chương trình) Việc ý đến phép toán thực nhiều lần điều cần thiết cài đặt thuật toán chương trình Ví dụ, người lập trình cần quan tâm lớn để cải tiến “vòng lặp trong” phép toán phép toán thực lặp lại nhiều lần Cách đánh giá thời gian thực thuật toán độc lập với hệ thống máy tính dẫn tới khái niệm độ phức tạp thuật toán Thời gian để thực thuật toán phụ thuộc nhiều yếu tố Một yếu tố quan trọng kích thước liệu vào Dữ liệu lớn thời gian thực thuật toán lớn Ta kí hiệu T(n) hàm “đo” số lượng phép toán xuất thực thuật toán đố số nguyễn phúc thảo ngọc kích thước liệu vào Kí pháp độ phức tạp thuật toán Ta gọi hàm T(n) thời gian thực thuật toán Giải sử, f(n) g(n) hàm xác định dương với n Khi ta nói độ phức tạp tính toán thuật toán có thời gian thực T(n) là: Hàm O lớn (đọc ô lớn): O(g(n)) tồn số phan văn mạnh n0 cho T(n) ≤ c.g(n) với n ≥ n0 gọi kí pháp chữ O lớn, hàm g(n) gọi giới hạn hàm T(n) Ví dụ: T(n) = n2 + T(n) = O(n2) Thật vậy, chọn c = n0 = 1, n ≥ 1, ta có: T(n) = n2 + ≤ 2n2 = 2g(n) Các cách xác định độ phức tạp thuật toán a Quy tắc số Nếu thuật toán T có thời gian thực T(n) = O (c1f(n)) với c1 số dương coi thuật toán T có độ phức tạp tính toán O (f(n)) Thật vậy, T(n) = O(c1f(n)) nên tồn c0 > n0 >0 để T(n) ≤ c0.c1f(n) với n ≥ n0 Chọn c = c0.c1, với n > n0 ta có T(n) ≤ cf(n) Vậy quy tắc số Như vậy, số không quan trọng b Quy tắc cộng Giả thiết, thuật toán gồm hai phần liên tiếp T1 T2 Khi phần T1 thuật toán có thời gian thực T1(n) = O(f(n)) phần T2 có thời gian thực T2(n) = O(g(n)), thời gian thực thuật toán T1(n) + T2(n) = O(f(n) + g(n)) Chứng minh: Vì T1(n) = O(f(n)) nên tồn số c1 n1 cho T1(n) ≤ c1.f(n) với mợi n ≥ n1 Vì T2(n) = O(g(n)) nên tồn số c2 n2 cho T2(n) ≤ c2.f(n) với mợi n ≥ n2 Chọn c = max(c1, c2) n0 = max(n1, n2) ta có với n ≥ n0: T(n) = T1(n) + T2(n) ≤ c1f(n) + c2g(n) ≤ cf(n) + cg(n) = c(f(n) + g(n)) Đó điều phải chứng minh c Quy tắc lấy max Nếu thuật toán T có thời gian thực T(n) = O(f(n) + g(n)) coi thuật toán T có độ phức tạp tính toán O(max(f(n),g(n))) Thật vậy, T(n) = O(f(n)+g(n)) nên tồn n0 > c > để T(n) ≤ cf(n) + cg(n), với n ≥ n0 Vậy T(n) ≤ cf(n) + cg(n) ≤ 2c.max(f(n), g(n)) với n ≥ n0 Từ suy điều cần chứng minh d Quy tắc nhân Nếu đoạn thuật toán T có thời gian thực T(n) = O(f(n)) Khi thực k(n) lần đoạn thuật toán T với k(n) = O(g(n)) độ phức tập tính toán là: O(f(n).g(n)) Chứng minh: Thời gian thực k(n) lần đoạn thuật toán T k(n)T(n), theo định nghĩa: - Tồn ck≥0 nk>0 để k(n)≤ckg(n) với mợi n≥nk - Tồn cT≥0 nT>0 để T(n)≤cTf(n) với n≥nT Vậy với n ≥ max(nT,nk) ta có k(n)T(n) ≤ ckcT(f(n)g(n)) Từ suy điều cần chứng minh Các thuật ngữ thƣờng dùng cho độ phức tạp thuật toán Độ phức tạp O(1) O(logn) O(n) O(nlogn) O(nb) O(bn) (b>1) O(n!) Đánh giá thời gian thực chƣơng trình Thuật ngữ Độ phức tạp số Độ phức tạp lôgarit Độ phức tạp tuyến tính Độ phức tạp nlogn Độ phức tạp đa thức Độ phức tạp hàm mũ Độ phức tạp giai thừa Trước hết, ta phân loại câu lệnh ngôn ngữ lập trình bậc cao Có loại câu lệnh thường dùng sau: - Câu lệnh đơn thực thao tác, ví dụ câu lệnh gán đơn giản (không chứa lời gọi hàm biểu thức), đọc/ghi đơn giản, câu lệnh chuyển điều khiển đơn giản (break, goto, continue, return) - Câu lệnh hợp thành dãy câu lệnh tạo thành khối độc lập - Câu lệnh rẽ nhánh dạng IF…THEN (còn gọi câu lệnh điều kiện IF) - Các câu lệnh lặp Để đánh giá thời gian thực chương trình, cần thiết phải biết đánh giá thời gian thực câu lệnh Để làm điều ta áp dụng quy tắc tính độ phức tạp thuật toán trình bày mục trên, cụ thể: - Thời gian thực lệnh đơn không phụ thuộc vào kích thước liệu nên O(1) max Thời gian thực câu lệnh hợp thành tính theo quy tắc cộng quy tắc - Thời gian thực câu lệnh IF: giả sử thời gian thực hai câu lệnh thành phần dạng đủ f(n) g(n) thời gian thực câu lệnh IF tính theo quy tắc max nên O(max(f(n),g(n))) - Thời gian thực câu lệnh lặp áp dụng theo quy tắc nhân, nghĩa O(k(n)f(n)), k(n) số lần lặp f(n) thời gian thực câu lện bên vòng lặp Một số ví dụ Phân tích thời gian thực đoạn chương trình sau: Ví dụ 1: VAR i, j, n: longint; s1, s2: longint; BEGIN {1} Readln(n); {2} s1:=0; {3} FOR i:=1 TO n DO {4} s1:=s1+i; {5} s2:=0; {6} FOR j:=1 TO n DO {7} s2:=s2+j*j; {8} writeln(‘1+2+…+’,n,’=’,s1); {9} writeln(‘1^2+2^2+ +’,n,’^2=’,s2); END Thời gian thực chương trình phụ thuộc vào n Các câu lệnh {1}, {2}, {4}, {5}, {7}, {8}, {9} có thời gian thực O(1) Câu lệnh {3} thời gian thực O(n) Câu lệnh {6} thời gian thực O(n) Vậy thời gian thực chương trình Max(O(1), O(1), O(n), O(1), O(n),O(1), O(1)) = O(n) Ví dụ 2: {1} {2} {3} {4} {5} {6} c:=0; FOR i:=1 TO 2*n DO c:=c+1 FOR i:=1 TO n DO FOR j:=1 TO n DO c:=c+1 Câu lệnh {1} {3}, {6} có thời gian thực O(1) Lệnh lặp FOR {2} có số lần lặp 2n nên lệnh {2} có thời gian thực O(n) Lệnh lặp có số lần lặp n nên lệnh {5} có thời gian thực O(n) Lệnh lặp {4} có số lần lặp n câu lệnh lặp {5} nên thời có thời gian thực O(n2) Vậy thời gian thực đoạn chương trình Max(O(1), O(n), O(n2)) = O(n2) Ví dụ 3: {1} {2} {3} FOR i:=1 TO n DO FOR j:=1 TO i DO c:=c+1 Câu lệnh {3} có thời gian thực O(1) Khi i=1, j chạy từ đến nên lệnh lặp For {2} lặp lần Khi i:=2, j chạy từ đến nên lệnh lặp For {2} lặp lần … Khi i:=n, j chạy từ đến n nên lệnh lặp For {2} lặp n lần Như lệnh {3} lặp 1+2+3…+n=n(n+1)/2 lần, lệnh {1} có thời gian thực O(n2) Vậy thời gian thực đoạn chương trình O(n2) BÀI TẬP Phân tích thời gian thực đoạn chƣơng trình sau: Câu Readln(n); S:=0; i:=1; WHILE i2 >4 >5 >2 > >3 > >2 >5 >3 > > >4 >2 >5 >4 >5 Bài 6: Bạn Nam vừa chuyển nhà đến thành phố XYZ, thành phố Nam có người bạn thân An, sau liên lạc An Nam đinh gặp quán café thành phố Vì chuyển đến nên Nam chọn địa điểm đường Địa nhà An, Nam quán café thành phố đánh số từ đến N, giúp bạn tìm quán café gần nhà hai bạn đường cho Nam đến quán 74 Dữ liệu vào: từ file DIADIEM.INP + Dòng đầu ghi số nguyên N, u, v u v địa điểm nhà bạn Nam An + Các dòng dòng ghi số nguyên x, y, z z độ dài đường từ điểm x đến y Dữ liệu ra: ghi vào file DIADIEM.OUT + Dòng đầu địa điểm m quán café mà hai bạn chọn + Dòng thứ tổng tổng độ dài đường hai bạn Nam An đến m + Dòng thứ đường từ nhà bạn Nam đến quán café m Ví dụ: DIADIEM.IPN 735 14 10 13 15 28 30 35 40 563 675 DIADIEM.OUT 36 6←5←3 Hƣớng dẫn: Áp dụng giải thuật Dijkstral để tìm đường ngắn từ nhà An nhà Nam đến tất quan café thành phố, quán café chọn quán có tổng độ dài ngắn từ nhà Nam An đến quán 75 MỤC LỤC Chuyên đề: PHÂN TÍCH THIẾT KẾ THUẬT TOÁN PHẦN 1: THUẬT TOÁN VÀ PHÂN TÍCH THUẬT TOÁN I KHÁI NIỆM BÀI TOÁN VÀ THUẬT TOÁN 1 Khái niệm toán Khái niệm thuật toán: Các bước giải toán máy tính: a Xác định toán: b Thiết kế lựa chọn thuật toán: c Viết chương trình: d Kiểm thử hiệu chỉnh: e Viết tài liệu II PHÂN TÍCH THUẬT TOÁN Độ phức tạp thuật toán: a Dùng mẫu chuẩn b Phân tích thuật toán Kí pháp độ phức tạp thuật toán Các cách xác định độ phức tạp thuật toán a Quy tắc số b Quy tắc cộng c Quy tắc lấy max d Quy tắc nhân Các thuật ngữ thường dùng cho độ phức tạp thuật toán 5 Đánh giá thời gian thực chương trình Một số ví dụ BÀI TẬP PHẦN 2: THIẾT KẾ THUẬT TOÁN I THUẬT TOÁN DUYỆT Phương pháp: Giải toán cấu hình tổ hợp thuật toán duyệt 10 a Tổ hợp: 10 b Chỉnh hợp lặp: 12 c Chỉnh hợp không lặp: 13 Bài toán quân hậu 15 BÀI TẬP 17 II THUẬT TOÁN SẮP XẾP 18 Tầm quan trọng toán xếp: 18 Sắp xếp xếp 18 Phát biểu toán: 18 Các thuật toán xếp đơn giản: 19 a Sắp xếp bọt (sắp xếp tráo đổi - Bubble Sort): 19 b Sắp xếp chọn (Selection Sort): 20 c Sắp xếp thêm dần (sắp xếp xen - Insertion Sort): 22 Thuật toán xếp nhanh (QuickSort): 23 Thuật toán xếp hòa nhập (trộn) hai đường trực tiếp (MergeSort): 24 a Trộn hai dãy xếp: 24 b Hòa nhập hai đường trược tiếp 26 BÀI TẬP 27 76 Chuyên đề: PHƢƠNG PHÁP QUY HOẠCH ĐỘNG 31 I GIỚI THIỆU 31 II CẤU TRÚC CHUNG CỦA CHƢƠNG TRÌNH CHÍNH: 32 III CÁC BƢỚC ĐỂ GIẢI BÀI TOÁN QUY HOẠCH ĐỘNG: 32 IV MỘT SỐ VÍ DỤ 32 Dãy Fibonaci: 32 Tổ hợp chập k n phần tử: 33 Dãy không giảm liên tục dài 34 Tìm dãy không giảm dài nhất: 34 Bài toán balô 1: 36 Bài toán ba lô 38 Bài toán ba lô 40 Bài toán xâu chung dài 42 Bài toán chia kẹo 44 10 Bài toán đổi tiền 44 V BÀI TẬP 45 Chuyên Đề: LÝ THUYẾT ĐỒ THỊ 51 I MỘT SỐ KHÁI NIỆM 51 II BIỂU DIỄN ĐỒ THỊ 52 Danh sách đỉnh kề 52 Ma trận kề 53 Danh sách cạnh 53 III DUYỆT ĐỒ THỊ 54 Tìm kiếm theo chiều sâu 54 a Ý tưởng: 54 b Giải thuật 54 c Chương trình: 54 d Mở rộng: {Khử đệ quy} 55 Tìm kiếm theo chiều rộng 56 a Ý tưởng: 56 b Giải thuật: 56 c Chương trình: 56 IV TÍNH LIÊN THÔNG TRONG ĐỒ THỊ 57 V CHU TRÌNH TRONG ĐỒ THỊ 59 VI ĐƢỜNG ĐI NGẮN NHẤT 60 Một nguồn đích 60 a Bài toán: 60 b Giải thuật 61 c Nhận xét giải thuật 63 d Vấn đề đường thuật toán Dijkstra 63 Một nguồn đích 64 Bài toán nguồn đích 65 VII CÂY KHUNG VÀ CÂY KHUNG CỰC TIỂU 66 Cây khung 66 Tìm khung theo chiều sâu khung theo chiều rộng 66 a Cây khung theo chiều sâu 67 b Cây khung theo chiều rộng 68 Cây khung cực tiểu 68 a Khái niệm 68 77 b Bài toán: 68 c Giải thuật Prim 69 d Giải thuật Karuskal 70 e So sánh Prim Karuskal 70 BÀI TẬP 70 TÀI LIỆU THAM KHẢO [1] Tài liệu giáo khoa chuyên Tin Quyển 1, 2, – Hồ Sỹ Đàm (chủ biên) [2] Tuyển chọn toán Tin học – Nguyễn Xuân My (chủ biên) [3] 150 Bài toán Tin học – Lê Minh Hoàng [4] Một số vấn đề chọn lọc Tin Học – Nguyễn Xuân My [5] Cấu trúc liệu giải thuật – Lê Minh Hoàng [6] Cấu trúc liệu giải thuật – Đỗ Xuân Lôi [7] Giải thuật lập trình – Lê Minh Hoàng [8] Programming Challenges – Miguel A Revilla [9] The Algorithm Design Manual – Steven S Skiena 78 [...]... 3 3 5 6 10 10 10 10 12 12 * Chương trình: PROCEDURE SelectionSort; VAR i,j,LowIndex: integer; LowKey: KeyTYPE; BEGIN {1} FOR i := 1 TO n-1 DO BEGIN {2} LowIndex := i; {3} LowKey := a[i].key; {4} FOR j := i+1 TO n DO {5} IF a[j].key < LowKey THEN BEGIN {6} LowKey := a[j].key; {7} LowIndex := j; END; {8} Swap(a[i],a[LowIndex]); END; END; * Đánh giá độ phức tạp: Các lệnh: {2}, {3}có thời gian thực hiện... chuyên đề quy hoạch động Sau đây tôi xin được giới thiệu một số kinh nghiệm trong việc sử dụng phương pháp quy hoạch động để giải một số bài toán trong tin học Quy hoạch động là một phương pháp nhằm giảm thời gian chạy của các thuật toán thể hiện các tính chất của các bài toán con gối đầu nhau (overlapping subproblem) và cấu trúc con tối ưu (optimal substructure) Phương pháp quy hoạch động do nhà toán... vào: File DOAN.INP có các thông tin - Dòng đầu tiên chứa hai số nguyên a0, b0 và số n - Dòng thứ 2 chứa các cặp số nguyên dương ai, bi (i= 1, n ) 29 Dữ liệu ra: File DOAN.OUT có các thông tin - Dòng đầu tiên: ghi từ Yes hoặc No tùy theo có tồn tại đoạn riêng hay không - Từ dòng thứ 2 trở đi ghi các đoạn riêng nếu có (mỗi đoạn riêng trên một dòng) Ví dụ: DOAN.INP -3 5 4 -8 -2 8 20 -1 3 4 6 DOAN.OUT YES... x:=a[(L+H) div 2]; REPEAT WHILE a[i].key < x.key DO inc(i); WHILE a[j].key > x.key DO inc(j); IF ij; IF L