1. Trang chủ
  2. » Giáo Dục - Đào Tạo

(SKKN 2022) XÂY DỰNG THUẬT TOÁN TỐI ƯU CHO MỘT SỐ BÀI TOÁN THƯỜNG GẶP TRONG TIN HỌC 11 SỬ DỤNG NGÔN NGỮ LẬP TRÌNH C++

22 9 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 22
Dung lượng 203 KB

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

Nội dung

Tuy nhiên, trong bộ môn tin học Tin học ởbậc Trung học phổ thông, đặc biệt là chương trình Tin học khối 11 rất khócho học sinh có thể hiểu được một ngôn ngữ lập trình, vận dụng được ngôn

Trang 1

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ

TRƯỜNG THPT YÊN ĐỊNH 2

SÁNG KIẾN KINH NGHIỆM

XÂY DỰNG THUẬT TOÁN TỐI ƯU CHO MỘT SỐ BÀI

TOÁN THƯỜNG GẶP TRONG TIN HỌC 11

Trang 2

MỤC LỤC

1 PHẦN MỞ ĐẦU 3

1.1 LÝ DO CHỌN ĐỀ TÀI 3

1.2 MỤC ĐÍCH NGHIÊN CỨU 4

1.3 ĐỐI TƯỢNG VÀ PHẠM VI NGHIÊN CỨU 4

1.4 PHƯƠNG PHÁP NGHIÊN CỨU 4

2 PHẦN NỘI DUNG 5

2.1 CƠ SỞ LÝ LUẬN 5

2.2 THỰC TRẠNG VẤN ĐỀ 5

2.3 HƯỚNG DẪN HỌC SINH XÂY DỰNG THUẬT TOÁN TỐI ƯU CHO MỘT SỐ BÀI TOÁN CƠ BẢN 7

2.3.1 Định nghĩa về thuật toán tối ưu 7

2.3.2 Bài toán nhặt sỏi: 9

2.3.3 Bài toán số hoàn hảo 12

2.3.4.Bài toán số nguyên tố 15

2.3.5.Bài toán cổ: [1] 17

2.4 HIỆU QUẢ ĐẠT ĐƯỢC 19

2.4.1 Kết quả sau khi áp dụng vào thực tế 19

2.4.2 Điều kiện để áp dụng sáng kiến 20

3 PHẦN KẾT LUẬN, KIẾN NGHỊ 20

3.1 KẾT LUẬN 20

3.2 KIẾN NGHỊ 20

TÀI LIỆU THAM KHẢO 22

Trang 3

1 PHẦN MỞ ĐẦU 1.1.LÝ DO CHỌN ĐỀ TÀI

Hiện nay công nghệ thông tin rất phát triển, nó ứng dụng trong tất cả cáclĩnh vực từ kinh tế, chính trị, xã hội Nhờ có khối óc của con người và sự trợgiúp đắc lực của máy tính điện tử mà tất cả những bài toán tưởng chừng khónhất, phức tạp nhất đều được giải quyết một cách nhanh nhất, chính xác nhất,

và lưu trữ được lâu nhất

Để đẩy mạnh sự phát triển đó, bộ môn Tin học được đưa vào giảng dạytrong nhà trường cũng rất lâu rồi Tuy nhiên, trong bộ môn tin học Tin học ởbậc Trung học phổ thông, đặc biệt là chương trình Tin học khối 11 rất khócho học sinh có thể hiểu được một ngôn ngữ lập trình, vận dụng được ngônngữ lập trình đó cùng với sự tư duy của bản thân để viết được một chươngtrình giải quyết bài toán nào đó Có thể nói, học sinh cần phải làm quen vớilối suy nghĩ logic, cần phải có tư duy toán học và cần phải hiểu sự hoạt độngcủa máy tính, mà đây lại là một cách học hoàn toàn khác với các môn học cònlại

