34 Trang 3 LỜI NÓI ĐẦU Việc xác định độ phức tạp tính toán của một thuật toán là một công việc không hề đơn giản, trước đây chúng ta ít quan tâm đến việc đánh giá thuật toán mà chỉ dừn
TRƢỜNG ĐẠI HỌC KHOA HỌC HUẾ KHOA CÔNG NGHỆ THÔNG TIN BÀI TẬP - TIỂU LUẬN THIẾT KẾ VÀ PHÂN TÍCH THUẬT TỐN Tiểu luận tài LỚP CAO HỌC: NGÀNH KHOA HỌC MÁY TÍNH GVHD: TS: HỒNG QUANG HVTH: CAO CHÍ HIỂN 0985945261 GIA LAI, 01/ 2019 MỤC LỤC LỜI NÓI ĐẦU PHẦN I: NỘI DUNG I: ĐỘ PHỨC TẬP THUẬT TOÁN Độ phức tạp thuật toán: 2: Bài tập: Bài 1: So sánh độ phức tập thuật toán O( N ) O(log n) Bài 2: Viết hàm tính an (với a real, n word) có độ phức tạp tính tốn O(1) II PHƢƠNG PHÁP ĐỆ QUY Tim hiểu đệ quy Bài tập Đệ quy kiểu liệu mảng Bài 3: Xóa tất phần tử dãy A gồm n phần tử có giá trị X Bài Viết chương trình tìm Max dạy A gồm n phần tử (n>0) Bài tập Đệ quy kiểu liệu danh sách liên kết đơn Bài 5: Xóa tất nút có trường Info giá trị x Bài 6: Tìm Max trường Info danh sách liên kết đơn Bài tập Đệ quy kiểu liệu nhi phân 12 Bài Viết hàm đếm số nút có trường Info = x 13 Bài Viết thủ tục đệ quy bổ sung nút vào tìm kiếm nhị phân 13 Cây tìm kiếm nhị phân: 13 III PHƢƠNG PHÁP QUY HOẠCH ĐỘNG Cơ sở lý thuyết 17 a) Tư tưởng phương pháp: 17 b) Phạm vi áp dụng: 17 c) Nguyên lý phương pháp: 17 Phƣơng pháp thực 17 Giải toán phƣơng pháp Quy hoạch động: (gồm bƣớc) 17 Một số toán Giải phƣơng pháp Quy hoạch động 17 Bài Bài toán túi nguyên (Số lượng loại đổ vật không hạn chế) 17 Bài 10 Bài tốn Sinh viên ơn thi 21 Bài 11 Người du lịch 25 Bài 12: Bài toán xâu cực đại: 30 TÀI LIỆU THAM KHẢO 34 Tiểu luận tài LỜI NĨI ĐẦU Việc xác định độ phức tạp tính tốn thuật tốn cơng việc khơng đơn giản, trước quan tâm đến việc đánh giá thuật toán mà dừng lại mức độ đưa thuật toán để giải tốn Tuy nhiên tốn có nhiều thuật tốn để giải Do ta phải lựa chọn thuật đoán tối ưu Độ phức tạp thuật toán sở để đánh giá thuật tốn có tốt thuật tốn khác hay khơng Đối với thuật tốn phức tạp việc xác định độ phức tạp cách xác khó khăn đặc biệt thuật toán sử dụng giải thuật đệ qui Trong phần náy, nhóm tơi đánh giá độ phức tạp số thuật toán Đưa số toán giải hệ thức truy hồi: - Dùng phương pháp Đệ quy để giải toán nhiều kiểu liệu như: Kiểu liệu bản, kiểu mảng, danh sách liên kết đơn, nhị phân Tiểu luận tài tìm kiếm nhị phân - Dùng phương pháp Quy hoạch động để giải số tốn tối ưu Đây nội dung đề tài tập tiểu luận nhóm em: THIẾT KẾ VÀ PHÂN TÍCH THUẬT TỐN Mặc dù cố gắng tiểu luận không tránh khỏi sai sót Nhóm chúng em mong nhận ý kiến góp ý thầy hướng dẫn bạn Xin chân thành cảm ơn TS HOÀNG QUANG tận tình hướng dẫn tạo điều kiện cho chúng em hồn thành mơn học Gia Lai, ngày 10 tháng 01 năm 2019 Học viên thực Cao Chí Hiển Trang: PHẦN I: NỘI DUNG I: ĐỘ PHỨC TẬP THUẬT TỐN Độ phức tạp thuật tốn: Thời gian mà máy tính thực thuật tốn khơng phụ thuộc vào thân thuật tốn đó, ngồi cịn tùy thuộc máy tính Để đánh giá hiệu thuật tốn, xét số phép tính phải thực thực thuật tốn Thơng thường số phép tính thực phụ thuộc vào cỡ toán, tức độ lớn đầu vào Vì độ phức tạp thuật toán hàm phụ thuộc đầu vào Tuy nhiên ứng dụng thực tiễn, khơng cần biết xác hàm mà cần biết ước lượng đủ tốt chúng Để ước lượng độ phức tạp thuật toán ta thường dùng khái niệm bậc O-lớn Bậc O-lớn: Gọi n độ lớn đầu vào Tùy thuộc toán mà n nhận giá trị khác Chẳng hạn, tốn tính giai thừa n số Tiểu luận tài cần tính giai thừa Nhiều tốn số trị, chẳng hạn tính sai phân n số chữ số có nghĩa cần đạt Trong phép tính ma trận n số hàng cột ma trận Độ phức tạp toán phụ thuộc vào n Ở ta không đặc trưng độ phức tạp số lượng phép tính, mà dùng đại lượng tổng quát tài nguyên cần dùng R(n) Đó số lượng phép tính (có thể tính số lần truy nhập nhớ, ghi vào nhớ); thời gian thực chương trình (độ phức tạp thời gian) dung lượng nhớ cần phải cấp để chạy chương trình (độ phức tạp không gian) Xét quan hệ tài nguyên độ lớn đầu vào, tìm số C>0, không phụ thuộc vào n, cho với n đủ lớn, hàm R(n),g(n) dương R(n) ≤ C.g(n) ta nói thuật tốn có độ phức tạp cỡ O(g(n)) Các độ phức tạp thường gặp thuật tốn thơng thường gồm có: Độ phức tạp số, O(1) Số phép tính/thời gian chạy/dung lượng nhớ không phụ thuộc vào độ lớn đầu vào Chẳng hạn thao tác hệ thống: đóng, mở Tập tin Trang: Độ phức tạp tuyến tính, O(n) Số phép tính/thời gian chạy/dung lượng nhớ có xu hướng tỉ lệ thuận với độ lớn đầu vào Chẳng hạn tính tổng phần tử mảng chiều Độ phức tạp đa thức, O(P(n)), với P đa thức bậc cao (từ trở lên) Chẳng hạn thao tác tính tốn với mảng nhiều chiều (tính định thức ma trận) Độ phức tạp logarit, O(log n) (chú ý: bậc thấp so với O(n)) Chẳng hạn thuật tốn Euclid để tìm ước số chung lớn Độ phức tạp hàm mũ, O(2n) Trường hợp bất lợi phi thực tế thực thuật toán với độ phức tạp 2: Bài tập: Bài 1: So sánh độ phức tập thuật toán O( N ) O(log n) Đặt g1(n) = N ; g2 (n) = log n g1(n) n n2 Ta có: lim lim lim n g 2( n) n log n log n n lim n ' Tiểu luận tài n.ln n (n ) n ' ( n) = lim lim n (log n)' n (log n)' n.ln lim n n lim n n lim n n Vậy g1(n) > g2 (n) O( N ) > O(log2 n) Bài 2: Viết hàm tính an (với a real, n word) có độ phức tạp tính tốn O(1) Phân tích thuật tốn Đặt b=an ta có trường hợp sau: - Nếu a=0 an=0 - Nếu a>0 ta có: b=an>0ln(b)=ln(an) b eln( a n ) e n.ln( a ) - Nếu a0 then LuyThua:=Exp(n*ln(a)) else begin a:=abs(a); if odd(n) then LuyThua:=-Exp(n*ln(a)) else LuyThua:=Exp(n*ln(a)); End End; { Thu tuc test ham LT} Procedure Xuly; Var a:real;n:byte; Begin Assign(fi,tfi); Reset(fi); Assign(fo,tfi); Rewrite(fo); While not eof(fi) begin read(fi,a,n); Writeln(fo,a:0:3,'^',n,'=',LuyThua(a,n):0:3); end; close(fi); close(fo); End; BEGIN Xuly; END Tiểu luận tài Kết thực Trang: II PHƢƠNG PHÁP ĐỆ QUY Tim hiểu đệ quy Đệ quy (tiếng Anh: recursion) phương pháp dùng chương trình máy tính có hàm tự gọi Định nghĩa theo đệ quy: Một khái niệm X định nghĩa theo đệ quy định nghĩa X có sử dụng khái niệm X Ví dụ 1: Định nghĩa số tự nhiên - số tự nhiên - n số tự nhiên n - số tự nhiên Đệ quy khoa học máy tính: Có phương pháp chung để giải toán chia toán thành toán đơn giản loại Phương pháp gọi k thuật lập trình chia để trị Chính chìa khóa để thiết kế nhiều giải thuật quan trọng, sở quy hoạch động Chƣơng trình đệ quy: Trong lập trình, có khái niệm: chương trình (hàm, thủ tục) gọi đệ quy q trình thực có phần phải gọi đến Tiểu luận tài Cấu trúc chính: Một chương trình đệ quy gồm hai phần Phần sở: chứa tác động hàm thủ tục với số giá trị cụ thể ban đầu tham số Phần đệ quy: định nghĩa tác động cần thực cho giá trị thời tham số tác động định nghĩa trước với kích thước tham số nhỏ Ví dụ: Hàm tính giai thừa số tự nhiên n (Đoạn mã sau viết ngôn ngữ Pascal) function gt(n: Word): Longint; begin if n = then gt:= else gt:= n * gt(n - 1); end; Trang: Bài tập Đệ quy kiểu liệu mảng Bài 3: Xóa tất phần tử dãy A gồm n phần tử có giá trị X Thủ tục: Procedure DeletePT(var n: word; x: integer); var tam: integer; begin if n > then if A[n] = x then begin n := n - 1; {Xoa phan tu tim thay} DeletePT(n, x); {Tiep tuc tim va xoa neu co} end else begin tam := A[n]; n := n - 1; DeletePT(n, x); n := n + 1; A[n] := tam; end; end; Chương trình Program TimMax; uses crt; const tfi ='D:\TTCaoHoc\DeletePT.inp'; tfo = 'D:\TTCaoHoc\DeletePT.out'; var A: Array[1 100] of integer; N, x, i : word; fi, fo : text; Procedure DocFile; var i : word; begin assign(fi,tfi); reset(fi); read(fi,n); read(fi, x); readln(fi); for i := to n read(fi,A[i]); close(fi); end; Procedure DeletePT(var n: word; x: integer); var tam: integer; begin if n > then if A[n] = x then begin n := n - 1; {Xoa phan tu tim thay} DeletePT(n, x); {Tiep tuc tim va xoa neu co} end else begin tam := A[n]; n := n - 1; DeletePT(n, x); n := n + 1; Tiểu luận tài Trang: A[n] := tam; end; end; Begin clrscr; Docfile; assign(fo,tfo); rewrite(fo); Writeln('So luong PT: N= ', N); for i := to N write(A[i],#32); writeln; writeln(' -'); DeletePT(n, x); Writeln('Xoa phan tu co gia tri: X= ', x); Writeln('So luong PT lai: N= ', N); writeln(fo, N); for i := to N begin write(A[i],#32); write(fo, A[i], #32); end; writeln; readln; End Kết quả: Tiểu luận tài Bài Viết chương trình tìm Max dạy A gồm n phần tử (n>0) Thủ tục Function Max(n: word): integer; begin if n = then Max :=A[1] else if A[n] > Max(N-1) then Max := A[n] else Max := Max(n-1); end; Cài đặt chương trình: Program TimMax; uses crt; const tfi ='D:\TTCaoHoc\dayso.inp'; tfo = 'D:\TTCaoHoc\MaxDQ.out'; var A: Array[1 100] of integer; N, i : word; fi, fo : text; Trang: Procedure DocFile; var i : word; begin assign(fi,tfi); reset(fi); read(fi,n); readln(fi); for i := to n read(fi,A[i]); close(fi); end; Function Max(n: word): integer; begin if n = then Max :=A[1] else if A[n] > Max(N-1) then Max := A[n] else Max := Max(n-1); end; Begin clrscr; assign(fo, tfo); rewrite(fo); Docfile; for i := to N write(A[i],#32); writeln; writeln(' -'); writeln(Max(N)); write(fo, 'Phan tu lon nhat: ',max(N)); close(fo); readln; End Tiểu luận tài Kết quả: Trang: