5.Chọn thuật giải tối u:

Một phần của tài liệu Phát triển tư duy thuật giải cho học sinh trung học phổ thông thông qua giảng dạy môn tin (Trang 32 - 39)

Việc rèn luyện, phát triển t duy thuật giải cho đối tợng học sinh đại trà thì việc thực hiện chọn thuật giải tối u thờng gặp nhiều khó khăn, lý do có thể kể đến là:

+ Học sinh không đợc học khái niệm “ Độ phức tạp của một thuật giải” một cách tờng minh.

+ Việc đánh giá độ phức tạp của một thuật giải vốn là một bài toán khó....

Tuy nhiên giáo viên có thể từng bớc hình thành, rèn luyện cho học sinh khả năng đánh giá độ phức tạp của thuật giải ở mức độ đơn giản dới các góc độ sau:

+ Độ phức tạp về thời gian tính của thuật giải (số phép tính máy phải thực hiện)

+ Độ phức tạp của dung lợng nhớ dùng cho thuật giải. Chẳng hạn, ta lấy ví dụ cụ thể trong SGK tin học lớp 10: Ví dụ 1: Lập trình giải bài toán cổ “ Vừa gà vừa chó”

Phơng án 1: Gọi số gà là i ( Khi đó số chó là 36-i)

Từ giả thiết suy ra i là một số nguyên và có thể nhận giá trị từ 1 đến 36.

Ta có thuật giải:

For i:=1 to 36 do

If 2*i + ( 36-i) * 4 = 100 then Thông báo kết quả

Với mỗi bớc lặp về hình thức máy phải thực hiện 5 phép toán, nếu gọi thời gian để thực hiện một lợt 5 phép toán đó là t thì thời gian thực hiện thuật giải là 36t.

Phơng án 2: Gọi số chó là i ( số gà là 36 - i). Vậy i là một số nguyên có thể nhận giá trị từ 1 đến 25 ( vì tổng số chân chỉ có 100 nên số chó tối đa là 25) ta có thuật giải:

For i:=1 To 25 Do

If 4*i + (36 –i )*2 = 100 then Thông báo kết quả

Phơng án 3: Gọi số gà là i, số chó là j. Từ giả thiết suy ra i là số nguyên và có thể nhận giá trị từ 1 đến 36, j nhận giá trị từ 1 đến 25.

Ta có thuật giải: for i:=1 to 36 do

for j:=1 to 25 do

if i+j=36 and 2*i+4*j=100 then Thông báo kết quả

Thời gian để thực hiện thuật giải 3 là: 900t

So sánh 3 phơng án trên thì phơng án 2 tối u hơn vì thời gian để thực hiện là ít nhất.

Ví dụ 2: Viết chơng trình nhập vào 20 số thực, sau đó sắp lại dãy theo chiều tăng dần và cho biết một số thực X có thuộc mảng không?

Khi giải quyết công việc sắp xếp lại dãy số, học sinh thờng sử dụng thuật giải sắp xếp tuần tự hoặc sắp xếp “nổi bọt”, 2 thuật giải này đều tối đa là thực hiện n(n-1)/2 lần so sánh (độ phức tạp tối đa của 2 thuật giải đều là 0(n2)). Nên giáo viên hớng học sinh so sánh độ phức tạp của thuật giải ở công đoạn tìm số thực X có mặt trong dãy:

Phơng án 1: Ta lần lợt so sánh số X với từng số trong dãy: i:=1,ok:=true

while ( i<=20) and ok Do if X =a[i] then

Begin

Thông báo đã tìm thấy ở vị trí i; ok:=False;

end else i:= i+1;

Vậy tối đa thuật giải thực hiện 20 lần phép toán so sánh.

Phơng án 2: Lần lợt so sánh X với số nằm ở vị trí giữa của dãy. đau:=1; cuoi:=20; ok:=true;

while(đau <=cuoi) and ok Do Begin (adsbygoogle = window.adsbygoogle || []).push({});

k: = trunc((dau+cuoi)/2); if a[k] =X then