Bộ môn Tin học đã từng được rất ít học sinh trường Trung học phổ thôngYên Định 2 quan tâm, yêu thích vì nó không thuộc tổ hợp môn thi Đại họcnào Nhất là Tin học lớp 11, một nội dung kiến thức cần rất nhiều sự tư duysâu và khả năng sáng tạo Trong khi đó, khi hướng dẫn học sinh giải quyếtcác bài toán bằng các định nghĩa thông thường có thể chưa tối ưu và khi chạychương trình các em sẽ thấy chẳng có gì thú vị để thôi thúc sự hứng thú tìmtòi sáng tạo của các em Nhưng bằng niềm đam mê, tình yêu nghề buộc bảnthân tôi luôn không ngừng học hỏi trau dồi kiến thức để nghiên cứu các vấn

đề nảy sinh trong quá trình giảng dạy, hướng dẫn học sinh tìm ra cách giảiquyết tối ưu cho mỗi bài toán, tìm ra phương pháp khích lệ học sinh hứng thúhọc tập với bộ môn Tin học Mục tiêu đặt ra là thu hút học sinh khối 11 dànhnhiều thời gian tìm hiểu các dạng bài tập và xây dựng được thuật toán tối ưucho mỗi bài toán đặt ra Tôi đã xâu chuỗi được một vài dạng bài tập liên quanđến các nội dung để hướng dẫn cho học sinh tìm hiểu và giải quyết như: Bàitập về sử dụng vòng lặp, bài tập về kiểu mảng, bài tập với dãy số, bài tập vềkiểu xâu…Khi hướng dẫn các em học sinh tìm và xây dựng thuật toán tối ưucho các bài toán thường gặp, tôi nhận thấý các em có sự hứng thú đặc biệt.Các em đã dành rất nhiều thời gian để trăn trở cách giải quyết cho mỗi bàitoán mà cô đưa ra Khi bài toán được giải quyết xong, các em lại có nhu cầugiải quyết các bài toán khác nữa Điều đó chính là động lực để tôi yêu nghềhơn, yêu học sinh hơn

Với sáng kiến kinh nghiệm “ XÂY DỰNG THUẬT TOÁN TỐI ƯU

CHO MỘT SỐ BÀI TOÁN THƯỜNG GẶP TRONG TIN HỌC 11 SỬ DỤNG NGÔN NGỮ LẬP TRÌNH C++ ” tôi muốn gửi tới các bạn đồng

nghiệp một chút kinh nghiệm của bản thân về việc hệ thống lại các bài tậpcho học sinh thực sự yêu thích lập trình

Trang 4

1.2 MỤC ĐÍCH NGHIÊN CỨU

- Giới thiệu một số bài toán thường gặp, đặc biệt phần này có cung cấpthêm một số hàm, thủ tục chưa được giới thiệu trong tài liệu sách giáo khoatin học 11 dịch C++ đã sửa, đồng thời định hướng cách xây dựng thuật toántối ưu để học sinh dễ dàng vận dụng

- Hệ thống các bài toán dưới dạng một số dạng bài tập thường gặp giúpcho giáo viên và học sinh phần nào nhận dạng và giải một số bài tập liênquan

- Nâng cao chất lượng dạy và học môn Tin học trong trường phổ thông,đặc biệt là dạy học lập trình ở Tin học lớp 11

- Góp phần đổi mới phương pháp dạy học trong trường phổ thông nóichung và môn Tin học nói riêng

- Góp phần khơi dậy lòng đam mê, yêu thích và hứng thú khi học mônTin học của học sinh Đặc biệt là định hướng nghề nghiệp cho đối tượng họcsinh có lòng đam mê hứng thú Tin học thực sự Giúp các em nhìn thấy và vậndụng được những kiến thức đã học ở các môn học vào tư duy giải quyết cácbài toán thực tế, gần gũi, thiết thực trong môi trường học tập của bản thân

1.3 ĐỐI TƯỢNG VÀ PHẠM VI NGHIÊN CỨU

- Một số bài toán cơ bản trong Tin học 11

- Lập trình các bài tập thực nghiệm, sử dụng ngôn ngữ lập trình C++ đểtiến hành

- Kỹ năng thực hành giải các bài tập, hệ thống kiến thức với các bài tập

về thuật toán tối ưu của học sinh

- Phạm vi thực nghiệm: Học sinh lớp 11C1, 11C2 trường Trung họcphổ thông Yên Định 2 năm học 2021-2022

1.4 PHƯƠNG PHÁP NGHIÊN CỨU

