1. Trang chủ
  2. » Giáo án - Bài giảng

Skkn Hướng dẫn học sinh lựa chọn thuật toán tối ưu khi lập trình giải bài toán trên máy tính

27 405 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 27
Dung lượng 176 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ên sáng kiến: Hướng dẫn học sinh lựa chọn thuật toán tối ưu khi lập trình giải bài toán trên máy tính.. Đề tài: Hướng dẫn học sinh lựa chọn thuật toán tối ưu khi lập trình giải bài to

Trang 1

THÔNG TIN CHUNG VỀ SÁNG KIẾN

1 Tên sáng kiến:

Hướng dẫn học sinh lựa chọn thuật toán tối ưu khi lập trình giải bài toán trên máy tính.

2 Lĩnh vực áp dụng sáng kiến:

Áp dụng trong giảng dạy lập trình môn tin học 11

3 Thời gian áp dụng sáng kiến:

Từ ngày 20, tháng 09, năm 2014 đến ngày 20, tháng 4, năm 2016

4 Tác giả:

Họ và tên: Nguyễn Thị Phương Ngân

Năm sinh: 1986

Nơi thường trú: Khu Tập thể giáo viên trường THPT Mỹ Tho

Trình độ chuyên môn: cử nhân sư phạm tin học

Chức vụ công tác: Giáo viên dạy môn Tin học

Nơi làm việc: Trường THPT Mỹ Tho

Điện thoại: 0975061791

5 Đơn vị áp dụng sáng kiến:

Tên đơn vị: Trường THPT Mỹ Tho

Địa chỉ: xã Yên Chính – Ý Yên – Nam Định

Trang 2

MỤC LỤC

Trang I Điều kiện, hoàn cảnh tạo ra sáng kiến 4

II Mô tả giải pháp 5

1 Thực trạng 5

2 Các giải pháp trọng tâm 5

2.1 Mục đích, yêu cầu 5

2.2 Nội dung 6

2.2.1 Nhắc lại các bước lập trình giải bài toán trên máy tính 6

2.2.2 Một số khái niệm 7

2.2.2.1 Khái niệm thuật toán 7

2.2.2.1.1 Thuật toán là gì 7

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

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

2.2.3 Một số thuật toán cơ bản thường dùng 8

2.2.3.1 Thuật toán sắp xếp 8

2.2.3.1.1 Bài toán 8

2.2.3.1.2 Thuật toán 9

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

2.2.3.1.2.2 Thuật toán sắp xếp nhanh Qick-sort 10

2.2.3.1.3 Nhận xét chung 11

Trang 3

2.2.3.2 Thuật toán tìm kiếm 11

2.2.3.2.1 Bài toán tìm kiếm 11

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

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

2.2.3.2.2 Nhận xét chung 14

2.2.4 Một số ví dụ minh chứng 15

2.2.4.1 Ví dụ 1 15

2.2.4.2 Ví dụ 2 16

2.2.4.3 Ví dụ 3 (Đề thi học sinh giỏi tỉnh nam định năm học 2015 – 2016) 20

III Hiệu quả do sáng kiến đem lại 23

1 Hiệu quả kinh tế 23

2 Hiệu quả về mặt xã hội 24

IV Đề xuất, kiến nghị: 25

V Cam kết không sao chép hoặc vi phạm bản quyền 26

Trang 4

Đề tài: Hướng dẫn học sinh lựa chọn thuật toán tối ưu khi lập trình giải bài toán trên máy tính.

I Điều kiện, hoàn cảnh tạo ra sáng kiến

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ụngrộ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 đượctí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ângcấp hay có những phần mềm mới được tạo ra Ở Việt Nam cũng vậy, tin học

có mặt trợ giúp trong mọi ngành nghề, ở khắp mọi nơi, từ thành thị đến nôngthôn và phổ biến với tất cả mọi người từ người già đến trẻ, từ những công -nhân viên đến những người nông dân đều rất cần đến sự trợ giúp của tin học.Ngày nay, tin học đã trở thành một phần không thể thiếu trong cuộc sống củamỗi chúng ta

Lịch sử phát triển xã hội loài người đang ở nền văn minh thứ ba Sự hìnhthành và phát triển của mỗi nền văn minh gắn liền với một công cụ lao độngmới, chẳng hạn như máy hơi nước – đối với nền văn minh công nghiệp, máytính điện tử - đối với nền văn minh thông tin 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ìmkiế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ưngmáy nào sử dụng thuật toán tối ưu (tốt nhất ) thì tìm kiếm được nhanh, chínhxác và sẽ được đông đảo người dùng lựa chọn sử dụng

