Tải bản đầy đủ (.pdf) (14 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (665.72 KB, 14 trang )

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


1
I. THÔNG TIN CHUNG VỀ SÁNG KIẾN
1. Tên sáng kiến: 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.
2. Lĩnh vực áp dụng sáng kiến: Giáo dục và Đào tạo (Môn Tin học)
3. 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 và học
sinh trường THPT Trần Phú – Yên Bái.
4. Thời gian áp dụng sáng kiến: Từ tháng 9 năm 2019 đến tháng 01 năm 2022
5. Tác giả:
Họ và 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 chỉ 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:
1. Tình trạng giải pháp đã biết
Trước đây việc dạy học môn Tin tại trường THPT Trần Phú chưa chú trọng việc
hướng dẫn học sinh các kĩ thuật tối ưu hóa chương trình. Dẫn đến kĩ năng lập trình của học
sinh còn kém, học sinh viết code theo bản năng, nhiều khi phát hiện được thuật toán, code
đúng kết quả nhưng hiệu suất của chương trình chưa cao, đi thi khó đạt điểm tối đa. Giải
pháp cũ khiến chất lượng dạy và học môn Tin tại nhà trường chưa cao, tỉ lệ học sinh khá
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 được điểm tốt đa
trong các câu hỏi.
Thực tế cũng cho thấy, tiếp cận chương trình giáo dục phổ thông mới 2018, để học
sinh ra trường đáp ứng được yêu cầu nhân lực làm việc trong nhóm ngành cơng nghệ thơng
tin thì việc bời dưỡng khả năng tối ưu hóa chương trình cho học sinh là rất cần thiết. Các
giải pháp cũ tại nhà trường chưa giải quyết được vấn đề này.
Hiện nay, các tài liệu hướng dẫn kĩ tḥ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 tại trường THPT Trần Phú, một trường
miền núi với chất lượng đầu vào thấp, đa số học sinh được tiếp cận với học lập trình rất
muộn.
Từ thực trạng trên, cần thiết phải tìm ra giải pháp mới giúp học sinh tiếp cận với các
kĩ thuật tối ưu hóa chương trình tốt hơn, vận dụng các kĩ thuật hiệu quả hơn nhằm nâng cao


2
chất lượng dạy học môn học. Trăn trở với thực tế đó, tôi đã 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 một số kĩ thuật tối ưu hóa chương trình”.
2. Nội dung giải pháp đề nghị cơng nhận là sáng kiến
2.1 Mục đích của 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 một số kĩ thuật tối
ưu hóa chương trình” được xây dựng nhằm giải quyết các 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, các biểu thức điều kiện, các biểu

thức số học, khai thác cơ sở toán học một cách khoa học, hợp lý nhằm tối ưu hóa việc thực
hiện chương trình khi viết chương trình lập trình.
Sau khi thực hiện giải pháp này, kĩ năng tối ưu hóa chương trình lập trình của học
sinh sẽ được củng cố và hoàn thiện hơn nhờ đó nâng cao dần chất lượng dạy học môn Tin,
tiếp cận tốt hơn với mặt bằng chung của cả tỉnh.
2.2 Nội dung giải pháp:
- Để thực hiện giải pháp này tôi thực hiện các bước như sau:
Bước 1: Giới thiệu các kĩ tḥt cho học sinh thơng qua tích hợp trong nội dung dạy
học chính khóa, dạy trong chun đề 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 các kĩ thuật trong khi viết
chương trình.
Bước 3: Khảo sát khả năng vận dụng của học sinh qua các cuộc thi nhỏ. Kịp thời
phát hiện và uốn nắn học sinh vận dụng chưa tốt. Chú trọng khen thưởng đối với học sinh
vận dụng tốt các kĩ thuật vào quá trình làm bài.
- Các kĩ thuật tối ưu hóa chương trình cơ bản được đề xuất trong 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ý các biểu thức logic, lựa
chọn thuật toán sắp xếp, tinh chỉnh các biểu thức và khai thác cơ sở toán học.
- Giải pháp được thực hiện thơng qua việc:
+ Tích hợp vào từng nội dung dạy học chính khóa.
+ Dạy trong 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 trong thư viện nhà
trường và các thư viện lớp học.
Cụ thể như sau:
2.2.1 Giảm độ phức tạp khơng gian:
Trong q trình cố gắng làm cho chương trình tối ưu hơn, học sinh thường chỉ chú ý
đến làm giảm độ phức tạp thời gian của thuật toán mà quên rằng việc cố gắng làm giảm độ
phức tạp không gian cũng rất quan trọng. Để giảm độ phức tạp không gian, học sinh thực
hiện những lưu ý sau:
- Sử dụng kiểu dữ liệu có kích thước nhỏ hơn nếu có thể: Khi làm bài cần lưu ý đến
giới hạn của các biến đầu vào, biến kết quả và 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 trong một lớp. Thường thì
học sinh khai báo là:
Var n:integer;
Nhận xét rằng số học sinh trong một lớp không vượt quá 50, vậy sử dụng kiểu Integer
là lãng phí bộ nhớ, thay vì khai báo như trên ta nên khai báo như sau:
Var n:byte;
- Sử dụng mảng có số chiều nhỏ nhất có thể: thao tác dữ liệu trên mảng một chiều luôn
nhanh hơn trên mảng hai chiều. Nếu khi nào có nhu cầu dùng mảng hai chiều thì hãy thử
phân tích dùng mảng một chiều có đủ không, có thể dùng mảng một chiều để giải quyết bài
tốn khơng.
Ví dụ: xét bài tốn “Cho 2 xâu S1, S2 hãy tìm độ dài xâu con chung dài nhất của hai
xâu S1 và S2. Biết xâu con của một xâu thu được khi xóa một số kí tự thuộc xâu đó (hoặc
khơng xóa kí tự nào)”.
Gọi L[i,j] là độ dài xâu con chung dài nhất của xâu S1i gờm i kí tự phần đầu
của S1 (S1i=S1[1..i]) và xâu S2j gờm j kí tự phần đầu của S2 (S2j = S2[1..j]). Ta có cơng
thức quy hoạch động như sau:
Nếu i=0 hoặc j=0 thì L[i,j] = 0
Nếu S1[i] = S2[j] thì L[i,j] = L[i−1,j−1] + 1
Nếu S1[i] <> S2[j] thì L[i,j] = max(L[i−1,j], L[i,j−1])
Bảng phương án là một mảng 2 chiều L[0..length(S1),0..length(S2)], kết
quả chính là L[length(S1),length(S2)]
Đoạn chương trình cài đặt như sau:
for i:=length(S1) downto 0 do L[i,0]:=0;
for j:=length(S2) downto 0 do L[0,j]:=0;
for i:=1 to length(S1) do
for j:=1 to length(S2) do
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 của thuật toán là O(n2), độ phức tạp thời gian là O(n2).
Ta sẽ cố gắng dùng mảng một chiều để tối ưu bài tốn này. Nhận thấy rằng để tính
ơ L[i,j] của bảng phương án, ta chỉ cần 3 ô L[i−1, j−1], L[i−1, j] và L[i, j−1]. Tức là để tính
dịng L[i] thì chỉ cần dòng L[i−1]. Do đó ta chỉ cần 2 mảng 1 chiều để lưu dòng vừa tính (P)
và dịng đang tính (L) mà thơi. Cách cài đặt mới như sau:
for j:=length(S2) downto 0 do P[j]:=0;
L[0] := 0;
for i:=1 to length(S1) do
begin
for j:=1 to length(S2) do
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 mới này, độ phức tạp khơng gian của tḥt tốn là O(n).


4
2.2.2
Kĩ thuật sử dụng tối ưu cấu trúc lặp:
Trong thực hiện chương trình, ng̀n gây kém hiệu quả chủ yếu đến từ các vòng lặp.
Để sử dụng hợp lý và tối ưu các vòng lặp, học sinh cần nhớ một số quy tắc cơ bản sau:
- Đối với các vòng lặp có số lần lặp nhỏ: viết lại các biểu thức tính tốn và khơng cần
dùng vòng lặp.
Ví dụ: Cho bài tốn Tính tởng 3 bội số nhỏ nhất của x. Thay vì viết:
For i:=1 to 3 do s := s + i*x;
Thì nên thay bằng câu lệnh:
S := x*(1+2+3);
- Đối với các vòng lặp có số lần lặp lớn: Giảm thiểu các phép tính tốn bên trong

vòng lặp (nếu có thể). Khơng lặp các biểu thức tính tốn khơng cần thiết.
Ví dụ 1: cho bài tốn Tính tởng bình phương n bội số nhỏ nhất của x (n>= 1000).
Thường thì học sinh viết:
For i:=1 to n do S:=s+x*x*i*i;
Nhận thấy rằng phép toán x*x lặp đi lặp lại nhiều lần trong khi kết quả phép tốn này
khơng phụ thuộc biến lặp. Việc lặp lại phép toán này rõ ràng là khơng cần thiết. Ta nên tính
trước sau đó dùng lại kết quả nhằm giảm thiểu các phép tính tốn bên trong vòng lặp. Vậy
đoạn chương trình trên nên được viết là:
t:= x*x;
For i:=1 to n do s:=s+t*i*i;
Ví dụ 2: xét đoạn chương trình
for i:=1 to m do
{1}
begin
L[0] := 0;
for j:=1 to n do
{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 trên nên viết:
L[0] := 0;
for i:=1 to m do
begin
for j:=1 to n do
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ác vòng lặp lồng nhau: Đặt các vòng lặp có số lần lặp ít hơn ở ngồi vòng lặp
có số lần lặp nhiều hơn.


5
Ví dụ: thay vì viết:
For i:=1 to 20 do
For j:=1 to 5 do read(a[i,j]);
Thì nên viết là:
For j:=1 to 5 do
For i:=1 to 20 do read(a[i,j]);
- Loại bỏ bớt việc kiểm tra điều kiện bên trong vòng lặp: Trong vòng lặp, càng ít
kiểm tra điều kiện càng tốt và tốt nhất chỉ nên sử dụng một phép thử. (có thể phải thay đổi
điều kiện kết thúc vòng lặp, như kĩ thuật lính canh).
- Nếu 2 vòng lặp gần nhau cùng thao tác trên cùng một tập hợp các phần tử thì cần
kết hợp chung vào một vòng lặp.
Ví dụ: thay vì viết:
For i:=1 to n do read(a[i]);
For i:=1 to n do s:=s+a[i];
Nên thay bằng đoạn chương trình sau:
For i:=1 to n do
Begin
Read(a[i]);
S:=s+a[i];
End;
- Đối với vòng lặp từ 0 đến n phần tử (n<>0) thì nên thực hiện lặp từ giá trị n trở về
0. Vì khi biên dịch thành mã máy, các phép so sánh với 0 sẽ được thực hiện nhanh hơn với
các số nguyên khác. Do đó phép so sánh ở mỗi vòng lặp là (i >=0) sẽ nhanh hơn phép so
sánh (i < n).

Ví dụ: thay vì viết
For i:=0 to n do p[i]:=0;
Thì nên viết thành
For i:=n downto 0 to p[i]:=0;
- Giảm số toán tử phức tạp trong vòng lặp nhờ các biến phụ.
Ví dụ: thay vì viết
For i:=1 to n do s:= sqr(sin(x))+i;
Thì nên viết là:
Bp:=sqr(sin(x));
For i:=1 to n do 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, nhưng hãy cân nhắc ưu tiên sử
dụng thuật toán sắp xếp nhanh. Đây là thuật toán chạy nhanh nhất trong các thuật toán sắp
xếp dựa trên việc so sánh các phần tử.
* Ý tưởng:
- Chia dãy thành 2 phần, một phần "lớn" và một phần "nhỏ".
- Chọn một khóa Key


6
- Những phần tử lớn hơn Key chia vào phần lớn
- Những phần tử nhỏ hơn hoặc bằng Key chia vào phần nhỏ.
- Gọi đệ quy để sắp xếp 2 phần.
* Ưu điểm: Chạy nhanh (nhanh nhất trong các thuật toán sắp xếp dựa trên việc so sánh các
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 là 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]While (keyIf i<=j then
Begin
w:=a[i];a[i]:=a[j];a[j]:=w;
i:=i+1;j:=j-1;
End;
until i>j;
If lIf iEnd;
2.2.4 Tinh chỉnh các biểu thức logic:
- Viết các biểu thức điều kiện đơn giản và xác suất xảy ra cao hơn, tính tốn nhanh
hơn lên trước, các điều kiện kiểm tra phức tạp ra sau.
Ví dụ: thay vì viết ((x or y) and z) thì nên viết là (z and (x or y)). Vì trong trường
hợp z có giá trị FALSE, biểu thức logic này sẽ có kết quả FALSE và không cần kiểm tra
thêm giá trị (x or y).
- Không kiểm tra khi đã biết kết quả rời.
Ví dụ: thay vì viết
If (5Thì nên viết là:
If (5If (x<10) then...
2.2.5 Tinh chỉnh các biểu thức.
Các biểu thức toán học phức tạp khi được biên dịch có thể sinh ra nhiều mã dư thừa
làm tăng kích thước và chậm tốc độ thực hiện của chương trình. Do đó khi viết các biểu
thức phức tạp học sinh cần nhớ một số đặc điểm cơ bản sau để giúp tinh giản biểu thức:

- CPU xử lý các phép tính cộng và trừ nhanh hơn các phép tính chia và nhân.


7
Ví dụ: Biểu thức T = (a*x + a*y + a*z) cần 2 phép cộng và 3 phép nhân. Ta có thể
nhóm các phép cộng và viết thành T = a*(x+y+z), tốc độ tính nhanh hơn vì giảm đi số
phép tính nhân.
- Khơng tính một phần tử cho đến khi cần để tránh những sự tính tốn khơng cần
thiết.
- Khơng tính cùng một biểu thức nhiều lần. Nếu phải tính đi tính lại một biểu thức
thì nên tính trước một lần và lưu lại giá trị, rồi dùng lại giá trị ấy sau này.
Ví dụ 1: cho bài tốn tính tởng bình phương n bội số nhỏ nhất của x (n>= 1000). Thay vì
viết:
For i:=1 to n do S:=s+ x*x*i*i;
Thì nên viết là:
x:= x*x;
For i:=1 to n do s:=s+x*i*i;
Ví dụ 2: Điển hình là bài tốn giải phương trình bậc hai một ẩn ax 2 + bx+c=0. Ta dùng
biến d để tính trước giá trị của Delta rời sau đó dùng lại về sau.
d:=b*b-4*a*c;
If d=0 then
Writeln('Phuong trinh co nghiem kep: x=',-b/(2*a):4:2)
Else
If d<0 then Writeln('Phuong trinh vo nghiem')
Else
Begin
x1:= (-b+sqrt(d))/(2*a);
x2:= (-b-sqrt(d))/(2*a);
Write('Phuong trinh co hai nghiem: ‘);
Writeln(‘ x1=',x1:4:2,' va x2=',x2:4:2);

End;
Ví dụ 3: xét bài tốn “Cơ giáo giao cho An kèm Bình học môn Tin, cô hứa rằng nếu điểm
của An cao hơn học kỳ trước thì cả 2 bạn được thưởng. Ngược lại, An khơng được thưởng,
chỉ có Bình được thưởng. Phần thưởng là thương của điểm số và thời gian làm bài của
Bình. Biết điểm học kỳ trước, thời gian làm bài và điểm của Bình được nhập vào từ bàn
phím. Em hãy tính và viết ra màn hình số tiền thưởng của mỡi bạn.”
Để giải bài tốn trên, có học sinh viết câu lệnh như sau:
If (diem_ky2 > diem_ky1) then
Begin
An:= diem/tg;
Binh:= diem/tg;


8
End
Else Binh:= diem/tg;
Theo cách viết trên, nếu điều kiện là đúng thì (diem/tg) được tính ba lần, nếu khơng
thì một lần. Ta nên tính trước giá trị của (diem/tg) để loại bỏ sự dư thừa này như cách
viết sau:
Binh:= diem/tg;
If (diem_ky2 > diem_ky1) then An:= Binh;
Ở cách viết sau, dù điều kiện là đúng hay sai thì (diem/tg) cũng chỉ thực hiện một
lần.
2.2.6 Khai thác các cơ sở toán học để tối ưu hóa thuật tốn:
Một trong những khó khăn rất lớn trong công tác dạy học môn Tin học tại trường
THPT Trần Phú là chất lượng đầu vào thấp, đặc biệt là mơn Tốn. Trong khi Tin học và
Tốn học lại có mối liên hệ chặt chẽ với nhau. Có nền tảng Toán học tốt sẽ giúp học sinh
học tốt mơn Tin học. Bởi vậy nên trong q trình dạy học môn Tin, tôi luôn chú trọng việc
hỗ trợ học sinh vận dụng các kiến thức Toán học, đặc biệt trong việc tối ưu hóa chương
trình.

a, Lớp bài tốn về số nguyên tố:
Định nghĩa: Một số tự nhiên n (n>1) là số nguyên tố nếu n có đúng hai ước số là 1 và
n. Ví dụ về các số nguyên tố: 123, 5, 7, 11, 13, 17…
Để kiểm tra số nguyên dương n (n>1) có là số nguyên tố không, ta kiểm tra xem có
tồn tại một số nguyên k (2 ≤ k ≤ n-1) mà k là ước của n (n chia hết cho k) thì n khơng phải
là số nguyên tố, ngược lại n là số nguyên tố. Cách làm này cho độ phức tạp thời gian là
O(n).
Dựa vào các cơ sở toán học, ta có thể cải tiến để quá trình kiểm tra diễn ra nhanh hơn.
Cải tiến 1: Nếu n (n>1) không phải là số nguyên tố, ta luôn có thể tách
n = k1 x k2 mà 2 ≤ k1 ≤ k2 ≤ (n-1). Vì k1 x k1 ≤ k1 x k2 =n nên k1 ≤ sqrt(n). Do đó, việc
kiểm tra với k từ 2 đến n-1 là không cần thiết, ta chỉ cần kiểm tra k từ 2 đến sqrt(n). Cách
làm này cho độ phức tạp thời gian là O(sqrt(n)).
Cải tiến 2: sử dụng một trong hai tính chất đơn giản của số nguyên tố:
- Trừ số 2 thì các số nguyên tố là số lẻ.
- Trừ số 2, số 3 các số nguyên tố có dạng 6k±1 (vì số có dạng 6k±2 thì chia hết cho 2, số có
dạng 6k±3 thì chia hết cho 3).
 Ta có thể kiểm tra tính nguyên tố của số n bằng cách kiểm tra xem n có chia hết cho
số 2, số 3 và các số có dạng 6k±1 trong đoạn [5, sqrt(n)].
Code:
function KT_SNT(n:longint):boolean;
var k,sqrt_n:longint;
begin
if (n=2)or(n=3) then exit (true);


9
if (n=1)or(n mod 2=0) or (n mod 3=0) then
exit(false);
sqrt_n:=trunc(sqrt(n));
k:=-1;

repeat
inc (k,6);
if (n mod k=0)or(n mod (k+2)=0) then break;
until k>sqrt_n;
exit (k>sqrt_n);
end;
Độ phức tạp: O(sqrt(n) / 6)
b, Lớp bài toán ước chung lớn nhất:
Định nghĩa: Ước chung lớn nhất của a và b (hai số nguyên khác 0), được định nghĩa là
số nguyên d lớn nhất trong các ước chung của a và b. Ta ký hiệu như sau: d=gcd(a,b).
Chương trình Tin học lớp 10 cho ta thuật toán gợi ý như sau:
var x,y:integer;
begin
readln(x,y);
While x<>y do If x>y then x:=x-y else y:=y-x;
UCLN:=x;
end.
Ta có thể dựa vào một số định lý, hệ quả về ước chung lớn nhất để cải tiến quá trình
trên như sau:
Định lý: Nếu a, b và k là các số nguyên thì gcd(a,b)=gcd(a+k.b,b)
Hệ quả của Định lý:
Với a và b là các số nguyên, b>0 thì: gcd(a,b) = gcd (a mod b, b)
Chứng minh: Căn cứ vào định nghĩa củ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ệ quả là đúng.
Áp dụng hệ quả trên ta có Giải thuật Euclid:
function USCLN(a,b:longint):longint;
var tmp :longint;
begin
while b>0 do

begin
a:=a mod b;
tmp:=a;
a:=b;
b:=tmp;
end;
exit(a);
end;


10
c. Lớp bài toán về Cấp số cộng: Cấp số cộng là một dãy số trong đó, kể từ số hạng thứ hai
đều là tổng của số hạng đứng ngay trước nó với một số không đổi khác 0 gọi là cơng sai.
Cơng thức tính tởng cấp số cộng: ∀n∈N∗,Un+1=Un+d (d được gọi là 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 thì ta dùng cơng thức: S=(U1+Un)* n/2
Ví dụ 1: Xét một bài kinh điển sau: Tính tởng các số từ 1 đến 1 tỉ.
Bình thường, học sinh sẽ ngay lập tức bắt tay vào code với đoạn code sau:
Sum := 0;
For i:=1 to 1000000000 do Sum:=Sum + i;
Cách làm này cho độ phức tạp thời gian là O(n)
Áp dụng các tính chất về cấp số cộng thì ta có tḥt tốn hiệu quả hơn nhiều, ta chỉ
cần một câu lệnh là:
S:= 1000000000 * (1000000000 + 1) / 2 ;
Cách làm này cho độ phức tạp thời gian là O(1).
Ví dụ 2: Tính tởng số từ 1 -> 999 chia hết cho 3 và 5.
Tổng số từ 1 -> 999 chia hết cho 3 và 5 có thể tách ra 3 vế:
sum(3) + sum(5) - sum(15)
(tổng các số chia hết cho 3 + tổng các số chia hết cho 5 và trừ đi tởng các số chia hết
cho 15. Vì chia hết cho 15 chắc chắn sẽ chia hết cho 3 hoặc 5).

Để tính sum(3) chúng ta có cơng thức sau:
Sum(3) = 3 + 6 + 9 + 12 + … + 996 + 999
= 3* (1+2+3+...+333)
Tương tự với dãy chia hết cho 5 và 15
Sum (5) = 5*(1 + 2 + 3 +…+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 bài toán trên như
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ỉ ra tính mới, sự khác biệt của giải pháp mới so với giải pháp cũ
Giải pháp mà tôi đưa ra thể hiện một số tính mới đối với thực trạng dạy học Tin ở
trường THPT Trần Phú trước đây như sau:


11

Thực trạng trước khi áp dụng giải pháp

Tính mới của 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 và ơn thi vào tích hợp trong các 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 trong 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 về tối ưu hóa chương trình.
sinh tự học về tối ưu hóa chương trình
lập trình hiệu quả. Với từng kĩ thuật, giải
pháp mới tiếp cận phù hợp nhất với khả
năng của học sinh trong 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 trong trường
có đầu vào thấp.
Học sinh thường code theo bản năng, ít Giới thiệu và 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 các cơ sở tốn học để tối ưu
trình.
chương trình.
3. Khả năng áp dụng của giải pháp
- Sáng kiến có thể áp dụng vào giảng dạy môn Tin học ở các trường THPT trên đị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 ở
các trường trên địa bàn tỉnh Yên Bái.
- Giải pháp hữu hiệu trong việc giải quyết tốt vấn đề thiếu tư liệu học tập của học
sinh trong bối cảnh đặc điểm của 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 và tư liệu học tập.
- Sáng kiến cung cấp cho giáo viên và 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 chính khóa và hỡ trợ một phần cơng tác ôn thi học sinh
giỏi, dễ áp dụng với giáo viên và học sinh trong nhà trường giúp cải thiện chất lượng bộ
môn, góp phần nâng cao chất lượng dạy và học ôn thi học sinh giỏi.

4. Hiệu quả, lợi ích thu được hoặc dự kiến có thể thu được do áp dụng giải pháp
Khi áp dụng sáng kiến vào q trình giảng dạy bản thân tơi nhận thấy kết quả học
tập của học sinh được nâng lên rõ rệt qua các giờ học, qua mỗi kỳ thi. Trước và sau khi áp
dụng sáng kiến tôi đều cho học sinh làm bài kiểm tra khảo sát, kết quả rất khả quan, cụ thể
như 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 khi áp dụng sáng kiến, kĩ năng tối ưu chương trình lập trình của học sinh được
cải thiện. Chất lượng dạy học được nâng cao thể hiện ở số học sinh đạt giải cấp tỉnh.
4.2. Trong công tác giảng dạy bộ môn:
So sánh kết quả học tập học kỳ I năm học 2021 – 2022:
Kết quả 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)

1

2.22

7

15.56

36

80

1

2.22

23

54.76

19

45.24

0

0


0

0

Qua bảng so sánh trên, ta nhận thấy cùng một khóa học, cùng một chương trình, lớp
có áp dụng SKKN cho kết quả học tập của học sinh cao hơn, đó là: tỉ lệ học sinh giỏi nhiều
hơn 22 học sinh, khá nhiều hơn 12, tỉ lệ học sinh trung bình ít hơn 36 học sinh. Đây là kết
quả đáng ghi nhận ở một trường thuộc khu vực miền núi. Có được sự tiến bộ này là do, với
các lớp thực nghiệm, học sinh được tiếp cận các kĩ thuật tối ưu hóa chương trình lập trình
tốt hơn. Nhờ được 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 các 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
các bài tốn của học sinh đạt hiệu quả tốt hơn. 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 bài tập, ôn tập và làm bài kiểm tra đạt kết quả tốt.
Học sinh học tập tiến bộ hơn, số học sinh học lực khá giỏi tăng, số học sinh học lực trung
bình và 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 quả nêu trên chưa phải là cao so với các trường có chất lượng đầu vào của học
sinh cao hơn, so với những giáo viên có chuyên môn và kinh nghiệm trong giảng dạy, song
với đối tượng học sinh của trường THPT Trần Phú, đối với tơi thì đó là những tín hiệu đáng
mừng. Nó đã chứng minh được tính khả thi của giải pháp mà tôi đã tiến hành, là động lực để
tơi tiếp tục tìm kiếm những sáng kiến mới hữu hiệu trong quá trình giảng dạy của mình.


13
5. 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 đúng
chuyên môn đào tạo, có kinh nghiệm giảng dạy và đầu tư thời gian, nghiên cứu kỹ nội
dung, dạng bài tập, lựa chọn các bài 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, u thích bộ mơn, trang bị đầy đủ sách giáo khoa,
sách bài tập, tài liệu tham khảo, dụng cụ học tập, chú ý nghe giảng và tích cực thực hiện
yêu cầu của giáo viên giảng dạy.

Đưa giải pháp làm tài liệu tham khảo trong thư viện nhà trường và các thư viện lớp
học trong nhà trường.
III. Cam kết không sao chép hoặc vi phạm bản quyền.
Tôi cam đoan những nội dung trong báo cáo là đúng sự thật, không sao chép hoặc vi
phạm bản quyền. Nếu sai hoặc không đúng sự thật tôi xin chịu hoàn toàn trách nhiệm theo
quy định của 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Ị



×