Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 14 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
14
Dung lượng
142 KB
Nội dung
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ứctạpthuậttoán II Đánhgiáđộphứctạpthuậttoán 2.1 Quy tắc đánhgiáđộphứctạpthuậttoán .3 2.2 Đánhgiáđộphứctạpthuậttoánthôngqua đề 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 đánhgiáđộphứctạpthuậttoá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 đánhgiáđộphứctạpthuậttoán Trong kỳ thi học sinh giỏi, thuậttoán cho kết thời gian thực thuậttoá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 đánhgiáđộphứctạpthuậttoá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 “ ĐÁNHGIÁĐỘPHỨCTẠPCỦATHUẬTTOÁNTHÔNGQUAVÍDỤ ”, để giúp giáo viên học sinh hiểu rõ cách đánhgiáđộphứctạpthuậttoán II MỤC ĐÍCH CỦA ĐỀ TÀI Việc đánhgiáđộphứctạpthuậttoá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 đánhgiáđộphứctạpthuậttoán Từ giải toán kỳ thi học sinh giỏi: với cách làm tính độphứctạp bao nhiêu? Khi biết đánhgiáđộphứctạptoá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 đánhgiáđộphứctạpthuậttoán B PHẦN NỘI DUNG I KHÁI NIỆM ĐỘPHỨCTẠPCỦATHUẬTTOÁN Nói độphứctạpthuậttoánđộphứctạp thời gian quan trọng nhất, thuậttoán cho kết thời gian thực thuậttoá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ậttoá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 Vì mà thuậttoán đưa thường lấy thời gian để tính độphứctạp tài nguyên (vì máy khác tài nguyên) Vì vậy, độphứctạpthuậttoán thời gian thực thuậttoán Ký hiệu độphứctạpthuậttoán O lớn Ta có tính chất O(f(x)+g(x))=max (O(f(x)), O(g(x))) II ĐÁNHGIÁĐỘPHỨCTẠPCỦATHUẬTTOÁN 2.1 Quy tắc đánhgiáđộphứctạpthuậttoán Ở hiểu nôm na đánhgiá 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 - Vídụ 1: Xét câu lệnh x:= x+1; Độphứctạp câu lệnh O(1) Vì câu lệnh đơn thực lần - Ví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ứctạp O(10) - Ví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ứctạpthuậttoán O(n) - Ví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ứctạpthuậttoán O(n2) - Ví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ứctạp đoạn chương trình max(O(1), O(n), O(n 2)) = O(n2) - Ví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ứctạ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ứctạpthuậttoánGiả sử số lần chia đôi k, ta dễ dàng thấy 2k = n Từ suy k = log2n Độphứctạp đoạn chương trình O(log2 n) hay nói cách ngắn gọn O(log n) - Ví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ứctạpthuậttoán O( ) 2 Khi n lớn ta thấy độphứctạp sấp sĩ O(n2) 2.2 Đánhgiáđộphứctạpthuậttoánthôngqua đề 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 Vì đề cho giới hạn N ≤ 10 thuậttoá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ậttoán có độphứctạ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 Ví 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ứctạpthuậttoá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 Ví 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ứctạp câu lệnh code Suy độphứctạ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 Ví 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ứctạ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 Ví 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