Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 47 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
47
Dung lượng
561,87 KB
Nội dung
Së GIÁO DỤC VÀ ĐÀO TẠO NGHỆ AN TRƯỜNG THPT NGUYỄN DUY TRINH -*** - SÁNG KIẾN KINH NGHIỆM “GIÚP HỌC SINH RÈN LUYỆN VÀ NÂNG CAO KỸ NĂNG LẬP TRÌNH QUA VIỆC LỰA CHỌN THUẬT TỐN TỐI ƯU PHÙ HỢP VỚI DỮ LIỆU BÀI TỐN” MƠN: TIN HỌC GIÁO VIÊN: NGUYỄN THỊ TÚ ANH TỔ: TOÁN TIN NĂM HỌC: 2020 – 2021 ĐT: 0942797783 NGHI LỘC, THÁNG 3/2021 MỤC LỤC I ĐẶT VẤN ĐỀ Lý chọn đề tài Mục đích nghiên cứu SKKN 3 Nhiệm vụ nghiên cứu SKKN 4 Đối tượng nghiên cứu SKKN Phương pháp thực Đóng góp SKKN II NỘI DUNG Cơ sở lí luận đề tài Thực trạng vấn đề trước áp dụng SKKN 2.1 Đặc điểm tình hình 2.2 Thực trạng trước nghiên cứu Các giải pháp giải vấn đề 3.1 Cơ sở lý thuyết 3.1.1 Độ phức tạp thuật toán 3.1.1.1 Tính hiệu thuật tốn 3.1.1.2 Tại cần thuật tốn có tính hiệu quả? 3.1.1.3 Đánh giá thời gian thực thuật toán 3.1.1.4 Các quy tắc đánh giá thời gian thực thuật toán 3.1.1.5 Ước lượng độ phức tạp thuật toán tương ứng với độ lớn liệu 10 3.1.2 Lựa chọn thuật toán 11 3.2 Lựa chọn thuật toán tối ưu phù hợp với liệu toán 11 3.2.1 Dạng 1: Các toán liên quan đến số học 12 3.2.2 Dạng 2: Sử dụng thuật toán xếp 20 3.2.2.1 Bài toán xếp 20 3.2.2.2 Bài tập ví dụ 23 3.2.3 Dạng 3: Sử dụng thuật tốn tìm kiếm 32 3.2.3.1 Bài tốn tìm kiếm 32 3.2.3.2 Bài tập ví dụ 34 3.2.4 Bài tập luyện tập 40 Tính SKKN 43 Hiệu SKKN 44 Những hướng phát triển đề tài 44 III KẾT LUẬN VÀ KIẾN NGHỊ 45 Kết luận 45 Kiến nghị 45 TÀI LIỆU THAM KHẢO 46 I ĐẶT VẤN ĐỀ Lý chọn đề tài Khi giải toán Tin học người lập trình ln mong muốn viết chương trình với thuật tốn tối ưu để giải với liệu lớn, thời gian thực nhanh, nhớ hạn chế…Tuy nhiên, toán Tin học thường đa dạng, phong phú nên để tìm thuật tốn tối ưu phù hợp liệu toán việc không dễ dàng Đây vấn đề nhiều giáo viên gặp khó khăn việc giảng dạy học sinh học lập trình, cơng tác ơn thi học sinh giỏi để đạt kết cao Ở trường phổ thông hàng năm thường diễn thi học sinh giỏi mơn học có mơn Tin học Bồi dưỡng học sinh giỏi nhiệm vụ cần thiết quan trọng giáo viên Do đó, việc nghiên cứu, tìm tịi, tích lũy kiến thức công việc thường nhật giáo viên nhằm nâng cao trình độ chun mơn nghiệp vụ, tích lũy kinh nghiệm cho thân.Trong năm gần mức độ yêu cầu đề thi học sinh giỏi ngày nâng cao, môn Tin học Các toán đề thi thường yêu cầu giải liệu vào lớn đòi hỏi thời gian thực nhanh (thường không giây) Những tốn thường khó học sinh, chương trình em thường khơng thực hết test yêu cầu, đặc biệt học sinh khơng chun Bởi vừa giải vấn đề liệu, vừa phải giải vấn đề thời gian Do giáo viên bồi dưỡng thường phải giúp học sinh rèn luyện kĩ lập trình Nghĩa khơng dừng lại việc hướng dẫn học sinh giải tốn, mà cịn phải giúp học sinh rèn luyện thói quen tư duy, cải tiến thuật tốn để chương trình tối ưu Trong lập trình tin học có nhiều phương pháp giải toán nêu Tuy nhiên tài liệu trình bày cụ thể cách lựa chọn thuật toán cho phù hợp với liệu toán để đạt độ tối ưu, đảm bảo giải yêu cầu toán đặt Qua q trình giảng dạy, học tập, tìm tịi đặc biệt tham gia bồi dưỡng học sinh giỏi nhiều năm qua, tơi tích lũy số kinh nghiệm vấn đề Do đó, tơi định viết sáng kiến kinh nghiệm: “Giúp học sinh rèn luyện nâng cao kĩ lập trình qua việc lựa chọn thuật toán tối ưu phù hợp với liệu tốn” Mục đích nghiên cứu SKKN - SKKN nêu định hướng giúp học sinh lựa chọn thuật tốn tối ưu phù hợp với liệu toán số dạng tốn quen thuộc ngơn ngữ lập trình C++ - Từ bồi dưỡng học sinh lực giải vấn đề giải toán Tin học, đồng thời rèn luyện nâng cao kĩ lập trình cho em Đặc biệt học sinh tham gia dự thi học sinh giỏi cấp tỉnh THCS, THPT thi vào trường chuyên 3 Nhiệm vụ nghiên cứu SKKN - SKKN phân tích thuật tốn dạng toán quen thuộc, so sánh độ phức tạp thuật toán định hướng lựa chọn thuật toán tối ưu trường hợp liệu cụ thể nhằm giải toán hiệu - Minh họa ví dụ cụ thể, liên hệ đề thi vào trường chuyên, đề thi học sinh giỏi tỉnh thời gian qua Đối tượng nghiên cứu SKKN - Độ phức tạp thuật toán giải pháp lựa chọn thuật toán tối ưu dạng toán quen thuộc ngơn ngữ lập trình C++ - Phương pháp bồi dưỡng lực giải vấn đề cho học sinh Phạm vi nghiên cứu SKKN - Chương trình Tin học THCS, THPT để bồi dưỡng học sinh giỏi Tin học thi vào trường chuyên THPT - Cách giải vấn đề học sinh Phương pháp thực - Nghiên cứu tài liệu - Thực bồi dưỡng học sinh giỏi - Trao đổi chuyên môn với bạn bè, đồng nghiệp để giải vấn đề - Thực nghiệm sư phạm Đóng góp SKKN - Sáng kiến trình bày số kinh nghiệm giúp học sinh rèn luyện nâng cao kĩ lập trình qua việc lựa chọn thuật tốn tối ưu phù hợp với liệu toán yêu cầu dạng tốn quen thuộc, thường có đề thi học sinh giỏi Tin học - Là tài liệu tham khảo để bồi dưỡng học sinh giỏi Tin học, học sinh thi trường chuyên có hiệu - Giúp bồi dưỡng học sinh lực giải vấn đề giải toán Tin học, rèn luyện nâng cao kỹ lập trình cho học sinh II NỘI DUNG Cơ sở lí luận đề tài Nghị hội nghị Trung ương VIII khóa XI nêu: “Đối với giáo dục phổ thông tập trung phát triển trí tuệ, thể chất, hình thành phẩm chất, lực công dân, phát bồi dưỡng khiếu, định hướng nghề nghiệp cho học sinh Nâng cao chất lượng giáo dục toàn diện, trọng giáo dục lý tưởng truyền thống đạo đức, lối sống, ngoại ngữ, tin học, lực kỹ thực hành, vận dụng kiến thức vào thực tiễn, phát triển khả sáng tạo tự học, khuyến khích học tập suốt đời" Toàn ngành sức phấn đấu xây dựng chương trình sách giáo khoa mới, đổi phương pháp dạy học theo định hướng hình thành phát triển lực Mục tiêu môn Tin học chương trình giáo dục phổ thơng giúp học sinh hình thành phát triển lực Tin học, đổi phương pháp dạy học nhằm góp phần thực tốt mục tiêu ngành giáo dục giai đoạn Mơn Tin học mơn học đặc thù có nhiều kiến thức khó Đặc biệt phần học lập trình lớp 11 Đây phần kiến thức đề thi học sinh giỏi tỉnh môn Tin học Trong số năm gần phát triển nhanh chóng khoa học kỹ thuật, tốc độ xử lí máy tính ngày cao Các đề thi thi lập trình ngày địi hỏi cao thời gian thực hiện, độ lớn liệu…Nên gây nhiều khó khăn việc ơn luyện cho thầy trò Một vấn đề đặt làm để lựa chọn thuật tốn tối ưu đảm bảo đáp ứng tồn yêu cầu liệu vào toán Do địi hỏi giáo viên cần có giải pháp để giúp học sinh giải vấn đề nhằm nâng cao chất lượng công tác bồi dưỡng học sinh giỏi môn Tin học Thực trạng vấn đề trước áp dụng SKKN 2.1 Đặc điểm tình hình * Thuận lợi: - Với phát triển nhanh ngành cơng nghệ thơng tin, máy tính ngày có tốc độ xử lý cao đáp ứng u cầu xử lý tốn có liệu lớn thời gian thực ngắn - Học sinh giáo viên dễ dàng tìm hiểu nguồn tài liệu để học tập tham khảo * Khó khăn: - Những kiến thức chương trình Tin học phổ thơng cịn hạn chế khơng đủ đáp ứng cho việc giải số toán kỳ thi học sinh giỏi Tỉnh có yêu cầu liệu lớn thời gian thực ngắn - Các tài liệu tổng hợp cách để giải tốn u cầu cao chưa có nhiều để học sinh tham khảo, ôn luyện 2.2 Thực trạng trước nghiên cứu Với phát triển nhanh tốc độ máy tính đề thi học sinh giỏi Tin học đòi hỏi ngày nâng cao Đặc biệt mặt thời gian thực độ lớn liệu đầu vào Đa số giáo viên gặp khó khăn việc hướng dẫn học sinh giải toán để đạt trọn vẹn yêu cầu toán Những năm trước bồi dưỡng học sinh thi học sinh giỏi tỉnh trọng nhiều đến cải tiến chương trình tối ưu, nhiên hiệu mang lại chưa cao Nguyên nhân chủ yếu thực trạng giáo viên chưa có phương pháp giảng dạy phù hợp với vấn đề Cụ thể giáo viên thường giúp học sinh cải tiến, làm mịn dần thuật toán cụ thể Chưa phân loại thành dạng bài, định hướng học sinh đánh giá thuật toán cải thiện thuật toán chưa ước lượng với mức liệu cần phải xây dựng thuật tốn có độ phức tạp tương ứng để đáp ứng được…Chính vậy, học sinh thường cố gắng tinh chỉnh, tìm cách giải tối ưu lại không chắn giải đáp ứng trọn vẹn liệu yêu cầu toán hay chưa Cho nên học sinh gặp khó khăn việc vận dụng vào tốn tương tự, khơng linh hoạt toán Kết học sinh giải tốn khơng đạt điểm số cao nên thường đạt giải khuyến khích trở xuống Vì vậy, tơi ln trì hướng dẫn, uốn nắn em biết cách giải bài, rèn luyện kĩ tinh chỉnh, làm mịn dần thuật toán, kết hợp biết cách nhận biết độ lớn liệu toán lựa chọn thuật toán phù hợp để đạt hiệu Trong q trình giảng dạy tơi cịn cho học sinh kiểm chứng qua đánh giá phần mềm Themis để dễ dàng so sánh ghi nhớ Từ đạt hiệu cao Các giải pháp giải vấn đề Có tốn nhiều đơn giản, đa số học sinh giải thực với liệu lớn khơng đáp ứng thời gian u cầu thực tất test yêu cầu Lúc địi hỏi phải tìm thuật tốn tối ưu Tối ưu hố địi hỏi thường xun q trình giải tốn tin học Tối ưu hố thuật tốn cơng việc yêu cầu tư thuật toán cao, với khả sử dụng thục cấu trúc liệu Vì vậy, việc tìm thuật tốn tối ưu khơng dễ chút Tối ưu hố thường tiến hành theo góc độ tối ưu theo khơng gian có nghĩa tối ưu khơng gian lưu trữ (bộ nhớ), tối ưu theo thời gian có nghĩa giảm độ phức tạp thuật tốn, giảm bước xử lý chương trình…Tuy nhiên khơng phải lúc ta đạt đồng thời điều đó, nhiều trường hợp tối ưu thời gian làm tăng không gian lưu trữ, ngược lại Bài tốn Tin học đa dạng, phong phú Đa số giáo viên gặp khó khăn việc hướng dẫn học sinh thiết kế thuật tốn lựa chọn thuật tốn để giảm độ phức tạp thuật toán, đồng thời phù hợp với liệu yêu cầu đề Đa số chấm bài, dùng test chấm biết chương trình đáp ứng test so với yêu cầu đề Điều thực ơn luyện cho em, cịn em thi khơng tự ước lượng làm đạt kết Có cách để ước lượng chương trình giải đáp ứng yêu cầu đề hay không (nghĩa đáp ứng khoảng liệu vào bao nhiêu), đánh giá độ phức tạp thuật tốn chương trình Như để tối ưu hóa thuật tốn trước tiên phải hiểu rõ độ phức tạp thuật toán cách đánh giá ước lượng thuật toán so với liệu đầu vào yêu cầu 3.1 Cơ sở lý thuyết 3.1.1 Độ phức tạp thuật tốn 3.1.1.1 Tính hiệu thuật toán Khi giải toán, cần chọn số thuật toán thuật toán mà cho “tốt” Vậy dựa sở để đánh giá thuật toán “tốt” thuật tốn kia? Thơng thường ta dựa hai tiêu chuẩn sau: Thuật toán đơn giản, dễ hiểu, dễ cài đặt (dễ viết chương trình) Thuật tốn hiệu quả: Chúng ta thường đặc biệt quan tâm đến thời gian thực thuật toán (gọi độ phức tạp tính tốn), bên cạnh quan tâm tới dung lượng không gian nhớ cần thiết để lưu giữ liệu vào, kết trung gian q trình tính tốn Khi viết chương trình để sử dụng số lần tiêu chuẩn (1) quan trọng, viết chương trình để sử dụng nhiều lần, cho nhiều người sử dụng tiêu chuẩn (2) lại quan trọng Trong trường hợp này, dù thuật tốn phải cài đặt phức tạp, ta lựa chọn để nhận chương trình chạy nhanh hơn, hiệu 3.1.1.2 Tại cần thuật tốn có tính hiệu quả? Kĩ thuật máy tính tiến nhanh, ngày máy tính lớn đạt tốc độ tính tốn hàng nghìn tỉ phép tính giây Vậy có cần phải tìm thuật tốn hiệu hay khơng? Chúng ta xem ví dụ tốn kiểm tra tính nguyên tố số nguyên dương n (n ≥ 2) bool is_prime(int n) { for(int k=2;k3) không chia hết cho lại chia hết cho cần lần thử (chia chia 3) để kết luận n khơng ngun tố Cịn n số ngun tố thuật tốn phải thực nhiều lần thử Trong tài liệu này, hiểu hàm số T(n) thời gian nhiều cần thiết để thực thuật toán với liệu đầu vào cỡ n Sử dụng kí hiệu tốn học lớn để mơ tả độ lớn hàm Giả sử n số nguyên dương, T(n) f(n) hai hàm thực không âm Ta viết T(n)= O(f(n)) tồn số dương c n0 , cho T(n)≤ c x f(n), n ≥ n0 Nếu thuật tốn có thời gian thực T(n)= O(f(n)) nói thuật tốn có thời gian thực cấp f(n) Ví dụ: Giả sử T(n) = n2 + 2n, ta có n2 + 2n ≤ 3n2 với n ≥ Vậy T(n) = O(n2) trường hợp ta nói thuật tốn có thời gian thực cấp n2 3.1.1.4 Các quy tắc đánh giá thời gian thực thuật toán Để đánh giá thời gian thực thuật tốn trình bày ngơn ngữ C++, ta cần biết cách đánh giá thời gian thực câu lệnh C++ Trước tiên, xem xét câu lệnh C++ Các câu lệnh C++ định nghĩa sau: Các phép gán, đọc, viết câu lệnh (được gọi lệnh đơn) Nếu S1, S2, , Sm câu lệnh { S1; S2; …; Sm; } câu lệnh (được gọi lệnh hợp thành hay khối lệnh) Nếu S1 S2 câu lệnh E biểu thức lơgic If (E) S1; else S2; câu lệnh (được gọi lệnh rẽ nhánh hay lệnh If) Nếu S câu lệnh E biểu thức lơgic While (E) S; câu lệnh (được gọi lệnh lặp điều kiện trước hay lệnh While) Nếu S1, S2,…,Sm câu lệnh E biểu thức lơgic Do S1; S2; …; Sm; While (E); câu lệnh (được gọi lệnh lặp điều kiện sau hay lệnh Do While) Nếu S lệnh, E1 E2 biểu thức kiểu thứ tự đếm Thì For (i=E1; i x (có thể x nằm nửa khoảng trước): Dừng lại trả giá trị mid (chính vị trí x mảng A) right = mid – // giới hạn khoảng tìm kiếm lại nửa khoảng trước Nếu A[mid] < x (có thể x nằm nửa khoảng sau): left = mid + // giới hạn khoảng tìm kiếm lại nửa khoảng sau Nếu left Độ phức tạp toàn chương trình O(T*n) - Cách 2: - xếp dãy tăng dần - Tìm kiếm nhị phân cho T với T ≤105 Vì dãy số a(n) nguyên dương (n≤105, ≤1018), nên ta chọn thuật toán xếp nhanh phù hợp Độ phức tạp O(nlogn) với n≤105 Tìm kiếm nhị phân cho T với T ≤105 có độ phức tạp O(Tlogn) Độ phức tạp chương trình O(max(nlogn,Tlogn)) ≈O(nlogn) (vì n ≈ T) Bước 4: Đánh giá, lựa chọn thuật toán Như theo bảng ước lượng (*) : Nếu sử dụng cách (tìm kiếm cho T) đáp ứng 60% số test với ≤ N ≤ 103, T≤105 Nếu sử dụng cách (sắp xếp dãy an tăng dần theo xếp nhanh dùng tìm kiếm nhị phân cho T) đáp ứng 100% test với N ≤ 105, T≤105 Vậy lựa chọn cách để cài đặt chương trình Bước 5: Viết chương trình Code tham khảo 35 #include using namespace std; const long long maxn=1e5+7; long long n,x,t; long long a[maxn]; int nhiphan(long long B[], long long m, long long y) { int left = 0; int right = m - 1; int mid; while (left y) right = mid - 1; // Giới hạn khoảng tìm kiếm lại nửa khoảng trước else if (B[mid] < y) left = mid + 1; // Giới hạn khoảng tìm kiếm lại nửa khoảng sau } return -1; // khơng tìm thấy x } int main() {cin>>n; for(int i=0;i>a[i]; sort(a,a+n); cin>>t; for(int j=1;j>x; if (nhiphan(a,n,x)==-1) cout