1. Trang chủ
  2. » Luận Văn - Báo Cáo

Kinh nghiệm lựa chọn và cài đặt chương trình tối ưu khi giải một số dạng bài tập tìm kiếm, sắp xếp nhằm nâng cao chất lượng học sinh giỏi môn tin ở trường THPT

19 64 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 19
Dung lượng 164 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Đề tài: KINH NGHIỆM LỰA CHỌN VÀ CÀI ĐẶT CHƯƠNG TRÌNH TỐIƯU KHI GIẢI MỘT SỐ DẠNG BÀI TẬP TÌM KIẾM, SẮP XẾP NHẰM NÂNG CAO CHẤT LƯỢNG HỌC SINH GIỎI MÔN TIN HỌC Ở TRƯỜNG THPT.. Xuất phát từ

Trang 2

Đề tài: KINH NGHIỆM LỰA CHỌN VÀ CÀI ĐẶT CHƯƠNG TRÌNH TỐI

ƯU KHI GIẢI MỘT SỐ DẠNG BÀI TẬP TÌM KIẾM, SẮP XẾP NHẰM NÂNG CAO CHẤT LƯỢNG HỌC SINH GIỎI MÔN TIN HỌC Ở TRƯỜNG THPT.

1 Mở đầu

1.1 Lí do chọn đề tài.

Hiện nay trên thế giới, Tin học ngày càng phát triển mạnh mẽ, có ứng dụng rộng rãi trong hầu hết các lĩnh vực của xã hội, sự phát triển của tin học được tính bằng giờ, cứ mỗi giờ lại có thêm phiên bản phần mềm tin học được nâng cấp hay có những phần mềm mới được tạo ra Máy tính chính là công cụ trợ giúp cho sự phát triển Tin học, có thể đáp ứng nhu cầu tính toán, lưu trữ, tìm kiếm, và xử lý thông tin một cách có hiệu quả

Máy tính có tốc độ xử lý nhanh (hàng tỉ lệnh trên 1 giây) nhưng nó cũng có giới hạn Tất cả các máy tìm kiếm (ví dụ như google, yahoo hay gmail…) đều được lập trình bằng các đoạn lệnh của một Ngôn ngữ lập trình nào đó nhưng máy nào sử dụng thuật toán tối ưu (tốt nhất )

Với một bài toán cũng vậy, một bài toán có thể có nhiều thuật toán để giải nhưng

ta nên lựa chọn thuật toán tối ưu (có số phép tính ít nhất) Do đó, trong khi viết chương trình ta nên tìm cách viết sao cho chương trình thực hiện càng ít phép toán

càng tốt Xuất phát từ thực tế đó tôi đưa ra đề tài: “KINH NGHIỆM LỰA CHỌN

VÀ CÀI ĐẶT CHƯƠNG TRÌNH TỐI ƯU KHI GIẢI MỘT SỐ DẠNG BÀI TẬP TÌM KIẾM, SẮP XẾP NHẰM NÂNG CAO CHẤT LƯỢNG HỌC SINH GIỎI MÔN TIN HỌC Ở TRƯỜNG THPT” nhằm định hướng cho các em học

sinh biết phân tích, lựa chọn thuật toán tối ưu trước khi lập trình giải bài toán trên máy tính

1.2 Mục đích nghiên cứu:

Trang 3

Đề tài này nghiên cứu nhằm giúp học sinh giải quyết tốt các bài toán sắp xếp, tìm kiếm từ đó đổi mới cách tư duy lập trình, để khi đứng trước một bài toán cần giải quyết ngoài việc tìm ra thuật toán để cài đặt chương trình thì học sinh sẽ biết cách

so sánh, đánh giá hiệu quả của thời gian thực hiện chương trình (hay còn gọi là độ phức tạp của thuật toán) và lựa chọn được chương trình phù hợp nhằm nâng cao chất lượng học sinh giỏi

1.3 Đối tượng nghiên cứu:

Sáng kiến kinh nghiệm có đối tượng nghiên cứu là các bài toán sắp xếp, tìm kiếm, được nghiên cứu ở nhiều cách làm, xét trên nhiều phương diện như: độ phức tạp, kết quả output, thời gian thực hiện chương trình

1.4 Phương pháp nghiên cứu

Để trình bày sáng kiến kinh nghiệm này, tôi đã sử dụng phối kết hợp nhiều phương pháp như: nghiên cứu tài liệu, thuyết trình, quan sát, điều tra cơ bản, thực nghiệm so sánh, phân tích kết quả thực nghiệm, … phù hợp với môn học thuộc lĩnh vực Tin học