- Dựa trên những bài toán thực tiễn của cuộc sống được giải quyết bằngngôn ngữ lập trình C++ Nhất là các bài toán vận dụng lập trình với thuật toántối ưu

- Dựa trên cơ sở lý thuyết của Ngôn ngữ lập trình C++ Cách khai báo

và truy xuất đến kiểu dữ liệu chuẩn và hoạt động tuần tự từng bước của máytính khi thực hiện chương trình

- Thu thập dữ liệu thông qua việc hỏi học sinh về mức độ biết, hiểu vàvận dụng ngôn ngữ lập trình C++ vào giải các bài toán trong các môn họckhác

- Phân tích đánh giá mức độ học sinh hứng thú với môn học

- Tổng kết rút kinh nghiệm

Trang 5

2 PHẦN NỘI DUNG 2.1 CƠ SỞ LÝ LUẬN

Tạo hứng thú, khơi gợi niềm đam mê môn học cho người học luôn làmột vấn đề quan trọng trong hoạt động dạy - học Bởi vì, như chúng ta biết,dạy - học là một hoạt động phức tạp, trong đó chất lượng, hiệu quả cơ bảnphụ thuộc vào người học Và điều này lại phụ thuộc vào nhiều yếu tố, như:năng lực nhận thức, động cơ học tập, sự quyết tâm ; nó còn phụ thuộc vào:môi trường học tập, người tổ chức quá trình dạy học, sự hứng thú trong họctập

‘Các nhà nghiên cứu tâm lý học cho rằng, hứng thú là thái độ đặc biệtcủa cá nhân đối với đối tượng nào đó, nó có ý nghĩa đối với cuộc sống và cókhả năng mang lại khoái cảm cá nhân trong quá trình hoạt động Sự hứng thúbiểu hiện trước hết ở sự tập trung chú ý cao độ, sự say mê của chủ thể hoạtđộng Sự hứng thú gắn liền với tình cảm con người Trong bất cứ công việc

gì, nếu có hứng thú làm việc, con người sẽ có cảm giác dễ chịu với hoạtđộng, làm nẩy sinh khát vọng hành động một cách có sáng tạo Ngược lại, nếukhông có hứng thú, dù là hoạt động gì cũng sẽ không đem lại hiệu quả cao.Đối với các hoạt động nhận thức, sáng tạo, hoạt động học tập, khi không có

hứng thú, kết quả sẽ không là gì hết, thậm chí xuất hiện cảm xúc tiêu cực.’[3]

Việc học có tính chất đối phó, miễn cưỡng, người học may lắm chỉ tiếpthu được một lượng kiến thức rất ít, không sâu, không bản chất Vì thế dễquên

Khi có hứng thú, đam mê trong nghiên cứu, học tập thì thì việc lĩnh hộitri thức trở nên dễ dàng hơn; ngược lại, khi nắm bắt được vấn đề, tức là hiểuđược bài thì người học lại có thêm hứng thú đam mê Trên thực tế, nhữngngười không thích, không hứng thú, không đam mê học môn học nào đóthường là những người không học tốt môn học đó Chính vì vậy, việc tạohứng thú, khơi gợi niềm đam mê cho người học được xem là yêu cầu bắt buộcđối với bất cứ ai làm công tác giảng dạy, đối với bất cứ bộ môn khoa học nào

2.2 THỰC TRẠNG VẤN ĐỀ

Đặc điểm môn

Môn Tin học đến nay không còn là môn học mới mẻ đối với học sinhphổ thông, bởi học sinh đã được làm quen nó ngay ở các cấp học dưới Đây làmột thuận lợi cho học sinh, học sinh không phải học từ đầu để làm quen vớimôn học

Trong mục 2.1: Đoạn “các nhà nghiên cứu… tiêu cực” được trích dẫn trong TLTK số 3

Trang 6

