Một số phương pháp tiếp cận bài toán tin hoc 1 CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự do – Hạnh phúc SÁNG KIẾN KINH NGHIỆM MỘT SỐ PHƯƠNG PHÁP TIẾP CẬN BÀI TOÁN, LÀM GIẢM ĐỘ PHỨC TẠP[.]
CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh phúc SÁNG KIẾN KINH NGHIỆM: MỘT SỐ PHƯƠNG PHÁP TIẾP CẬN BÀI TOÁN, LÀM GIẢM ĐỘ PHỨC TẠP CỦA THUẬT TỐN -1- Quảng Bình, tháng 12 năm 2018 skkn MỤC LỤC MỤC LỤC I MỞ ĐẦU Lý chọn đề tài Điểm đề tài .3 Phạm vi áp dụng đề tài II NỘI DUNG Thực trạng vấn đề cần nghiên cứu Biện pháp tiến hành .4 Dạng 1: Một số toán duyệt .5 Bài 1: Sắp xếp Bài 2: Tích lớn Bài 3: Tổng số lớn Dạng 2: Sử dụng thuật toán chia để trị để giảm độ phức tạp toán .14 Bài 1: Chọn dãy số 14 Bài 2: Hieu 16 Đánh giá kết thực nghiệm .18 III KẾT LUẬN 19 IV TÀI LIỆU THAM KHẢO 20 -2- skkn I PHẦN MỞ ĐẦU Lý chọn đề tài Bài toán tin học toán xuất phát từ toán thực tế, việc xây dựng giải thuật để giải tốn tin học máy tính phải bảo đảm tính chất thuật tốn, tính chất chất u cầu thuật tốn sau cài đặt chương trình máy tính ngơn ngữ lập trình thuật tốn phải chạy nhanh, tốn thời gian nhớ Đây yêu cầu quan trọng học sinh tham gia đội tuyển học sinh giỏi Điều thể rõ nhiều toán qua đề thi học sinh giỏi Tỉnh năm gần Trong toán thường yêu cầu chia thành nhiều mức nhằm mục đích phân loại trình độ học sinh Mức độ khó tốn phụ thuộc nhiều vào vào độ lớn liệu đầu vào nên vấn đề việc chọn giải thuật kết địi hỏi chương trình phải chạy hết test lớn đơn vị thời gian quy định toán đạt mức điểm tối đa Để đảm bảo u cầu đó, địi hỏi giải thuật để giải tốn phải có độ phức tạp tính tốn nhỏ tốt Khi tiếp cận với toán, tùy theo trình độ học sinh mà học sinh có cách phân tích tốn lựa chọn thuật tốn khác để giải Đối với học sinh có trình độ chưa cao, chưa có khả phân tích tốn tốt thường lựa chọn thuật tốn đơn giản, có độ phức tạp lớn đồng nghĩa với số điểm nhận thấp Để có kết tốt hơn, địi hỏi học sinh phải có trình độ cao hơn, kỹ phân tích tốn tốt để tìm thuật tốn tốt có độ phức tạp tính tốn nhỏ Đây vấn đề mà giáo viên tin học tham gia bồi dưỡng đội tuyển học sinh giỏi ln coi trọng Địi hỏi giáo viên phải tìm phương pháp phù hợp cho đối tượng học sinh để giúp học sinh bước tiếp cận toán tin học từ đơn giản đến phức tạp phù hợp với lực để dành điểm số cao Với lý tơi chọn đề tài sáng kiến kinh nghiệm với nhan đề: “Một số phương pháp tiếp cận toán, làm giảm độ phức tạp thuật toán” Điểm đề tài: Tính đề tài thể việc thu thập số toán sữ dụng bồi dưỡng học sinh giỏi số đề thi cấp tỉnh từ phân loại tốn theo dạng, phân tích dạng tốn theo chủ đề dựa thuật toán đến nâng cao để tìm cách xây dựng giải thuật tốt cho việc giải dạng toán giống dạng tương tự Phạm vi áp dụng đề tài: Đề tài áp dụng bồi dưỡng HSG 11 năm học 2017-2018 -3- skkn II NỘI DUNG 1.Thực trạng vấn đề cần nghiên cứu: Trong trình bồi dưỡng học sinh gỏi vấn đề phát triển kỹ cho học sinh địi hỏi người giáo viên phải thường xun tìm tịi phương pháp, phải có hệ thống tập từ đơn giản đến nâng cao để phát triển kỹ thường xuyên cho học sinh đáp ứng yêu cầu ngày cao toán tin học Khi tiếp xúc với toán tin học, học sinh thường cố gắng tìm thuật tốn tốt để giải trọn vẹn toán, tốn đơn giản học sinh tìm thuật toán toán khó đặc biệt tốn có liệu đầu vào lớn việc tìm thuật tốn tối ưu để đạt số điểm tối đa thường khó Học sinh khơng nghĩ sử dụng giải thuật đơn giản để giải tốn khó cho dù khơng đạt số điểm tối đa có điểm số mức độ phù hợp với khả để tránh điểm khơng Đây kinh nghiệm cần thiết học sinh giỏi tham gia ký thi HSG môn tin học Trước áp dụng sáng kiến kinh nghiệm kết khảo sát cho học sinh giỏi khối 11 là: - Mức điểm giỏi: 0% - Mức điểm khá: 30% - Mức điểm TB: 55% - Mức điểm yếu: 15% Để rèn luyện kỹ tiếp cận toán nhằm giúp học sinh có kinh nghiệm tiếp cận tốn khó nhiều thuật tốn theo bước từ đơn giản đến phức tạp phù hợp với khả để có điểm số tốt địi hỏi người giáo viên cần rèn luyện kỹ tiếp cận toán để làm giảm độ phức tạp toán Biện pháp tiến hành Để giải tốn tin học máy tính thường phải thực theo bước: Bước bước quan trọng hiểu rõ nội dung toán Đây yêu cầu quen thuộc người làm toán Để hiểu toán theo cách tiếp cận tin học ta phải gắng xây dựng số ví dụ phản ánh yêu cầu đề đầu thử giải ví dụ để hình thành dần hướng thuật tốn Bước thứ hai dùng ngơn ngữ quen thuộc, tốt ngơn ngữ tốn học đặc tả đối tượng cần xử lí mức độ trừu tượng, lập tương quan, xây -4- skkn dựng hệ thức thể quan hệ đại lượng cần xử lí để có thuật tốn tốt Bước thứ ba xác định cấu trúc liệu để biểu diễn đối tượng cần xử lí cho phù hợp với thao tác thuật toán Trong bước ta tiếp tục làm mịn dần đặc tả theo trình tự từ xuống, từ trừu tượng đến cụ thể, từ đại thể đến chi tiết Bước cuối sử dụng ngơn ngữ lập trình chọn để viết chương trình hồn chỉnh Ở bước ta tiến hành theo kĩ thuật từ lên, từ thao tác nhỏ đến thao tác tổ hợp Sau nhận chương trình ta cho chương trình chạy thử với liệu lấy từ ví dụ xây dựng bước Chúng ta vận dụng cách tiếp cận để giải số toán cụ thể chủ yếu bước thứ hai để tìm thuật tốn tốt Sau số phương pháp cụ thể để tối ưu độ phức tạp tính tốn giải thuật Dạng 1: Một số toán duyệt Bài 1: Sắp xếp Cho dãy X gồm N số nguyên phạm vi từ -10000 đến 10000 (1 N 65000) Hãy xếp dãy số theo thứ tự giảm dần Dữ liệu vào cho file văn SORT.INP dịng đầu chứa số N Dòng thứ chứa N số i dãy X, số cách khoảng trắng Kết ghi file văn với tên SORT.OUT ghi phần tử dãy X xếp Ví dụ: SORT.INP SORT.OUT 5433 3435 Lời giải: + Nếu sử dụng thuật tốn xếp thơng thường Quick Sort độ phức tạp tính tốn O(Nlog2N) + Đối với này, để thuật toán chạy nhanh ta sử dụng phương pháp xếp đếm phân phối với độ phức tạp giảm tới O(N) số dãy đôi khác Gọi Di số lần xuất số có giá trị i dãy Như lần đọc số có giá trị i dãy ta tăng Di lên đơn vị Đoạn chương trình sau đọc tất số dãy để tạo mảng D chứa tần suất xuất số dãy số cho: For i:=1 to N Begin Read(x); -5- skkn D[x]:=D[x]+1; End; Vấn đề lại dựa vào mảng D để in số dãy theo thứ tự giảm dần Đoạn chương trình sau in dãy số cho theo thứ tự giảm dần For i:=10000 downto -10000 If D[i]>0 then For j:=1 to D[i] writeln(i); Chương trình: Const fi='sort.inp'; fo='sort.out'; Var D: array[-10000 10000] of Word; n, i: longint; f, f1: text; BEGIN Assign(f,fi); Reset(f); Assign(f1,fo); Rewrite(f1); Fillchar(D,sizeof(D),0); Readln(f,n); For i:=1 to n Begin Readln(f,x); Inc(D[x]); End; For i:=10000 downto -10000 If D[i]>0 then For j:=1 to D[i] write(f1,i,' '); Close(f); Close(f1); END Bài 2: Tích lớn Cho dãy gồm N số nguyên Hãy tìm số dãy với tích T chúng lớn Dữ liệu: Vào từ file văn TICHMAX.INP: - Dòng đầu ghi số N (3 N 10000) -6- skkn - Dịng thứ hai chứa N số ngun có giá trị tuyệt đối không vượt 1000 Kết quả: Ghi file văn TICHMAX.OUT số T Ví dụ: TICHMAX.INP 9 -3 10 TICHMAX.OUT 810 Lời giải: + Cách tiếp cận tầm thường: Sử dụng thuật toán duyệt vét cạn với độ phức tạp O(n3) sau: KQ:=MinInt; For i:=1 to n-2 For j:=i+1 to n-1 For k:=1 to n If a[i]*a[j]*a[k] > KQ then KQ:=a[i]*a[j]*a[k]; + Chúng ta có cách tiếp cận sau đưa độ phức tạp thuật tốn O(n) Nếu tích lớn phần tử bao gồm: - Ba số dương: Ba số phải số lớn nhất, nhì, ba dãy - Một số âm hai số dương: Dãy phải gồm hai số dương, khơng ta lấy tích ba số dương để đạt giá trị lớn Ta suy ba số phải ba số lớn nhất, nhì, ba dãy - Hai số âm số dương: Số dương phải số lớn hai số âm phải hai số nhỏ nhất, nhì dãy - Ba số âm: Dãy phải gồm tồn số âm, có số dương ta lấy tích số dương hai số âm để thu tích dương Ta suy ba số cần tìm phải ba số lớn nhất, nhì, ba dãy Vậy suy ra, T=max(max1*max2*max3,min1*min2*max1), với max1, max2, max3, min1, min2 số lớn nhất, nhì, ba số nhỏ nhất, nhì dãy Ta đọc qua số dãy cập nhật max1, max2, max3, min1, min2 mà không cần lưu lại dãy số Đoạn lệnh cập nhật min1, min2 đọc vào số x: If (x=max1) then Begin max3:=max2; max2:=max1; max1:=x; End Else If (x>=max2) then Begin max3:=max2; max2:=x; End -8- skkn Else if (x>=max3) then max3:=x; If (x