2 NỘI DUNG NGHIÊN CỨU

2.1 Cơ sở lý luận

Căn cứ vào mục tiêu của môn Tin học, là phải cung cấp những tri thức cơ bản, làm nền tảng để học sinh có thể tiếp tục đi sâu vào tìm hiểu và xây dựng khoa học Tin học hoặc tiếp thu những tri thức của các lĩnh vực kĩ thuật công nghệ tiên tiến, nhất là các lĩnh vực của công nghệ thông tin

Môn Tin học, cũng như mọi môn học khác, căn cứ vào mục tiêu trên để xác định ra nhiệm vụ cụ thể của môn học, tổ chức hoạt động đào tạo góp phần thực hiện mục tiêu giáo dục mà Đảng và nhà nước đề ra

Nếu học sinh thực hiện tốt việc lựa chọn và cài đặt chương trình tối ưu khi giải các bài tập sắp xếp, tìm kiếm nói riêng và các bài tập lập trình nói chung thì chất lượng học sinh giỏi sẽ được nâng cao

2.2 Thực trạng

Trang 4

Những năm đầu tôi dạy bồi dưỡng học sinh giỏi chưa chú trọng nhiều đến cải tiến chương trình tối ưu hơn để chương trình chạy nhanh hơn và chủ yếu là định hướng cho học sinh tìm ra được thuật toán (cách làm) để chương trình cho ra được kết quả mà thôi

Chính vì vậy khi giải quyết các bài toán cơ bản nói riêng và các bài tập lập trình pascal khác nói chung, học sinh và ngay cả giáo viên thường chỉ làm việc với các bộ input có dữ liệu nhỏ dễ nhìn thấy kết quả output và thường không xét đến trường hợp input đặc biệt hay các input có dữ liệu lớn Dẫn đến bị mất điểm trong bài thi học sinh giỏi

Đối với thi học sinh giỏi, dù kết quả output của 2 thí sinh có giống hệt nhau với cùng một bộ input, nhưng việc chênh lệch về thời gian quyết định thí sinh có thể chiến thắng hay thất bại (yêu cầu thời gian xử lí chương trình không quá 1 giây/

1 test)

Trong các kì thi học sinh giỏi gần đây, với cấu trúc đề 5 câu tương ứng với số điểm 6, 5, 4,3,2 trong đó chỉ có không quá 50% các dữ liệu input là nhỏ vừa tầm thì việc thí sinh dù có làm hết cả 4 câu trong đề thì nguy cơ thất bại vẫn rất cao

Bảng điểm các lần thi khảo sát chất lượng học sinh giỏi về chuyên đề số học (do tôi tự tổ chức) năm học 2018 – 2019 khi chưa thực hiện đề tài:

Họ tên Điểm lần 1 Điểm lần 2 Điểm lần 3 Điểm lần 4

Do đó kết quả học sinh giỏi năm 2018- 2019 chưa được như mong muốn, có 2

em học sinh tham gia thi học sinh giỏi Tin của trường thất bại không có em nào đạt giải (mặc dù khi đi thi về các em rất phấn khởi vì nghỉ mình làm bài tốt, đúng vậy bài làm các em đều cho kết quả đúng trong khoảng thời gian cho phép nhỏ hơn 1 giây nhưng với bộ input có dữ liệu nhỏ còn bộ input có dữ liệu lớn thì bài làm vẫn cho kết quả đúng nhưng thời gian chạy chương trình quá 1giây, nghĩa là bộ test có

dữ liệu lớn các em bị mất điểm)

Vấn đề đặt ra, là làm thế nào để lấy được điểm với các bộ input có dữ liệu lớn Muốn vậy cần phải lựa chọn và cài đặt được chương trình hiệu quả (tối ưu) Chương trình hiệu quả là chương trình giải quyết được những bộ input có dữ liệu lớn, chính xác, dung lượng sử dụng bộ nhớ nhỏ, thời gian thực chương trình ngắn, Nhưng trong phạm vi sáng kiến kinh nghiệm của mình, tôi chỉ nghiên cứu

về tiêu chí thời gian thực hiện chương trình để lựa chọn chương trình tối ưu, đây là tiêu chí quan trọng nhất và được người ta quan tâm nhiều Ngoài ra, tôi cũng ưu

Trang 5

tiên lựa chọn chương trình ngắn gọn, dễ hiểu phù hợp với năng lực học sinh trường tôi

Thời gian thực hiện chương trình không chỉ phụ thuộc vào thuật toán mà còn phụ thuộc vào cấu hình máy tính, kĩ xảo người lập trình, kích thước và tính chất của dữ liệu vào, Để cụ thể và tường minh hơn tôi có sử dụng phần