Sự liên quan của môn Tin học với các môn học khác là nhiều, vì vậyhọc sinh sẽ phải vất vả để xem lại, tìm kiếm lại kiến thức ở các môn học khác.Đặc biệt nội dung lập trình trong môn học Tin học lại có liên quan rất nhiềuđến kiến thức các môn khoa học tự nhiên, liên quan nhiều đến tư duy Toánhọc Nếu học sinh yếu tư duy về Toán học thì sẽ rất là khó khăn khi lập trình.Nếu học sinh có tư duy Toán học nhưng không hứng thú với môn Tin học,học cho biết, học để đối phó, thì thường các em sẽ không nghiên cứu kĩ bàihọc dẫn đến sẽ gặp phải một số khó khăn trong lập trình Nếu học sinh yếu tưduy và không hứng thú với môn học thì sẽ rất khó cho các thầy cô Muốn giảiquyết được việc này thì giáo viên cần phải dẫn dắt học sinh tiếp cận với mônhọc một cách tự nhiên, hào hứng thông qua những dạng bài tập thực tiễn liênquan đến các vấn đề mà các em yêu thích.

Giáo viên

Nhiều giáo viên còn hạn chế về trình độ, khả năng cập nhật thông tin.Không chỉ vậy, một số giáo viên chưa hiểu rõ thuật toán để diễn đạt trongviệc dạy lập trình Ngôn ngữ lập trình C++ mặc dù đã ra đời rất sớm nhưngđược dạy và học trong nhà trường mới chỉ một vài năm gần đây, nhiều giáoviên với tư tưởng ngại thay đổi, ngại tìm hiểu dẫn đến không hiểu rõ cơ chếhoạt động của các câu lệnh Đôi khi giáo viên còn thờ ơ, luôn cảm thấy chánnản khi học sinh của mình không có hứng thú, đam mê học tập Chính điềunày đã làm cho giáo viên không chú trọng việc đổi mới phương pháp Dẫnđến học sinh mất đi khả năng tìm hiểu và tư duy giải quyết bài toán, hứng thútrong việc học lập trình Chưa kể, môn Tin học không thuộc nhóm các môn tổhợp thi tốt nghiệp Trung học phổ thông, nên ngoài bồi dưỡng cho học sinhtham gia đội tuyển học sinh giỏi thì không chú trọng bồi dưỡng cho các đốitượng học sinh khác Giáo viên cần phải biết nhóm đối tượng học sinh khá lànguồn nhân lực dồi dào cho ngành Công nghệ thông tin, là nhóm đối tượngcần được giáo viên truyền lửa, truyền đam mê nhiều nhất

Học sinh

Khi bước vào học phổ thông thì học sinh đã bắt đầu định hình học theokhối để thi đại học Thời gian học chủ yếu dành cho các môn học chính nhưToán, Lý, Hóa, Văn, Anh Tin học là một môn được xem là môn hỗ trợ nênthời gian để học chỉ là những tiết học ở trên lớp Đối với Tin học 10, 12 thìtính ứng dụng của môn học trong thực tế các em dễ dàng nhìn thấy và thựchiện được luôn Còn với Tin học 11 thuộc về lĩnh vực lập trình, khó có sảnphẩm để các em nhìn thấy Hơn thế việc tư duy thuật toán cũng là một nộidung khó đối với các em Điều này dẫn đến rất nhiều học sinh không thích vàhọc kém môn học này Từ thực tế trên tôi muốn minh chứng thật rõ nét chocác em thấy giải bài toán trên máy tính không hề khó, có chăng là sự hứngthú, tích cực chủ động của các em mà thôi Đặc biệt học sinh sẽ nhận ra việchọc Tin học lập trình không quá khó và yêu thích môn học

Trang 7

Xây dựng thuật toán tối ưu để lập trình các bài toán

Qua việc giảng dạy học sinh học lập trình lớp 11, tôi nhận thấy học sinhcòn nhiều bỡ ngỡ khi tiếp cận với lập trình và xây dựng thuật toán tối ưu chocác bài toán Thông thường các em thường dựa vào định nghĩa nhận biết bàitoán để xây dựng nên thuật toán giải quyết bài toán Với một số bài toán các

em có thể giải quyết tối ưu hơn, tuy nhiên các em sẽ gặp khó khăn:

+ Sử dụng các biến điều khiển.

+ Tác động đến biến điều khiển ngay trong vòng lặp

+ Sử dụng các kiểu dữ liệu khác ngoài các kiểu dữ liệu chuẩn

+ Sử dụng cả Hàm và Thủ tục để giải quyết các bài toán phức tạp hơn.+ Thông báo kết quả trong vòng lặp dẫn đến tình trạng lặp lại việcthông báo kết quả khi thực hiện chương trình