Thông báo tìm thấy ở vị trí i; ok:=False;

end

else if a[k] > X then cuoi:= k –1 else dau:=k+1;

end;

Vậy sau mỗi bớc lặp hoặc ta tìm đợc số X hoặc chỉ còn phải so sánh X với một nửa các phần tử của dãy. Bằng các ví dụ cụ thể với số phần tử n càng lớn, học sinh càng chỉ ra đợc tính tối u của phơng án 2 so với phơng án 1 ( độ phức tạp của phơng án 2 là 0( log2n) trong khi đó độ phức tạp của thuật giải trong phơng án 1 là 0(n))

Ví dụ 3: Tính giá trị của đa thức:

P(X) = an Xn + an-1Xn-1+...+a1X + a0 tại X =X0

Phơng án 1: Tính giá trị từng hạng tử của đa thức rồi cộng lại. S:= a[0];

For i: =1 To n Do Begin

for j:=1 To n Do a[i]:= a[i]*X0; S:= S + a[i];

end;

ở bớc tính giá trị hạng tử thứ i cần phải thực hiện i phép nhân, vậy số phép nhân cần phải thực hiện là:

1+2+...+n = n(n+1)/2;

Sau đó ta cần thực hiện n phép cộng để cộng từng hạng tử vào tổng S. Vậy tổng các phép toán cần thực hiện là:

n + n(n+1)/2 = n(n+3)/2 Phơng án 2: Tính dồn theo bậc tg:= 1; S:= a[0]; for i:=1 to n do Begin tg:= tg*X0; S:=S + a[i] *tg;

Vậy với mỗi bớc lặp số phép toán phải thực hiện gồm 2 phép nhân và một phép cộng. Do vậy tổng số phép toán phải thực hiện là 3n.

Phơng án 3: Ta có đa thức P(X) có thể biểu diễn dới dạng: P(X) = (...(anX + an-1)X + an-2)X + ...+X) + a0

Nên ta có thể tính giá trị của P(X) tại X = X0 nh sau: S:= a[n];

for i: =1 to n do S: = S * X0 + a[n – i]

Với mỗi bớc của vòng lặp ta cần thực hiện một phép toán nhân và một phép toán cộng, một phép toán trừ. Vậy tổng số phép toán phải thực hiện là 3n.

Phơng án 4: Tơng tự nh phơng án 3 nhng ta dùng vòng for dạng lùi. S: = a[n];

For i: =n-1 Downto 0 Do S : = S * X0 + a [i]

Mỗi bớc của vòng lặp số phép toán đợc thực hiện là một phép toán nhân và một phép toán cộng. Tổng cộng số phép toán sẽ thực hiện là 2n.

So sánh với 3 phơng án trên thì phơng án 4 tối u hơn cả vì số phép toán phải thực hiện là ít nhất. Do đó, để chọn thuật giải tối u, trong bài giảng giáo viên nên có những tình huống tạo cho học sinh các mối liên hệ xuôi, ngợc và các biện pháp nhằm phát huy tính năng động, sự sáng tạo, sự say mê tìm tòi của học sinh. Trong quá trình giảng dạy giáo viên không chỉ đơn thuần là đa ra các bài toán khó, mà giáo viên phải chú trọng đến việc giúp học sinh tìm tòi, so sánh để đa ra thuật giải tối u, phù hợp với nội dung của bài toán.

Chẳng hạn: + Khi lập trình tính giá trị của một đa thức bậc n ( n < 255) với các hệ số nhập từ bàn phím tại giá trị X0. Giáo viên yêu cầu học sinh so sánh việc tính giá trị từng hạng tử của việc sử dụng phơng pháp Horner.

+ Khi lập trình giải phơng trình bậc 2, giáo viên cùng học sinh đa ra 2 thuật giải nh sau:

a) Khai báo biến và gán giá trị cho delta: (Delta: = sqr(b) – 4*a*c)

b) Viết biểu thức: (sqr(b) – 4*a*c) trong biểu thức điều kiện của câu lệnh IF...THEN hoặc trong các biểu thức tính nghiệm.