mềm Themis để đo thời gian thực hiện của các chương trình với các bộ test cụ thể

(có file test kèm theo) Các kết quả được tôi thử nghiệm trên máy tính laptop ASUS, Ram 2GB, Processor AMDE-450 APU 1.65HZ

2.3 Các giải pháp.

2.3.1 Kiến thức trọng tâm

+Việc giải bài toán trên máy tính thường được tiến hành qua 5 bước sau:

+ Bước 1: Xác định bài toán;

+ Bước 2: Lựa chọn hoặc thiết kế thuật toán;

+ Bước 3: Viết chương trình;

+ Bước 4: Hiệu chỉnh;

+ Bước 5: Viết tài liệu

Trong 5 bước giải bài toán trên máy tính thì bước lựa chọn hoặc thiết kế thuật toán đặc biệt rất quan trọng để các em có thể phân tích đề bài, tìm ra hướng giải, thuật toán phù hợp

+ Thuật toán là gì

Thuật toán để giải một bài toán là một dãy hữu hạn các thao tác được sắp xếp theo một trình tự xác định sao cho sau khi thực hiện dãy thao tác ấy từ Input của bài toán, ta nhận được Output cần tìm

+ Các tính chất của thuật toán

- Tính dừng: Thuật toán phải kết thúc sau một số hữu hạn các thao tác.

- Tính xác định: Sau khi thực hiện một thao tác thì hoặc là thuật toán kết thúc hoặc là có đúng một thao tác xác định để được thực hiện tiếp theo

- Tính đúng đắn: Sau khi thuật toán kết thúc, ta nhận được Output cần tìm

+ Vì sao phải lựa chọn thuật toán tối ưu

Trang 6

Sau khi đã xây dựng được một thuật toán và một chương trình tương ứng, mặc

dù đã được cài đặt theo một thuật toán đúng và đáp ứng được các tính chất của thuật toán nhưng có thể không cho kết quả mong muốn đối với một bộ dữ liệu nào

đó vì hoặc là nó đòi hỏi quá nhiều thời gian, hoặc là không có đủ bộ nhớ để lưu giữ

dữ liệu và các biến của chương trình Vì vậy ta cần phân tích thuật toán để đưa ra thuật toán tối ưu

+ Căn cứ vào đâu để xác định thuật toán là tối ưu

Với một bài toán, không chỉ có một thuật toán, vậy căn cứ vào đâu để có thể nói được thuật toán này nhanh hơn thuật toán kia? Ta có thể căn cứ vào thời gian và bộ nhớ cần thiết để thực hiện thuật toán Trong đề tài này ta sẽ quan tâm đến thời gian thực hiện thuật toán Việc đánh giá thời gian thực hiện của thuật toán dẫn tới một khái niệm “độ phức tạp về thời gian của thuật toán” đã được chứng minh và thường được gọi tắt là độ phức tạp của thuật toán, kí hiệu là O( ) Độ phức tạp của thuật toán càng nhỏ thì thuật toán càng chạy nhanh và khả thi

Thời gian thực hiện một thuật toán phụ thuộc vào rất nhiều yếu tố như: kích thước của dữ liệu đưa vào, lựa chọn, bố trí kiểu dữ liệu có hợp lý không…

Vậy để tính toán thời gian thực hiện thuật toán ta sẽ đếm số câu lệnh mà nó thực hiện, hoặc trong một số trường hợp có thể đếm cụ thể phép tính số học, so sánh, gán…mà thuật toán đòi hỏi thực hiện hoặc có thể chạy trực tiếp chương trình bằng một ngôn ngữ lập trình cụ thể và thử nghiệm nó nhờ một số bộ dữ liệu nào đấy rồi

so sánh kết quả thử nghiệm với kết quả mà ta đã biết

+ Ngôn ngữ thuật toán

- Ngôn ngữ dùng để miêu tả thuật toán gọi là ngôn ngữ thuật toán

- Thuật toán thường được mô tả bằng một dãy các lệnh Bộ xử lý sẽ thực hiện các lệnh đó theo một trật tự nhất định cho đến khi gặp lệnh dừng thì kết thúc

- Ngôn ngữ thuật toán bao gồm:

+ Ngôn ngữ liệt kê từng bước;

+ Sơ đồ khối;

Trang 7

+ Ngôn ngữ lập trình

- Trong đề tài này tôi ưu tiên sử dụng ngôn ngữ liệt kê từng bước và ngôn ngữ lập trình Pascal