2.3 HƯỚNG DẪN HỌC SINH XÂY DỰNG THUẬT TOÁN TỐI ƯU CHO MỘT SỐ BÀI TOÁN CƠ BẢN

2.3.1 Định nghĩa về thuật toán tối ưu

Để xử lý các bài toán cơ bản, C++ đưa ra định nghĩa tương ứng cho cácbài toán đó Tuy nhiên, để giải quyết bài toán theo định nghĩa thì thuật toánthường không tối ưu Vậy có cách nào để có thể khắc phục được điều đó,nhiệm vụ của giáo viên phải giới thiệu thêm cho học sinh hiểu về độ phức tạpcủa thuật toán bigO

Để học sinh lập trình các bài toán với thuật toán tối ưu thì giáo viên

hướng dẫn các em tìm hiểu thêm nội dung liên quan như:

Độ phức tạp của thuật toán [3]

Thông thường khi giải quyết 1 bài toán, chúng ta có thể đưa ra các giảithuật khác nhau nhưng sẽ phải chọn một giải thuật tốt nhất Thông thường thì

ta sẽ căn cứ vào các tiêu chuẩn sau:

 Giải thuật đúng đắn

 Giải thuật đơn giản

 Giải thuật thực hiện nhanh

Để kiểm tra tính đúng đắn của 1 giải thuật, ta thường sẽ phải thử nó vớimột bộ dữ liệu nào đó rồi so sánh kết quả thu được với kết quả đã biết Tuynhiên điều này không chắc chắn vì có thể giải thuật này đúng với bộ dữ liệunày nhưng lại không đúng với bộ dữ liệu khác

Tính đúng đắn của 1 giải thuật cần được chứng minh bằng toán, tạmthời chúng ta không đề cập ở đây

Trong mục 2.3.1: Độ phức tạp của thuật toán được trích dẫn trong TLTK số 3

Trang 8

Đối với các chương trình chỉ dùng 1 vài lần thì yêu cầu giải thuật đơngiản sẽ được ưu tiên vì chúng ta cần 1 giải thuật dễ hiểu, dễ cài đặt, ở đâykhông đề cao vấn đề thời gian chạy vì chúng ta chỉ chạy 1 vài lần.

Khi 1 chương trình sử dụng nhiều lần, yêu cầu tiết kiệm thời gian sẽđược đặc biệt ưu tiên Tuy nhiên, thời gian thực hiện chương trình lại phụthuộc vào rất nhiều yếu tố như: cấu hình máy tính, ngôn ngữ sử dụng, trìnhbiên dịch, dữ liệu đầu vào, … Do đó ta khi so sánh 2 giải thuật đã đượcimplement, chưa chắc chương trình chạy nhanh hơn đã có giải thuật tốt hơn

“Độ phức tạp của thuật toán” sinh ra để giải quyết vấn đề này

Cách để tính độ phức tạp của thuật toán

Độ phức tạp của một thuật toán là 1 hàm phụ thuộc vào độ lớn của dữliệu đầu vào Tìm xem 1 đối tượng có trong danh sách N phần tử hay không?,sắp xếp tăng dần dãy số gồm N số, … N ở đây chính là độ lớn của dữ liệu đầuvào

Để ước lượng độ phức tạp của một thuật toán, người ta thường dùngkhái niệm bậc O-lớn và bậc Theta (Θ) Ở đây giáo viên chỉ xét và giới thiệuΘ) Ở đây giáo viên chỉ xét và giới thiệu) Ở đây giáo viên chỉ xét và giới thiệucho học sinh Big O

Ta dùng một đại lượng tổng quát là tài nguyên cần dùng R(Θ) Ở đây giáo viên chỉ xét và giới thiệun) Đó cóthể là số lượng phép tính (Θ) Ở đây giáo viên chỉ xét và giới thiệucó thể tính cả số lần truy nhập bộ nhớ, hoặc ghi vào

bộ nhớ); nhưng cũng có thể là thời gian thực hiện chương trình (Θ) Ở đây giáo viên chỉ xét và giới thiệuđộ phức tạp

về thời gian) hoặc dung lượng bộ nhớ cần phải cấp để chạy chương trình (Θ) Ở đây giáo viên chỉ xét và giới thiệuđộphức tạp về không gian)

