SỞ GIÁO DỤC VÀ ĐÀO TẠO YÊN BÁI TRƯỜNG THPT TRẦN PHÚ BÁO CÁO SÁNG KIẾN CẤP CƠ SỞ (Lĩnh vực Tin học) HƯỚNG DẪN HỌC SINH TRƯỜNG THPT TRẦN PHÚ VẬN DỤNG MỘT SỐ KĨ THUẬT TỐI ƯU HÓA CHƯƠNG TRÌNH Tác giả[.]
SỞ GIÁO DỤC VÀ ĐÀO TẠO YÊN BÁI TRƯỜNG THPT TRẦN PHÚ BÁO CÁO SÁNG KIẾN CẤP CƠ SỞ (Lĩnh vực: Tin học) HƯỚNG DẪN HỌC SINH TRƯỜNG THPT TRẦN PHÚ VẬN DỤNG MỘT SỐ KĨ THUẬT TỐI ƯU HÓA CHƯƠNG TRÌNH Tác giả: Phạm Thị Thùy Trình độ chun môn: Cử nhân Chức vụ: Giáo viên Đơn vị công tác: Trường THPT Trần Phú Yên Bái, ngày 22 tháng 01 năm 2022 I THÔNG TIN CHUNG VỀ SÁNG KIẾN Tên sáng kiến: Hướng dẫn học sinh trường THPT Trần Phú vận dụng số kĩ thuật tối ưu hóa chương trình Lĩnh vực áp dụng sáng kiến: Giáo dục Đào tạo (Môn Tin học) Phạm vi áp dụng sáng kiến: Đề tài áp dụng cho giáo viên môn Tin học học sinh trường THPT Trần Phú – Yên Bái Thời gian áp dụng sáng kiến: Từ tháng năm 2019 đến tháng 01 năm 2022 Tác giả: Họ tên: Phạm Thị Thùy Năm sinh: 1985 Trình độ chun mơn: Cử nhân Chức vụ công tác: Giáo viên Nơi làm việc: Trường THPT Trần Phú Địa liên hệ: Trường THPT Trần Phú - Yên Bái Điện thoại: 0963908880 II MÔ TẢ SÁNG KIẾN: Tình trạng giải pháp biết Trước việc dạy học môn Tin trường THPT Trần Phú chưa trọng việc hướng dẫn học sinh kĩ thuật tối ưu hóa chương trình Dẫn đến kĩ lập trình học sinh còn kém, học sinh viết code theo năng, nhiều phát thuật toán, code kết hiệu suất chương trình chưa cao, thi khó đạt điểm tối đa Giải pháp cũ khiến chất lượng dạy học môn Tin nhà trường chưa cao, tỉ lệ học sinh giỏi thấp, học sinh dự thi học sinh giỏi cấp tỉnh đạt điểm thấp, không đạt điểm tốt đa câu hỏi Thực tế cho thấy, tiếp cận chương trình giáo dục phở thơng 2018, để học sinh trường đáp ứng yêu cầu nhân lực làm việc nhóm ngành công nghệ thơng tin việc bời dưỡng khả tối ưu hóa chương trình cho học sinh cần thiết Các giải pháp cũ nhà trường chưa giải vấn đề Hiện nay, tài liệu hướng dẫn kĩ thuật tối ưu hóa chương trình còn ít, cách trình bày còn trừu tượng, hàn lâm, khó có thể vận dụng trường THPT Trần Phú, trường miền núi với chất lượng đầu vào thấp, đa số học sinh tiếp cận với học lập trình muộn Từ thực trạng trên, cần thiết phải tìm giải pháp giúp học sinh tiếp cận với kĩ thuật tối ưu hóa chương trình tốt hơn, vận dụng kĩ thuật hiệu nhằm nâng cao chất lượng dạy học môn học Trăn trở với thực tế đó, lựa chọn giải pháp “Hướng dẫn học sinh trường THPT Trần Phú vận dụng số kĩ thuật tối ưu hóa chương trình” Nội dung giải pháp đề nghị công nhận sáng kiến 2.1 Mục đích giải pháp: Giải pháp “Hướng dẫn học sinh trường THPT Trần Phú vận dụng số kĩ thuật tối ưu hóa chương trình” xây dựng nhằm giải vấn đề: Giúp học sinh biết cách giảm độ phức tạp không gian, sử dụng hợp lý cấu trúc lặp, biểu thức điều kiện, biểu thức số học, khai thác sở toán học cách khoa học, hợp lý nhằm tối ưu hóa việc thực chương trình viết chương trình lập trình Sau thực giải pháp này, kĩ tối ưu hóa chương trình lập trình học sinh củng cố hoàn thiện nhờ đó nâng cao dần chất lượng dạy học môn Tin, tiếp cận tốt với mặt chung tỉnh 2.2 Nội dung giải pháp: - Để thực giải pháp thực bước sau: Bước 1: Giới thiệu kĩ thuật cho học sinh thơng qua tích hợp nội dung dạy học khóa, dạy chuyên đề bồi dưỡng học sinh giỏi Bước 2: Hướng dẫn, khuyến khích học sinh vận dụng kĩ thuật viết chương trình Bước 3: Khảo sát khả vận dụng học sinh qua thi nhỏ Kịp thời phát uốn nắn học sinh vận dụng chưa tốt Chú trọng khen thưởng học sinh vận dụng tốt kĩ thuật vào trình làm - Các kĩ thuật tối ưu hóa chương trình đề xuất SKKN là: giảm độ phức tạp không gian, sử dụng tối ưu cấu trúc lặp, sử dụng hợp lý biểu thức logic, lựa chọn thuật toán sắp xếp, tinh chỉnh biểu thức khai thác sở tốn học - Giải pháp thực thơng qua việc: + Tích hợp vào nội dung dạy học khóa + Dạy chun đề bời dưỡng học sinh giỏi; + Biên tập nội dung giải pháp thành tài liệu tham khảo lưu hành thư viện nhà trường thư viện lớp học Cụ thể sau: 2.2.1 Giảm độ phức tạp không gian: Trong trình cố gắng làm cho chương trình tối ưu hơn, học sinh thường ý đến làm giảm độ phức tạp thời gian thuật toán mà quên việc cố gắng làm giảm độ phức tạp không gian quan trọng Để giảm độ phức tạp không gian, học sinh thực những lưu ý sau: - Sử dụng kiểu dữ liệu có kích thước nhỏ có thể: Khi làm cần lưu ý đến giới hạn biến đầu vào, biến kết biến trung gian để chọn kiểu dữ liệu hợp lý 3 Ví dụ: xét trường hợp sử dụng biến n biểu diễn số học sinh lớp Thường học sinh khai báo là: Var n:integer; Nhận xét số học sinh lớp không vượt 50, vậy sử dụng kiểu Integer lãng phí nhớ, thay khai báo ta nên khai báo sau: Var n:byte; - Sử dụng mảng có số chiều nhỏ có thể: thao tác dữ liệu mảng chiều nhanh mảng hai chiều Nếu có nhu cầu dùng mảng hai chiều thử phân tích dùng mảng chiều có đủ không, có thể dùng mảng chiều để giải tốn khơng Ví dụ: xét tốn “Cho xâu S1, S2 tìm độ dài xâu chung dài hai xâu S1 S2 Biết xâu xâu thu xóa số kí tự thuộc xâu đó (hoặc khơng xóa kí tự nào)” Gọi L[i,j] độ dài xâu chung dài xâu S1i gờm i kí tự phần đầu S1 (S1i=S1[1 i]) xâu S2j gồm j kí tự phần đầu S2 (S2j = S2[1 j]) Ta có cơng thức quy hoạch động sau: Nếu i=0 j=0 L[i,j] = Nếu S1[i] = S2[j] L[i,j] = L[i−1,j−1] + Nếu S1[i] S2[j] L[i,j] = max(L[i−1,j], L[i,j−1]) Bảng phương án mảng chiều L[0 length(S1),0 length(S2)], kết L[length(S1),length(S2)] Đoạn chương trình cài đặt sau: for i:=length(S1) downto L[i,0]:=0; for j:=length(S2) downto L[0,j]:=0; for i:=1 to length(S1) for j:=1 to length(S2) if S1[i]=S2[j] then L[i,j]:=L[i-1,j-1]+1 else L[i,j]:=max(L[i-1,j],L[i,j-1]); Độ phức tạp khơng gian tḥt tốn O(n2), độ phức tạp thời gian O(n2) Ta cố gắng dùng mảng chiều để tối ưu toán Nhận thấy để tính L[i,j] bảng phương án, ta cần ô L[i−1, j−1], L[i−1, j] L[i, j−1] Tức để tính dịng L[i] cần dòng L[i−1] Do đó ta cần mảng chiều để lưu dòng vừa tính (P) dịng tính (L) mà thơi Cách cài đặt sau: for j:=length(S2) downto P[j]:=0; L[0] := 0; for i:=1 to length(S1) begin for j:=1 to length(S2) if S1[i]=S2[j] then L[j]:=P[j-1]+1 else L[j]:=max(P[j], L[j-1]); P := L; end; Với cách cài đặt này, độ phức tạp khơng gian tḥt tốn O(n) 4 2.2.2 Kĩ thuật sử dụng tối ưu cấu trúc lặp: Trong thực chương trình, ng̀n gây hiệu chủ yếu đến từ vòng lặp Để sử dụng hợp lý tối ưu vòng lặp, học sinh cần nhớ số quy tắc sau: - Đối với vòng lặp có số lần lặp nhỏ: viết lại biểu thức tính tốn khơng cần dùng vòng lặp Ví dụ: Cho tốn Tính tởng bội số nhỏ x Thay viết: For i:=1 to s := s + i*x; Thì nên thay câu lệnh: S := x*(1+2+3); - Đối với vòng lặp có số lần lặp lớn: Giảm thiểu phép tính tốn bên vòng lặp (nếu có thể) Khơng lặp biểu thức tính tốn khơng cần thiết Ví dụ 1: cho tốn Tính tởng bình phương n bội số nhỏ x (n>= 1000) Thường học sinh viết: For i:=1 to n S:=s+x*x*i*i; Nhận thấy phép toán x*x lặp lặp lại nhiều lần kết phép toán không phụ thuộc biến lặp Việc lặp lại phép tốn rõ ràng khơng cần thiết Ta nên tính trước sau đó dùng lại kết nhằm giảm thiểu phép tính tốn bên vòng lặp Vậy đoạn chương trình nên viết là: t:= x*x; For i:=1 to n s:=s+t*i*i; Ví dụ 2: xét đoạn chương trình for i:=1 to m {1} begin L[0] := 0; for j:=1 to n {2} if S1[i]=S2[j] then L[j]:=P[j-1]+1 else L[j]:=max(P[j], L[j-1]); P := L; end; Nhận thấy vòng lặp {2} không làm thay đổi giá trị biến L[0], vậy nên việc lặp lại lệnh L[0]:=0 sau mỗi vòng lặp {1}là không cần thiết Đoạn chương trình nên viết: L[0] := 0; for i:=1 to m begin for j:=1 to n if S1[i]=S2[j] then L[j]:=P[j-1]+1 else L[j]:=max(P[j], L[j-1]); P := L; end; Với vòng lặp lồng nhau: Đặt vòng lặp có số lần lặp ngồi vòng lặp có số lần lặp nhiều 5 Ví dụ: thay viết: For i:=1 to 20 For j:=1 to read(a[i,j]); Thì nên viết là: For j:=1 to For i:=1 to 20 read(a[i,j]); - Loại bỏ bớt việc kiểm tra điều kiện bên vòng lặp: Trong vòng lặp, kiểm tra điều kiện tốt tốt nên sử dụng phép thử (có thể phải thay đổi điều kiện kết thúc vòng lặp, kĩ thuật lính canh) - Nếu vòng lặp gần thao tác tập hợp phần tử cần kết hợp chung vào vòng lặp Ví dụ: thay viết: For i:=1 to n read(a[i]); For i:=1 to n s:=s+a[i]; Nên thay đoạn chương trình sau: For i:=1 to n Begin Read(a[i]); S:=s+a[i]; End; - Đối với vòng lặp từ đến n phần tử (n0) nên thực lặp từ giá trị n trở Vì biên dịch thành mã máy, phép so sánh với thực nhanh với số nguyên khác Do đó phép so sánh mỗi vòng lặp (i >=0) nhanh phép so sánh (i < n) Ví dụ: thay viết For i:=0 to n p[i]:=0; Thì nên viết thành For i:=n downto to p[i]:=0; - Giảm số toán tử phức tạp vòng lặp nhờ biến phụ Ví dụ: thay viết For i:=1 to n s:= sqr(sin(x))+i; Thì nên viết là: Bp:=sqr(sin(x)); For i:=1 to n s:=bp+i; 2.2.3 Ưu tiên thuật toán sắp xếp nhanh (Quick sort) Có nhiều thuật toán sắp xếp học sinh có thể sử dụng, cân nhắc ưu tiên sử dụng thuật toán sắp xếp nhanh Đây thuật toán chạy nhanh thuật toán sắp xếp dựa việc so sánh phần tử * Ý tưởng: - Chia dãy thành phần, phần "lớn" phần "nhỏ" - Chọn khóa Key - Những phần tử lớn Key chia vào phần lớn - Những phần tử nhỏ Key chia vào phần nhỏ - Gọi đệ quy để sắp xếp phần * Ưu điểm: Chạy nhanh (nhanh thuật toán sắp xếp dựa việc so sánh phần tử) * Nếu ta chọn Key ngẫu nhiên, thuật toán chạy với độ phức tạp trung bình O(N∗logN) * Code: procedure quicksort(l,r:integer); Var i,j,key,w:integer; Begin key:=A[(l+r) div 2]; i:=l;j:=r; Repeat While(a[i]y then x:=x-y else y:=y-x; UCLN:=x; end Ta dựa vào số định lý, hệ ước chung lớn để cải tiến trình sau: Định lý: Nếu a, b k số nguyên gcd(a,b)=gcd(a+k.b,b) Hệ Định lý: Với a b số nguyên, b>0 thì: gcd(a,b) = gcd (a mod b, b) Chứng minh: Căn vào định nghĩa phép chia lấy dư: a mod b = a − (a div b).b => a mod b =a+k.b với k= −(a div b) Do đó hệ Áp dụng hệ ta có Giải thuật Euclid: function USCLN(a,b:longint):longint; var tmp :longint; begin while b>0 begin a:=a mod b; tmp:=a; a:=b; b:=tmp; end; exit(a); end; 10 c Lớp toán Cấp số cộng: Cấp số cộng dãy số đó, kể từ số hạng thứ hai tổng số hạng đứng trước nó với số không đổi khác gọi công sai Cơng thức tính tởng cấp số cộng: ∀n∈N∗,Un+1=Un+d (d gọi công sai) + Số hạng tổng quát: Un=U1+d*(n−1) + Nếu muốn tính tởng n số hạng đầu ta dùng cơng thức: S=(U1+Un)* n/2 Ví dụ 1: Xét kinh điển sau: Tính tởng số từ đến tỉ Bình thường, học sinh lập tức bắt tay vào code với đoạn code sau: Sum := 0; For i:=1 to 1000000000 Sum:=Sum + i; Cách làm cho độ phức tạp thời gian O(n) Áp dụng tính chất cấp số cộng ta có tḥt tốn hiệu nhiều, ta cần câu lệnh là: S:= 1000000000 * (1000000000 + 1) / ; Cách làm cho độ phức tạp thời gian O(1) Ví dụ 2: Tính tởng số từ -> 999 chia hết cho Tổng số từ -> 999 chia hết cho có thể tách vế: sum(3) + sum(5) - sum(15) (tổng số chia hết cho + tổng số chia hết cho trừ tổng số chia hết cho 15 Vì chia hết cho 15 chắc chắn chia hết cho 5) Để tính sum(3) có công thức sau: Sum(3) = + + + 12 + … + 996 + 999 = 3* (1+2+3+ +333) Tương tự với dãy chia hết cho 15 Sum (5) = 5*(1 + + +…+199) Sum (15) = 15*(1+ 2+ 3+ …+66) Áp dụng cơng thức tính cấp số cộng ta có chương trình tối ưu giải tốn sau: Function Tong(n: byte): longint; Var t: integer; Begin T:= 999 div n; Tong:=n*(t*(t+1))/2; End; Begin Write(‘Ket qua la:’,Tong(3)+Tong(5)-Tong(15)); End 2.3 Chỉ tính mới, khác biệt giải pháp so với giải pháp cũ Giải pháp mà đưa thể số tính thực trạng dạy học Tin trường THPT Trần Phú trước sau: 11 Thực trạng trước áp dụng giải pháp Tính giải pháp đề xuất - Chưa đưa kĩ thuật tối ưu hóa chương - Đưa kĩ thuật tối ưu hóa chương trình trình vào chương trình giảng dạy ơn thi vào tích hợp nội dung dạy học học sinh giỏi Chú trọng rèn luyện kĩ thuật tối ưu hóa chương trình cho học sinh dạy ôn thi học sinh giỏi - Học sinh chưa có tài liệu phù hợp hỗ trợ - Cung cấp tài liệu phù hợp hỗ trợ học tìm hiểu tối ưu hóa chương trình sinh tự học tối ưu hóa chương trình lập trình hiệu Với kĩ thuật, giải pháp tiếp cận phù hợp với khả học sinh nhà trường Có minh họa rõ ràng, dễ hiểu phù hợp với tình hình thực tế học sinh trường có đầu vào thấp Học sinh thường code theo năng, Giới thiệu khuyến khích học sinh vận dụng kiến thức toán vào tối ưu chương khai thác sở tốn học để tối ưu trình chương trình Khả áp dụng giải pháp - Sáng kiến có thể áp dụng vào giảng dạy môn Tin học trường THPT địa bàn tỉnh Yên Bái - Bồi dưỡng cho giáo viên qua việc tổ chức thành chuyên đề cấp tổ, cấp trường - SKKN có thể dùng làm tài liệu tham khảo cho học sinh, giáo viên môn Tin học trường địa bàn tỉnh Yên Bái - Giải pháp hữu hiệu việc giải tốt vấn đề thiếu tư liệu học tập học sinh bối cảnh đặc điểm học sinh vùng miền núi có chất lượng đầu vào thấp, thiếu phương tiện tư liệu học tập - Sáng kiến cung cấp cho giáo viên học sinh tài liệu tham khảo hữu ích, phù hợp với cơng tác giảng dạy chương trình khóa hỗ trợ phần công tác ôn thi học sinh giỏi, dễ áp dụng với giáo viên học sinh nhà trường giúp cải thiện chất lượng môn, góp phần nâng cao chất lượng dạy học ôn thi học sinh giỏi Hiệu quả, lợi ích thu dự kiến thu áp dụng giải pháp Khi áp dụng sáng kiến vào q trình giảng dạy thân tơi nhận thấy kết học tập học sinh nâng lên rõ rệt qua học, qua mỗi kỳ thi Trước sau áp dụng sáng kiến cho học sinh làm kiểm tra khảo sát, kết khả quan, cụ thể sau: 12 4.1 Công tác bồi dưỡng học sinh giỏi: - Năm học 2019 - 2020: 01 giải ba cấp tỉnh - Năm học 2020 – 2021: 01 giải ba cấp tỉnh, 01 học sinh tham gia đội tuyển Học sinh giỏi cấp Quốc Gia - Năm học 2021 – 2022: 01 giải khuyến khích cấp tỉnh Sau áp dụng sáng kiến, kĩ tối ưu chương trình lập trình học sinh cải thiện Chất lượng dạy học nâng cao thể số học sinh đạt giải cấp tỉnh 4.2 Trong công tác giảng dạy môn: So sánh kết học tập học kỳ I năm học 2021 – 2022: Kết học tập học kỳ I năm học 2021 – 2022 Giỏi Khá Yếu Trung bình SL Tỉ lệ (%) SL Tỉ lệ (%) SL Tỉ lệ (%) SL Tỉ lệ (%) Lớp 11A4 (Lớp đối chứng) Lớp 11A1 (Lớp thực nghiệm) 2.22 15.56 36 80 2.22 23 54.76 19 45.24 0 0 Qua bảng so sánh trên, ta nhận thấy khóa học, chương trình, lớp có áp dụng SKKN cho kết học tập học sinh cao hơn, đó là: tỉ lệ học sinh giỏi nhiều 22 học sinh, nhiều 12, tỉ lệ học sinh trung bình 36 học sinh Đây kết đáng ghi nhận trường thuộc khu vực miền núi Có tiến do, với lớp thực nghiệm, học sinh tiếp cận kĩ thuật tối ưu hóa chương trình lập trình tốt Nhờ hướng dẫn kĩ thuật tối ưu hóa cụ thể, có ví dụ vừa sức nên học sinh vận dụng tốt kĩ thuật tối ưu hóa chương trình lập trình vào giải bài, qua đó việc lập trình giải tốn học sinh đạt hiệu tốt Qua đó, học sinh có hứng thú học tập, u thích mơn học, chủ động học bài, làm tập, ôn tập làm kiểm tra đạt kết tốt Học sinh học tập tiến hơn, số học sinh học lực giỏi tăng, số học sinh học lực trung bình yếu giảm, xóa dần tư tưởng chán học, sợ học môn Tin học Kết nêu chưa phải cao so với trường có chất lượng đầu vào học sinh cao hơn, so với những giáo viên có chuyên môn kinh nghiệm giảng dạy, song với đối tượng học sinh trường THPT Trần Phú, tơi đó những tín hiệu đáng mừng Nó chứng minh tính khả thi giải pháp mà tiến hành, động lực để tơi tiếp tục tìm kiếm những sáng kiến hữu hiệu trình giảng dạy 13 Các điều kiện cần thiết để áp dụng sáng kiến Giáo viên cần có kiến thức, có trình độ chuyên môn vững vàng, giảng dạy chuyên môn đào tạo, có kinh nghiệm giảng dạy đầu tư thời gian, nghiên cứu kỹ nội dung, dạng tập, lựa chọn tập phù hợp với đối tượng học sinh Học sinh có ý thức học tập tốt, yêu thích mơn, trang bị đầy đủ sách giáo khoa, sách tập, tài liệu tham khảo, dụng cụ học tập, ý nghe giảng tích cực thực yêu cầu giáo viên giảng dạy Đưa giải pháp làm tài liệu tham khảo thư viện nhà trường thư viện lớp học nhà trường III Cam kết không chép vi phạm quyền Tôi cam đoan những nội dung báo cáo thật, không chép vi phạm quyền Nếu sai không thật xin chịu hoàn toàn trách nhiệm theo quy định pháp luật./ Văn Yên, ngày 22 tháng 01 năm 2022 Người viết báo cáo Phạm Thị Thùy XÁC NHẬN CỦA THỦ TRƯỞNG VỀ VIỆC TRIỂN KHAI ÁP DỤNG SÁNG KIẾN TẠI ĐƠN VỊ