2.3.2 Một số thuật toán sắp xếp, tìm kiếm

2.3.2.1 Thuật toán sắp xếp

*Bài toán: Cho số nguyên dương N và dãy A gồm N số nguyên: a1, a2,…, aN Sắp

xếp dãy A thành dãy không giảm (tức là số hạng trước không lớn hơn số hạng sau)

* Ví dụ: Cho N=10, dãy A: 5 7 8 1 2 3 10 9 0 5

=> Dãy sau khi sắp xếp: 0 1 2 3 5 5 7 8 9 10

* Thuật toán

Có rất nhiều thuật toán sắp xếp như sắp xếp: lựa chọn, thêm dần, phân đoạn, vun đống, hòa nhập hai đường trực tiếp, tuần tự, tráo đổi, sắp xếp nhanh Quick sort… Tuy nhiên trong quá trình dạy học tôi giới thiệu cho học sinh 2 thuật toán: tráo đổi

và Quick sort Thuật toán sắp xếp tráo đổi dễ hiểu nhưng có một số hạn chế, còn quick sort có thời gian thực hiện ít

Trong đề tài này tôi đưa ra hai thuật toán sắp xếp đó là: sắp xếp bằng tráo đổi và sắp xếp nhanh Quick sort để độc giả có sự so sánh và sử dụng linh hoạt trong trường hợp cụ thể

Trang 8

2.3.2.1.1 Thuật toán sắp xếp bằng tráo đổi

Ý tưởng phương pháp: Với mỗi cặp số hạng đứng liền kề trong dãy, nếu số

trước lớn hơn số sau ta đổi chỗ chúng cho nhau Việc đó được lặp lại cho đến khi không có sự đổi chỗ nào nữa

Thuật toán:

Procedure sapxeptraodoi;

Var i, j, tg: integer;

begin

For i:=1 to n-1 do

For j:= n downto i+1 do

If a[j]< a[j-1] then

Begin

Tg:=a[j];

A[j]:=a[j-1];

A[j-1]:=tg;

End;

End;

Nhận xét: Thuật toán trên sử dụng 2 vòng lặp for… => mỗi lần duyệt i phải thực

hiện n-1 phép so sánh để tìm ra giá trị lớn nhất đẩy về cuối dãy Vậy số phép toán

cần thiết là: (n-1)+(n-2)+…+1=