Định nghĩa:

Giả sử f(Θ) Ở đây giáo viên chỉ xét và giới thiệun) và g(Θ) Ở đây giáo viên chỉ xét và giới thiệun) là các hàm thực không âm của đối số nguyên không

âm n Ta nói “g(Θ) Ở đây giáo viên chỉ xét và giới thiệun) là O của f(Θ) Ở đây giáo viên chỉ xét và giới thiệun)” và viết là: g(Θ) Ở đây giáo viên chỉ xét và giới thiệun) = O(Θ) Ở đây giáo viên chỉ xét và giới thiệuf(Θ) Ở đây giáo viên chỉ xét và giới thiệun)) nếu tồn tại cáchằng số dương C và n0 sao cho g(Θ) Ở đây giáo viên chỉ xét và giới thiệun) <= C * f(Θ) Ở đây giáo viên chỉ xét và giới thiệun) với mọi n >= n0

Cách tính:

Độ phức tạp tính toán của giải thuật: O(Θ) Ở đây giáo viên chỉ xét và giới thiệuf(Θ) Ở đây giáo viên chỉ xét và giới thiệun))

• Việc xác định độ phức tạp tính toán của giải thuật trong thực tế có thểtính bằng một số quy tắc đơn giản sau:

– Quy tắc bỏ hằng số:

T(Θ) Ở đây giáo viên chỉ xét và giới thiệun) = O(Θ) Ở đây giáo viên chỉ xét và giới thiệuc.f(Θ) Ở đây giáo viên chỉ xét và giới thiệun)) = O(Θ) Ở đây giáo viên chỉ xét và giới thiệuf(Θ) Ở đây giáo viên chỉ xét và giới thiệun)) với c là một hằng số dương

– Quy tắc lấy max:

T(Θ) Ở đây giáo viên chỉ xét và giới thiệun) = O(Θ) Ở đây giáo viên chỉ xét và giới thiệuf(Θ) Ở đây giáo viên chỉ xét và giới thiệun)+ g(Θ) Ở đây giáo viên chỉ xét và giới thiệun)) = O(Θ) Ở đây giáo viên chỉ xét và giới thiệumax(Θ) Ở đây giáo viên chỉ xét và giới thiệuf(Θ) Ở đây giáo viên chỉ xét và giới thiệun), g(Θ) Ở đây giáo viên chỉ xét và giới thiệun)))

Trang 9

– Quy tắc cộng:

T1(Θ) Ở đây giáo viên chỉ xét và giới thiệun) = O(Θ) Ở đây giáo viên chỉ xét và giới thiệuf(Θ) Ở đây giáo viên chỉ xét và giới thiệun)) T2(Θ) Ở đây giáo viên chỉ xét và giới thiệun) = O(Θ) Ở đây giáo viên chỉ xét và giới thiệug(Θ) Ở đây giáo viên chỉ xét và giới thiệun))

T1(Θ) Ở đây giáo viên chỉ xét và giới thiệun) + T2(Θ) Ở đây giáo viên chỉ xét và giới thiệun) = O(Θ) Ở đây giáo viên chỉ xét và giới thiệuf(Θ) Ở đây giáo viên chỉ xét và giới thiệun) + g(Θ) Ở đây giáo viên chỉ xét và giới thiệun))

– Quy tắc nhân:

Đoạn chương trình có thời gian thực hiện T(Θ) Ở đây giáo viên chỉ xét và giới thiệun)=O(Θ) Ở đây giáo viên chỉ xét và giới thiệuf(Θ) Ở đây giáo viên chỉ xét và giới thiệun))

Nếu thực hiện k(Θ) Ở đây giáo viên chỉ xét và giới thiệun) lần đoạn chương trình với k(Θ) Ở đây giáo viên chỉ xét và giới thiệun) = O(Θ) Ở đây giáo viên chỉ xét và giới thiệug(Θ) Ở đây giáo viên chỉ xét và giới thiệun)) thì độ phứctạp sẽ là O(Θ) Ở đây giáo viên chỉ xét và giới thiệug(Θ) Ở đây giáo viên chỉ xét và giới thiệun).f(Θ) Ở đây giáo viên chỉ xét và giới thiệun))