Giáo viên chỉ rõ số các phép toán mà mỗi chơng trình phải thực hiện và học sinh tự nhận xét về mặt hình thức chơng trình sử dụng a) sử dụng nhiều câu lệnh và nhiều biến hơn nhng lại tối u hơn chơng trình sử dụng b) vì máy phải tính biệt thức delta có một lần. (adsbygoogle = window.adsbygoogle || []).push({});

Để mô tả thuật giải bớc đầu giáo viên hớng dẫn học sinh có thể sử dụng phơng pháp liệt kê. Tuy phơng pháp này dài không có tính cấu trúc song nó

gần với ngôn ngữ tự nhiên, học sinh dễ dàng mô tả từng bớc của thuật giải bằng lu đồ hoặc ngôn ngữ phỏng trình từ đó mã hoá thành chơng trình.

Ví dụ 4: Chẳng hạn, tìm nghiệm của phơng trình bậc 2:

aX2 + bX + c = 0, a,b,c ∈ R

Học sinh có thể liệt kê: Thông tin ban đầu là các hệ số a, b,c còn kết quả là nghiệm x1,x2. Nếu a ≠ 0 là phơng trình bậc 2, còn nếu a = 0 là phơng trình bậc nhất x = -c/b. Để tìm nghiệm đầu tiên ta tính biệt thức:

∆ = b2 – 4ac.

nếu ∆≥0 có hai nghiệm thực: x1 =−b2+a ∆;x2 =−b2−a ∆ Còn ngợc lại có hai nghiệm phức liên hợp là phần thực

Re(x) = -b/2a và phần ảo Im(x) = −∆/2a

Học sinh sẽ có lu đồ của bài toán

Đúng Sai Đúng Sai Begi n Đọc a,b,c a#0 ∆:=b2-4ac x=-c/b ∆>= 0 x1=(-b+ ∆)/2a Re(x)=-b/2a

Từ lu đồ trên học sinh mã hóa thành chơng trình PASCAL: program phuong_trinh_bac_hai; Uses crt; var a,b,c,delta,x1,x2:real; Begin Clrscr; write(‘nhap a,b,c:’); readln(a,b,c); delta: = b*b – 4*a*c;

if delta < 0 then writeln(‘phơng trinh vo nghiem’) else if delta = 0 then

writeln(‘pt co nghiem kep x=’,-b/(2*a):10:2) else

Begin

writeln(‘pt co hai nghiem:’);

writeln(‘x1=‘,(-b+sqrt(delta))/(4*a):10:2); writeln(‘x2=‘,(-b–sqrt(delta))/ 4*a):10:2);

end;

readln; End.

Ví dụ 5: Tìm giá trị Max trong ba giá trị của số thực A,B,C. Thông tin ban đầu là giá trị của A,B,C, rõ ràng rằng bất kỳ số A hoặc B,C có thể là số lớn nhất.

Để tìm số lớn nhất trong các số A,B,C đầu tiên ta so sánh các số với nhau. Nếu A >B và A> C thì Max:=A. Nếu A > B còn A ≤ C thì Max: =C. Nếu A ≤B và B <=C ta có Max :=C. Nếu A≤B và

B >C thì Max: = B.

Lu đồ của thuật toán này là:

Đúng Sai Sai Sai

Đúng Đúng

Chuyển thành chơng trình PASCAL: Program tim_max; Uses crt; Var A,B,C,Max:real; Begin Clrscr; write(‘nhap A,B,C:’); readln(A,B,C); max:=A;

if max < B then max:=B; if max < C then max: =C;

writeln(‘gia tri cuc dai của ‘,A,B,C’ la:’,max); readln; End. Begi n Đọc A,B,C A> B A> C B>C

max:=A max:=C max:=B (adsbygoogle = window.adsbygoogle || []).push({});

In max

chơng III: thực nghiệm s phạm

Một phần của tài liệu Phát triển tư duy thuật giải cho học sinh trung học phổ thông thông qua giảng dạy môn tin (Trang 32 - 39)