2

) 1 (

* n

n

=> Độ phức tạp của thuật toán xấp xỉ cỡ O(n2)

2.3.2.1.2 Thuật toán sắp xếp nhanh Quick-sort

Ý tưởng phương pháp:

Ý tưởng: Chọn một phần tử làm chốt (ở đây ta chọn phần tử ở vị trí giữa) Từ trái sang tìm phần tử có vị trí i lớn hơn hoặc bằng phần tử chốt, từ phải sang tìm phần tử có vị trí j bé hơn hoặc bằng phần tử chốt Nếu i <= j thì đổi chỗ hai phần tử Làm cho đến khi i > j Lúc này sẽ chia ra được 2 nhóm cần sắp xếp Làm tương tự như vậy với mỗi nhóm cho đến khi đã sắp xếp hết dãy

Trang 9

procedure quicksort(l,r: longint);

var i,j,tg,mid: longint;

begin

i:=l; j:=r;

mid:= a[(l+r) div 2];

repeat

while a[i]< mid do inc(i);

while a[j] > mid do dec(j);

if i<=j then

begin

tg:=a[i];

a[i]:=a[j];

a[j]:=tg;

inc(i); dec(j);

end;

until i> j;

if i<r then quicksort(i,r);

if j>l then quicksort(l,j);

end;

Độ phức tạp thuật toán là O(NlogN)

* Nhận xét chung

So sánh hai thuật toán trên ta thấy thuật toán sắp xếp nổi bọt tuy dễ cài đặt nhưng

có độ phức tạp cỡ O(n2) còn thuật toán Quick-sort chỉ có độ phức tạp cỡ O(nlogn),

có nghĩa là thời gian thực hiện của Quick-sort nhanh hơn rất nhiều Vậy tùy vào từng bài toán cụ thể mà ta nên lựa chọn phương pháp sắp xếp phù hợp Nếu tập dữ liệu đưa vào nhỏ (<=103) thì không nhất thiết phải sử dụng Quick-sort còn nếu tập

dữ liệu đưa vào lớn thì sử dụng thuật toán Quick-sort quả là một giải pháp tuyệt vời

2.3.2.1.3 Thuật toán tìm kiếm

* Bài toán tìm kiếm

Bài toán tìm kiếm được phát biểu như sau: Cho dãy A gồm N số nguyên khác nhau: a1, a2,…, aN và một số nguyên k Cần biết có hay không chỉ số i (1<=i<=N)

mà ai = k Nếu có hãy cho biết chỉ số đó

* Ví dụ: Cho N=6, dãy A gồm các số: 4, 6, 3, 9, 2, 15

Trang 10

+ Với k=9, trong dãy trên có số hạng a4 có giá trị bằng k Vậy chỉ số cần tìm là i=4

+ Với k=5 thì không có số hạng nào trong dãy A có giá trị bằng k

* Trong mục này ta xét hai thuật toán: tìm kiếm tuần tự và tìm kiếm nhị phân

2.3.2.1.3.1 Thuật toán tìm kiếm tuần tự

Xác định bài toán:

- Input: dãy a gồm N số nguyên khác nhau a1, a2,…, aN và một số nguyên k.

- Output: vị trí (vt) bằng chỉ số i mà ai = k hoặc thông báo không có số hạng nào của dãy A có giá trị bằng k

Ý tưởng: Trước hết ta so sánh k với a1 nếu k = a1 thì vị trí là 1, nếu k <>a1 ta so

sánh tiếp k với a2 Nếu k = a2 thì vị trí của k là 2, còn trường hợp k <>a2 thì so sánh tiếp k với a3… Quá trình trên được tiếp tục cho đến khi nếu k=ai (i<=n) thì vị trí là

i, trường hợp k <> ai mà i>n thì k không có mặt trong dãy A

Giải thuật TIM_KIEM_TUAN_TU:

for i:= 1 to n do

if a[i]=k then

begin

vt:=i;

break;

end;

if vt>0 then write(f2,'da tim thay tai vi tri:',vt)

else write(f2,'khong tim thay');

Nhận xét:

Tìm kiếm tuần tự là kỹ thuật tìm kiếm rất đơn giản và cổ điển, trong thuật toán

ta sử dụng thêm câu lệnh break để sau khi đã tìm thấy khóa k có trong dãy thì thoát luôn ra khỏi vòng lặp và kết thúc chương trình, điều này giúp giảm đi đáng kể số lượng phép toán

Trang 11

Ta thấy với giải thuật trên, trường hợp tốt nhất là tìm thấy khóa k nằm ngay đầu dãy thì chỉ cần 1 phép so sánh; trường hợp trung bình là khóa k nằm ở vị trí giữa dãy cần n21 phép so sánh, trường hợp xấu nhất là tìm thấy khóa k nằm ở cuối dãy cần n+1 phép so sánh => Thời gian thực hiện của giải thuật trên là ~ O(n)

2.3.2.1.3.2 Thuật toán tìm kiếm nhị phân

Xác định bài toán:

- Input: dãy a gồm N số nguyên khác nhau a1, a2,…, aN (dãy A đã được sắp theo

thứ tự tăng dần) và một số nguyên k

- Output: vị trí (vt) bằng chỉ số i mà ai = k hoặc thông báo không có số hạng nào của dãy A có giá trị bằng k

Ví dụ:

Cho dãy A tăng dần: 5 6 12 15 17 18 19 Tìm số k=18 có trong dãy A không?

Để giải bài toán này ta có thể sử dụng thuật toán tìm kiếm nhị phân

Ý tưởng: So sánh khóa k với số hạng aGiua ở giữa dãy, trong đó Giua= [(n+1)/2].

Khi đó xảy ra một trong ba trường hợp:

+ Nếu k = aGiua thì Giua là chỉ số cần tìm Kết thúc việc tìm kiếm

+ Nếu k > aGiua thì việc tìm kiếm k trên dãy gồm các số hạng aGiua+1, aGiua+2,…, aN; + Nếu k < aGiua thì việc tìm kiếm k sẽ thực hiện trên dãy gồm các số a1, a2,…, aGiua-1

Trong trường hợp một nếu k = aGiua thì việc tìm kiếm kết thúc quá đơn giản còn nếu không thì cả hai trường hợp hai và ba đều đưa đến bài toán tìm kiếm trên bảng không lớn hơn [n/2] phần tử Quá trình trên được thực hiện cho tới khi bảng liệt kê chỉ còn 1 phần tử và so sánh k với chính số hạng này Việc tìm kiếm này giúp thu hẹp nhanh phạm vi tìm kiếm Ta có thể mô tả thuật toán tìm kiếm nhị phân như sau:

Giải thuật TIM_KIEM_NHI_PHAN:

Ngày đăng: 10/07/2020, 10:18

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w