Ví dụ:

Ví dụ 1:

s=n*(Θ) Ở đây giáo viên chỉ xét và giới thiệun-1) /2;

Trong ví dụ trên, độ phức tạp của thuật toán là O(Θ) Ở đây giáo viên chỉ xét và giới thiệu1)

Ví dụ 2:

s = 0; // O(Θ) Ở đây giáo viên chỉ xét và giới thiệu1)

for (Θ) Ở đây giáo viên chỉ xét và giới thiệuint i=0; i<=N; i++)

{ p = 1; // O(Θ) Ở đây giáo viên chỉ xét và giới thiệu1)

for (Θ) Ở đây giáo viên chỉ xét và giới thiệuint j=1; j<= i; j++)

p= p * x / j; // O(Θ) Ở đây giáo viên chỉ xét và giới thiệu1)

s = s+p; // O(Θ) Ở đây giáo viên chỉ xét và giới thiệu1)

}

Số lần thực hiện phép toán p = p * x / j là n(Θ) Ở đây giáo viên chỉ xét và giới thiệun-1) / 2

Độ phức tạp của đoạn code này là O(Θ) Ở đây giáo viên chỉ xét và giới thiệu1) + O(Θ) Ở đây giáo viên chỉ xét và giới thiệu1) + O(Θ) Ở đây giáo viên chỉ xét và giới thiệun(Θ) Ở đây giáo viên chỉ xét và giới thiệun-1)/2) + O(Θ) Ở đây giáo viên chỉ xét và giới thiệu1) + O(Θ) Ở đây giáo viên chỉ xét và giới thiệu1)

= O(Θ) Ở đây giáo viên chỉ xét và giới thiệun2)

Một bài toán có thể có nhiều thuật toán, nhưng thuật toán nào có độ phức tạp nhỏ nhất thì thuật toán đó được xem là tối ưu

2.3.2 Bài toán nhặt sỏi:

Đây là dạng bài tập khá đơn giản Thông thường, để giải quyết các bài

toán này học sinh sẽ vận dụng một số hàm như s.erase(Θ) Ở đây giáo viên chỉ xét và giới thiệuvt,n), s1.insert(vt,s2),

s1.assign(s2,vt,n), strstr(s1,s2), s.size()… cùng với vòng lặp Tuy nhiên, với

cách giải quyết thông thường bài toán trở nên phức tạp, máy mất nhiều thờigian để thực hiện và không giải quyết được triệt để Giáo viên có thể giớithiệu cho các em phương pháp nhặt sỏi khá đơn giản dễ hiểu và máy thực

Trang 10

hiện trong thời gian ngắn và tối ưu Đó là : nếu phần tử của xâu thỏa mãn điềukiện nào đó (Θ) Ở đây giáo viên chỉ xét và giới thiệukhông thỏa mãn điều kiện nào đó) thì nhặt bỏ vào một xâu khác

đã khởi tạo từ trước Cụ thể:

Bài tập vận dụng 1: Nhập vào một xâu bất kì Hãy xóa bỏ các dấu cách

string s; int i,n,vt;

int main(Θ) Ở đây giáo viên chỉ xét và giới thiệu)

{cout<<”nhap xau: ”;getline(Θ) Ở đây giáo viên chỉ xét và giới thiệucin,s);

i=0; n=s.size(Θ) Ở đây giáo viên chỉ xét và giới thiệu);

while (Θ) Ở đây giáo viên chỉ xét và giới thiệui<=n)

{if (Θ) Ở đây giáo viên chỉ xét và giới thiệus[i]=” ” ) { s.erase(Θ) Ở đây giáo viên chỉ xét và giới thiệui,1);n:=n-1; } i++;}

cout<<”xau ket qua: ”<<s;

return 0;}

Thoáng nhìn có vẻ bài toán được giải quyết, hợp lí Tuy nhiên khi chạychương trình học sinh mới ngỡ ngàng khi kết quả không triệt để

Học sinh khác có thể viết một chương trình tốt hơn cũng sử dụng vòng lặp

while , hàm strstr(s1,s2) và hàm s.erase(vt,1) để tìm vị trí , xóa các kí tự

trống trong xâu như:

Chư duy thông thường của học sinh:ơng trình:ng trình:

#include<iostream>

#include<string>

using namespace std;

string s; int i,n,vt;

int main(Θ) Ở đây giáo viên chỉ xét và giới thiệu)

{cout<<”nhap xau: ”;getline(Θ) Ở đây giáo viên chỉ xét và giới thiệucin,s);

while (Θ) Ở đây giáo viên chỉ xét và giới thiệustrstr(Θ) Ở đây giáo viên chỉ xét và giới thiệus,” ”)!=0) s.erase(Θ) Ở đây giáo viên chỉ xét và giới thiệustrstr(Θ) Ở đây giáo viên chỉ xét và giới thiệus,” ”),1);

cout<<”xau ket qua: ”<<s;

return 0;}

Trang 11

Kết quả thu được sau khi chạy chương trình triệt để Tuy nhiên, hàmstrstr(Θ) Ở đây giáo viên chỉ xét và giới thiệust1,st2) được sử dụng, độ phức tạp tương ứng là O(Θ) Ở đây giáo viên chỉ xét và giới thiệun) Khi đó chươngtrình trên thực hiện với độ phức tạp O(Θ) Ở đây giáo viên chỉ xét và giới thiệun2)

Với cách viết chương trình trên học sinh sẽ nhận thấy chương trình khángắn gọn dễ hiểu, tuy nhiên giáo viên cần giải thích cho học sinh thấy máytính sẽ phải làm việc rất vất vả, vì phải vừa thực hiện vòng lặp vừa phải xácđịnh vị trí của dấu cách trống để so sánh với 0 Trong thủ tục xóa, hàm xácđịnh vị trí dấu cách trống phải gọi thêm lần nữa Câu hỏi đặt ra là: có cáchnào giải quyết bài toán này để viết chương trình vừa ngắn gọn dễ hiểu màmáy tính cũng không mất thời gian để thực hiện lệnh?

Khi ó giáo viên hđó giáo viên hướng dẫn học sinh giải quyết bài toán này bằng ư duy thông thường của học sinh:ớng dẫn học sinh giải quyết bài toán này bằngng d n h c sinh gi i quy t b i toán n y b ngẫn học sinh giải quyết bài toán này bằng ọc sinh: ải quyết theo tư duy thông thường của học sinh: ết theo tư duy thông thường của học sinh: ài tập giải quyết theo tư duy thông thường của học sinh: ài tập giải quyết theo tư duy thông thường của học sinh: ằng

phư duy thông thường của học sinh:ơng trình:ng pháp nh t s i: ặt sỏi: Độ phức tạp O(n) ỏi: Độ phức tạp O(n) Độ phức tạp O(n) ph c t p O(n)ức tạp O(n) ạp O(n)

#include<iostream>

#include<string>

using namespace std;

string s,p; int i,n,vt;

int main(Θ) Ở đây giáo viên chỉ xét và giới thiệu)

{cout<<”nhap xau: ”;getline(Θ) Ở đây giáo viên chỉ xét và giới thiệucin,s);

n=s.size(Θ) Ở đây giáo viên chỉ xét và giới thiệu);

p=””;

for(Θ) Ở đây giáo viên chỉ xét và giới thiệui=0;i<n;i++)

if (Θ) Ở đây giáo viên chỉ xét và giới thiệus[i]!=” ”) p=p+s[i];

cout<<”xau ket qua: ”<<p;

return 0;

}

Khi chạy kết quả, các em sẽ khẳng định được hiệu quả tối ưu đối vớinhững bài toán có thể sử dụng phương pháp nhặt sỏi, từ đó các em tin tưởng

và biết vận dụng giải quyết các bài toán tương tự khác

Bài tập vận dụng 2: Nhập vào một xâu bất kì Hãy đưa ra màn hình các

kí tự số trong xâu.[1]

Bài toán này các em học sinh có thể xóa hết tất cả các kí tự chữ cáitrong xâu, còn lại trong xâu là các kí tự số Tuy nhiên khi biết phương phápnhặt sỏi rồi thì học sinh sẽ tin tưởng phương pháp này và vận dụng ngay

Trong mục 2.3.2: Bài tập vận dụng 1, 2 được trích dẫn trong TLTK số 1

Ngày đăng: 05/06/2022, 10:23

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