Trang 5

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ảinhưng ta nên lựa chọn thuật toán tối ưu (có số phép tính ít nhất) Vậy việc lựachọn một thuật toán đưa tới kết quả nhanh là một đòi hỏi thực tế cần đượcquan tâm đặc biệt Do đó, trong khi viết chương trình ta nên tìm cách viết saocho 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: “Hướng dẫn học sinh lựa chọn thuật toán tối ưu khi lập trình giải bài toán trên máy tính” 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ênmáy tính

II Mô tả giải pháp

1 Thực trạng

Nhận thấy tầm quan trọng của Tin học đối với thực tế cuộc sống, mọi lĩnhvực, ngành nghề, từ năm học 2007- 2008 Bộ giáo dục và đào tạo đã đưa mônTin học thành môn học chính thức ở tất cả các trường Trung học cơ sở, Trunghọc phổ thông Mỗi khối lớp được biên soạn chương trình từ cơ bản đến cụthể từng vấn đề nhằm giúp học sinh có sự hiểu biết về Tin học, có sự tư duy,logic giữa Tin học với các môn học khác, từ đó giúp các em vận dụng vàothực tế

Trong chương trình Tin học 11 đi sâu vào dạy học lập trình, các em học sinh

đã hiểu được những khái niệm cơ sở, kiến thức về lập trình, đã có thể vậndụng kiến thức để lập trình giải các bài toán trên máy tính Tuy nhiên các emlập trình còn mang tính chất cảm tính, lập trình sao cho chương trình chạyđược chứ chưa biết phân tích, lựa chọn thuật toán tối ưu để giải quyết bài

toán Trước thực tế đó tôi đưa ra đề tài: “Hướng dẫn học sinh lựa chọn thuật toán tối ưu khi lập trình giải bài toán trên máy tính” nhằm định

hướng cho các em biết thuật toán tối ưu là gì, vì sao phải lựa chọn thuật toán

Trang 6

tối ưu, để từ đó các em biết phân tích, lựa chọn thuật toán trước khi lập trìnhgiải bài toán trên máy tính.

- Thông qua một số thuật toán cơ bản (như sắp xếp, tìm kiếm,…) học sinh biếtvận dụng để có thể giải quyết những bài toán phức tạp hơn

2.2 Nội dung

2.2.1 Nhắc lại các bước lập trình giải bài toán trên máy tính

Thông thường khi lập trình giải bài toán trên máy tính học sinh hay bị mắc

sai lầm là viết chương trình luôn mà bỏ qua các bước giải bài toán trên máytính, vì vậy có khi chương trình đã chạy nhưng sai kết quả vì hiểu sai đề, hoặcthuật toán chưa khả thi…

Vì vậy khi dạy lập trình giáo viên nhắc học sinh không nên ngay lập tứcviết chương trình mà nên nhớ lại các bước giải bài toán trên máy tính Việcgiả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;

Trang 7

+ 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 rahướng giải, thuật toán phù hợp

2.2.2.1.2 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 lần thực hiện các

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

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

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ínhchấ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ântích thuật toán để đưa ra thuật toán tối ưu

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

Trang 8

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ờigian và bộ nhớ cần thiết để thực hiện thuật toán Trong đề tài này ta sẽ quantâ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ủathuậ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íchthướ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ếpchươ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

c 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ựchiệ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ếtthúc

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

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

Trang 9

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

2.2.3.1.1 Bài toán

* 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

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ạttrong trường hợp cụ thể

2.2.3.1.2.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:

Trang 10

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

* 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=n*(2n 1) => Độ phức tạp của thuậttoán xấp xỉ cỡ O(n2)

2.2.3.1.2.2 Thuật toán sắp xếp nhanh Qick-sort

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

Để sắp xếp dãy trước tiên ta chọn một phần tử ngẫu nhiên trong dãy làm

“chốt” Mọi phần tử có giá trị nhỏ hơn “chốt” phải được xếp vào vị trí trước

“chốt” (đầu dãy); mọi phần tử có giá trị lớn hơn “chốt” phải được xếp vào vịtrí sau “chốt” (cuối dãy) Khi đó dãy cần sắp xếp được phân thành hai đoạn:một đoạn gồm các phần tử có giá trị nhỏ hơn “chốt”, một đoạn gồm các phần

tử có giá trị lớn hơn “chốt” Cứ tiếp tục sắp xếp lặp đi lặp lại như vậy với cácđoạn con cuối cùng ta sẽ thu được dãy đã được sắp xếp theo chiều tăng dần

* Thuật toán:

Trang 11

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

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

là một giải pháp tuyệt vời

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

Trang 12

2.2.3.2.1 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ênkhá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

+ 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.2.3.2.1.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ạngnà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ãyA

* Giải thuật TIM_KIEM_TUAN_TU:

Trang 13

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ậttoán ta sử dụng thêm câu lệnh break để sau khi đã tìm thấy khóa k có trongdã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úpgiảm đi đáng kể số lượng phép toán

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 knằ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ậttrên là ~ O(n)

2.2.3.2.1.2 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

Trang 14

+ 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,

* Giải thuật TIM_KIEM_NHI_PHAN:

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

else write('khong tim thay');

* Nhận xét:

Trong giải thuật trên trường hợp tốt nhất là tìm thấy khóa k = aGiua thì việctìm kiếm kết thúc quá đơn giản (chỉ cần 1 phép so sánh) Còn nếu khôngtrường hợp xấu nhất người ta cũng chứng minh được thời gian thực hiện củagiải thuật trên là ~ O(log2n)

Trang 15

2.2.3.2.2 Nhận xét chung

So với thuật toán tìm kiếm tuần tự, thuật toán tìm kiếm nhị phân thực hiệntìm kiếm trên bảng không lớn hơn [n/2] phần tử Vậy trong trường hợp bảngliệt kê đã được sắp thứ tự thì thuật toán tìm kiếm nhị phân tốt hơn thuật toántìm kiếm tuần tự rất nhiều, còn trong trường hợp dãy khóa chưa được sắp xếpthì thời gian chi phí cho sắp xếp cũng phải kể đến Vì vậy tùy từng trường hợp

đề bài ra ta nên cân nhắc lựa chọn thuật toán sao cho phù hợp để chi phí thựchiện là ít nhất

* Lựa chọn thuật toán cho bài toán:

Bài toán cổ trên rất gần gũi với các em học sinh, các em có thể dễ dàng ápdụng toán học để giải ra kết quả Có rất nhiều cách khác nhau để giải bài toánnày Một cách đơn giản và số phép toán thực hiện cũng tương đối ít, học sinh

có thể dễ dàng đưa ra là: Gọi số gà là g; số chó là c Khi đó ta sẽ có số chónằm trong phạm vi từ 1 đến 25 và có thể dễ dàng xây dựng được chương trìnhnhư sau:

Program bai_toan_co_1;

uses crt;

var g,c: integer;

begin

Trang 16

* Nhận xét: Ta thấy tổng số gà và chó là 36 và tổng số chân là 100 Giả sử tất

cả là chó, thì số con tối đa là 100/4 = 25 (con); tối thiểu là 36 / 4 = 9 (con) Như vậy chúng ta chỉ cần sử dụng vòng lặp for từ 9->25 Cách này sẽ tối ưu hơn

Chương trình minh họa:

Trang 17

Cho mảng A gồm n phần tử Hãy viết chương trình tạo mảng B[1 n], trong

đó b[i] là tổng của i phần tử đầu tiên của A ( Bài 2- Bài tập và thực hành SGK trang 66)

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

+ Input: mảng A gồm n phần tử;

+ Output: tạo mảng b[1 n], trong đó b[i] là tổng của i phần tử đầu tiên của a;

* Để giải quyết 1 bài toán có thể có rất nhiều thuật toán để giải Giả sử thoạtđầu có thể sử dụng chương trình sau (có trong SGK) để giải quyết bài toánnày:

{ Tao ngau nhien mang gom n so nguyen}

for i:=1 to n do a[i]:=random(300)-random(300);

for i:=1 to n do write(a[i]:5);

Trang 18

end;

{ Ket thuc tao b}

for i:=1 to n do write(b[i]:6);

* Quan sát từ đoạn{ Bat dau tao b} ta thấy phải sử dụng 2 vòng lặp for lồng

nhau for i:=1 to n do

begin

b[i]:=0;

for j:=1 to i do b[i]:=a[i]+a[j];

end;

* Nếu sử dụng thuật toán trên thì máy tính phải thực hiện n(n+1)/2phép cộng.

* Trong bài toán này ta thấy:

b[1]=a[1]

b[i]=b[i-1]+a[i] , 1<i<=n

Do đó, ta thay đoạn chương trình từ chú thích { Bat dau tao b} đến {Ket thuctao b} bởi hai lệnh sau:

Trang 19

for i:= 2 to n do b[i]:=b[i-1]+a[i];

* Với hai lệnh này, máy chỉ phải thực hiện n-1 phép cộng.

Ta có chương trình minh họa khi thay như sau:

{ Tao ngau nhien mang gom n so nguyen}

for i:=1 to n do a[i]:=random(300)-random(300);

for i:=1 to n do write(a[i]:5);

writeln;

b[1]:=a[1];

for i:= 2 to n do b[i]:=b[i-1]+a[i];

for i:=1 to n do write(b[i]:6);

Ngày đăng: 13/05/2017, 15:30

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