ĐÁNH GIÁ độ PHỨC tạp của THUẬT TOÁN THÔNG QUA các ví dụ

14 1.1K 0
ĐÁNH GIÁ độ PHỨC tạp của THUẬT TOÁN THÔNG QUA các ví dụ

Đ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 A Phần mở đầu I Lý chọn đề tài II Mục đích đề tài .1 III Nhiệm vụ phương pháp nghiên cứu .1 VI Điểm kết nghiên cứu B Nội dung I Khái niệm độ phức tạp thuật toán II Đánh giá độ phức tạp thuật toán 2.1 Quy tắc đánh giá độ phức tạp thuật toán .3 2.2 Đánh giá độ phức tạp thuật toán thông qua đề thi học sinh giỏi tỉnh Thanh hóa năm học 2016-2017 C Phần kết luận .13 A PHẦN MỞ ĐẦU I LÝ DO CHỌN ĐỀ TÀI Trong trình tham gia giảng dạy bồi dưỡng học sinh giỏi môn Tin học việc đánh giá độ phức tạp thuật toán công việc quan trọng Khi tiếp xúc trực tiếp với giáo viên học sinh phổ thông địa bàn tỉnh Thanh Hóa gần có nhiều thầy cô em học sinh chưa hiểu rõ cách đánh giá độ phức tạp thuật toán Trong kỳ thi học sinh giỏi, thuật toán cho kết thời gian thực thuật toán lớn thời gian quy định làm không điểm tối đa Thông thường giới hạn thời gian test kỳ thi chọn học sinh giỏi Tỉnh Thanh Hóa 1giây (1s/1test) Với lại thực tế, tài liệu viết cách đánh giá độ phức tạp thuật toán hạn hẹp việc tự đọc để hiểu tài liệu gặp nhiều khó khăn Từ lí trên, xin trình bày sáng kiến kinh nghiệm “ ĐÁNH GIÁ ĐỘ PHỨC TẠP CỦA THUẬT TOÁN THÔNG QUA DỤ ”, để giúp giáo viên học sinh hiểu rõ cách đánh giá độ phức tạp thuật toán II MỤC ĐÍCH CỦA ĐỀ TÀI Việc đánh giá độ phức tạp thuật toán quan trọng kỳ thi học sinh giỏi cần thiết Đề tài giúp giáo viên học sinh có tài liệu tự đọc hiểu cách đánh giá độ phức tạp thuật toán Từ giải toán kỳ thi học sinh giỏi: với cách làm tính độ phức tạp bao nhiêu? Khi biết đánh giá độ phức tạp toán biết tầm điểm? III NHIỆM VỤ VÀ PHƯƠNG PHÁP NGHIÊN CỨU Viết sáng kiến kinh nghiệm thường xuyên liên tục nhiệm vụ trị giáo viên, cần phải lựa chọn phương pháp nghiên cứu đắn phù hợp với nhà trường trung học phổ thông Sáng kiến kinh nghiệm trình bày dựa theo luận khoa học hướng đối tượng, cụ thể: thuyết trình, quan sát, điều tra bản, phân tích kết thực nghiệm sư phạm,v.v… phù hợp với học môn học thuộc lĩnh vực Tin học IV ĐIỂM MỚI TRONG KẾT QUẢ NGHIÊN CỨU Giúp cho hầu hết học sinh sau làm biết điểm Ngoài ra, mạnh dạn trình bày sáng kiến kinh nghiệm để phục vụ cho giáo viên trình dạy đội tuyển rèn luyện cho học sinh cách đánh giá độ phức tạp thuật toán B PHẦN NỘI DUNG I KHÁI NIỆM ĐỘ PHỨC TẠP CỦA THUẬT TOÁN Nói độ phức tạp thuật toán độ phức tạp thời gian quan trọng nhất, thuật toán cho kết thời gian thực thuật toán cần khoảng thời gian lớn chấp nhận (Ví dụ toán tháp Hà Nội dùng đệ quy để tính toán với tốc độ máy tính phải giải khoảng vài ngàn năm) Do yêu cầu thời gian đưa Thuật toán gọi hay phải có thời gian thực ngắn tiết kiệm tài nguyên máy tính Sự hao phí tài nguyên máy tính liên quan đến phần cứng máy tính thuật toán đưa thường lấy thời gian để tính độ phức tạp tài nguyên (vì máy khác tài nguyên) vậy, độ phức tạp thuật toán thời gian thực thuật toán Ký hiệu độ phức tạp thuật toán O lớn Ta có tính chất O(f(x)+g(x))=max (O(f(x)), O(g(x))) II ĐÁNH GIÁ ĐỘ PHỨC TẠP CỦA THUẬT TOÁN 2.1 Quy tắc đánh giá độ phức tạp thuật toán Ở hiểu nôm na đánh giá mặt thời gian Và cách hiểu thông thường số lần lặp tối đa đoạn chương trình - dụ 1: Xét câu lệnh x:= x+1; Độ phức tạp câu lệnh O(1) câu lệnh đơn thực lần - dụ 2: Xét câu lệnh sau: For i:= to 10 x:= x+ 1; Câu lệnh lặp 10 lần, lần lặp thực lệnh đơn x:= x+1 suy câu lệnh có độ phức tạp O(10) - dụ 3: Xét câu lệnh sau: For i:= to n x:= x+ 1; Câu lệnh lặp n lần, nên độ phức tạp thuật toán O(n) - dụ 4: Xét câu lệnh sau: For i:= to n For j:=1 to n x:= x+ a; Đây câu lệnh For lồng nhau, nên lặp n2 lần, suy độ phức tạp thuật toán O(n2) - dụ 5: Xét đoạn chương trình sau: x:= 1; for i:= for i:= for //O(1) to n x:= x+i; //O(n) to n j:= to n x:= x+1; //O(n2) Độ phức tạp đoạn chương trình max(O(1), O(n), O(n 2)) = O(n2) - dụ 6: Xét đoạn chương trình tìm kiếm nhị phân sau: dau:=1; cuoi:= n; while dau tim then cuoi:=giua -1; else dau:= giua +1; end; Câu lệnh dau:=1; cuoi:= n; câu lệnh đơn có độ phức tạp O(1) Còn khối lệnh phía sau đoạn tìm kiếm nhị phân mảng có n phần tử a[1], a[2], a[3], a[n] Nó chia đôi để tìm Suy số lần tối đa việc chia đôi độ phức tạp thuật toán Giả sử số lần chia đôi k, ta dễ dàng thấy 2k = n Từ suy k = log2n Độ phức tạp đoạn chương trình O(log2 n) hay nói cách ngắn gọn O(log n) - dụ 7: Xét đoạn chương trình xếp sau: For i:= to n-1 For j:=i+1 to n If a[i]>a[j] then Begin Tg:= a[i]; A[i]:= a[j]; A[j]:= tg; End; Ta thấy đoạn chương trình có cấu trúc for lồng nhau, sau lệnh for câu lệnh đơn      Khi i=1 lặp n-1 lần; Khi i=2 lặp n-2 lần; Khi i=3 lặp n-3 lần; Khi i=n-1 lặp lần; Vậy số lần lặp tối đa đoạn chương trình là: (n-1) + (n-2) + (n-3) + + + Đây tổng số tự nhiên từ đến n-1 Áp dụng công thức cấp số cộng ta kết n(n − 1) n(n − 1) Vậy độ phức tạp thuật toán O( ) 2 Khi n lớn ta thấy độ phức tạp sấp sĩ O(n2) 2.2 Đánh giá độ phức tạp thuật toán thông qua đề thi học sinh giỏi tỉnh Thanh hóa năm học 2016-2017 Như biết kỳ thi học sinh giỏi, giây máy tính chạy tầm 5.108 phép tính đề cho giới hạn N ≤ 10 thuật toán làm phải bé O(nlog n) chạy hết tất test (có giới hạn 1s/1test) Còn ta làm thuật toánđộ phức tạp O(n2) không ăn hết tất test giây Ta cần tính đơn giản, n=105 n2=1010, mà theo 1010 phép tính chạy giây Bài 1: (5 điểm) Tổng nguyên tố Cho số nguyên dương N (N ≤ 105) Yêu cầu: Tìm số cặp số nguyên dương x, y cho: - x, y số nguyên tố - x+y=N - x≤y Dữ liệu vào: Vào từ file văn BAI1.INP gồm số N Kết quả: Đưa file văn BAI1.OUT số số cặp số tìm dụ: BAI1.INP BAI1.OUT 10 Code : const fi='bai1.inp'; fo='bai1.out'; var n,i,j: longint; res: longint; function ngto(x: longint): boolean; //O( x -1) var i: longint; begin ngto:= true; for i:= to trunc(sqrt(x)) if x mod i = then begin ngto:= false; break; end; end; BEGIN assign(input, fi); reset(input); assign(output, fo); rewrite(output); readln(n); res:=0; for i:=2 to n div if ngto(i) and ngto(n-i) then inc(res); writeln(res); close(output); END n n Rễ dàng nhận thấy độ phức tạp thuật toán O(( − )* − )) Hay 2 hiểu ngắn gọn O(n n ) Bài 2: (5 điểm) Kí tự khác Cho xâu S gồm kí tự chữ tiếng anh chữ số (có phân biệt chữ in hoa, in thường) Yêu cầu: Hãy xác định số kí tự khác xâu S kí tự xuất lần Dữ liệu vào: Vào từ file văn BAI2.INP gồm dòng xâu kí tự S (có độ dài không 255) Kết quả: Kết ghi file văn BAI2.OUT gồm: - Dòng đầu ghi số kí tự khác - Các dòng tiếp theo, dòng ghi kí tự xuất xâu S số lần xuất Các kí tự đưa theo thứ tự chữ in hoa, in thường, chữ số Các chữ cái, chữ số đưa theo thứ tự từ điển dụ: BAI2.INP AzB1C9A1BC BAI2.OUT A2 B2 C2 z1 12 91 Code : const fi='bai2.inp'; fo='bai2.out'; var dem: array['0' 'z'] of longint; st: string; res,i: longint; ch: char; BEGIN assign(input, fi); reset(input); assign(output, fo); rewrite(output); readln(st); for ch:='0' to 'z' dem[ch]:=0; //O(75) for i:= to length(st) inc(dem[st[i]]); //O(length(st)) res:=0; for ch:='0' to 'z' //O(75) if dem[ch]>0 then inc(res); writeln(res); for ch:= 'A' to 'z' //O(26) if dem[ch]>0 then writeln(ch,' ',dem[ch]); for ch:= '0' to '9' //O(10) if dem[ch]>0 then writeln(ch,' ',dem[ch]); close(output); END Ở phải nhớ số ký tự bảng mã ASCII để tính số lần lặp câu lệnh Câu lệnh for ch:='0' to 'z' dem[ch]:=0; lặp 75 lần (Vì ký tự O trong bảng mã 48, ký tự z bảng mã 122) Tương tự ta có độ phức tạp câu lệnh code Suy độ phức tạp code O(length(st)) = O(255) Bài 3: (4 điểm) Hẹn gặp Thành phố Gloaming (Hoàng hôn) tiếng với đường dẫn vào công viên thành phố Các tượng tuyệt đẹp theo chủ đề thần thoại Hy lạp – La mã đặt dọc theo đường thẳng có sức hút không cưỡng với khách du lịch Còn tia nắng cuối ngày miễn cưỡng rời khỏi bầu trời sương mù dày đặc, voan trắng mềm mại từ từ rũ xuống Bây đứng cách r mét không nhìn thấy mặt tượng trở thành nơi lý tưởng cho đôi nam nữ niên hẹn hò James Bond cần gặp gấp điệp viên nội tuyến để nhận mật báo khẩn Không muốn người nhìn thấy nhau, Bond hẹn gặp người tượng cho khoảng cách chúng lớn r Trên đường có n tượng, tượng thứ i vị trí cách đầu đường di mét i = ÷ n, ≤ d1< d2 < < dn ≤ 109 Yêu cầu: Hãy xác định James Bond có cách chọn địa điểm Dữ liệu vào: Vào từ file văn BAI3.INP: - Dòng chứa số nguyên n r (1 ≤ n ≤ 3×105, ≤ r ≤ 109) - Dòng thứ chứa n số nguyên d1, d2, , dn Kết quả: Đưa file văn BAI3.OUT số nguyên số cách chọn địa điểm tìm dụ: BAI3.INP 44 1358 BAI3.OUT Rằng buộc: - Có ½ số test tương ứng với ½ số điểm có n ≤ 104 - Có ½ số test tương ứng với ½ số điểm có 104 < n ≤ 3×105 Code : const fi='bai3.inp'; fo='bai3.out'; maxn= 300001; var d: array[1 maxn] of longint; res: int64; i,n,r,kq: longint; dau,cuoi,giua: longint; BEGIN assign(input, fi); reset(input); assign(output, fo); rewrite(output); readln(n,r); for i:= to n read(d[i]); res:=0; for i:=1 to n-1 begin dau:=i+1; cuoi:= n; kq:=n+1; while dau r then begin cuoi:=giua -1; kq:= giua; end else dau:= giua +1; end; res:= res+n-kq+1; end; writeln(res); close(output); END Độ phức tạp code O((n-1)log(n)) hay nói ngắn gọn O(nlog(n)) Bài 4: (3 điểm) Tập số Cho số tự nhiên N (1 ≤ N ≤ 106) tập A gồm số tự nhiên khác xác định sau: - thuộc A - Nếu k thuộc A 2k+1 3k+1 thuộc A Yêu cầu: Giả sử tập A xếp theo thứ tự tăng dần Hãy tìm phần tử thứ N tập A Dữ liệu vào: Vào từ file văn BAI4.INP gồm dòng chứa số N Kết quả: Ghi file văn BAI4.OUT gồm số phần tử thứ N tập A tìm 10 dụ: BAI4.INP BAI4.OUT 15 Rằng buộc: Có Có Code : - số test tương ứng với số test tương ứng với số điểm có N ≤ 104 số điểm có 104 < N ≤ 106 const fi='bai4.inp'; fo='bai4.out'; maxn= round(7e7); // Nghĩa maxn = 7.107 var i,n: longint; a: array[1 maxn] of boolean; dem: longint; BEGIN assign(input, fi); reset(input); assign(output, fo); rewrite(output); readln(n); for i:= to maxn a[i]:= false; a[1]:= true; for i:=1 to maxn div if a[i]=true then begin if 2*i+1

Ngày đăng: 17/10/2017, 09:29

Từ khóa liên quan

Mục lục

  • Tài liệu tham khảo

Tài liệu cùng người dùng

Tài liệu liên quan