NỘI DUNG
Cơ sở lí luận của đề tài
Nghị quyết hội nghị Trung ương VIII khóa XI nhấn mạnh tầm quan trọng của giáo dục phổ thông trong việc phát triển trí tuệ, thể chất và phẩm chất công dân, đồng thời khuyến khích phát hiện và bồi dưỡng năng khiếu cũng như định hướng nghề nghiệp cho học sinh Mục tiêu là nâng cao chất lượng giáo dục toàn diện, chú trọng đến giáo dục lý tưởng đạo đức, lối sống, và các kỹ năng như ngoại ngữ, tin học, cùng khả năng thực hành và sáng tạo Hiện nay, toàn ngành đang nỗ lực xây dựng chương trình sách giáo khoa mới và đổi mới phương pháp dạy học để hình thành và phát triển năng lực cho học sinh.
Môn Tin học trong chương trình giáo dục phổ thông nhằm phát triển năng lực Tin học cho học sinh, đồng thời đổi mới phương pháp dạy học để đáp ứng mục tiêu giáo dục trong giai đoạn mới Với tính chất đặc thù và nhiều kiến thức khó, môn học này đặc biệt chú trọng đến phần lập trình ở lớp.
11 Đây cũng là phần kiến thức đề thi học sinh giỏi tỉnh môn Tin học Trong một số năm gần đây do sự phát triển nhanh chóng của khoa học kỹ thuật, tốc độ xử lí của máy tính ngày càng cao Các đề thi trong các cuộc thi lập trình cũng ngày càng đòi hỏi cao hơn về thời gian thực hiện, về độ lớn dữ liệu…Nên gây rất nhiều khó khăn trong việc ôn luyện cho thầy và trò Một trong những vấn đề luôn đặt ra là làm thế nào để lựa chọn được thuật toán tối ưu đảm bảo đáp ứng toàn bộ yêu cầu dữ liệu vào của bài toán Do đó đòi hỏi giáo viên cần có giải pháp để giúp học sinh giải quyết vấn đề này nhằm nâng cao chất lượng công tác bồi dưỡng học sinh giỏi bộ môn Tin học hiện nay.
Thực trạng của vấn đề trước khi áp dụng SKKN
Với sự tiến bộ nhanh chóng của công nghệ thông tin, máy tính hiện nay sở hữu tốc độ xử lý cao, đáp ứng hiệu quả yêu cầu giải quyết các bài toán với dữ liệu lớn trong thời gian ngắn.
- Học sinh và giáo viên có thể dễ dàng tìm hiểu nguồn tài liệu để học tập tham khảo
Chương trình Tin học phổ thông hiện nay vẫn còn nhiều hạn chế, không đủ để đáp ứng yêu cầu giải quyết các bài toán trong kỳ thi học sinh giỏi Tỉnh, đặc biệt là khi phải xử lý dữ liệu lớn và thời gian thực hiện ngắn.
- Các tài liệu tổng hợp các cách để giải quyết các bài toán yêu cầu cao như vậy chưa có nhiều để học sinh tham khảo, ôn luyện
2.2 Thực trạng trước khi nghiên cứu
Với sự phát triển nhanh chóng của công nghệ máy tính, đề thi học sinh giỏi Tin học ngày càng yêu cầu cao hơn về thời gian thực hiện và kích thước dữ liệu đầu vào Nhiều giáo viên gặp khó khăn trong việc hướng dẫn học sinh giải quyết bài toán một cách hiệu quả Trong những năm qua, tôi đã chú trọng cải tiến chương trình tối ưu để bồi dưỡng học sinh thi học sinh giỏi, nhưng hiệu quả vẫn chưa đạt được như mong muốn.
Nguyên nhân chính của thực trạng này là giáo viên chưa áp dụng phương pháp giảng dạy phù hợp, chỉ tập trung vào việc giúp học sinh cải tiến và làm mịn thuật toán cho từng bài cụ thể mà không phân loại thành các dạng bài Điều này dẫn đến việc học sinh không được định hướng để đánh giá và cải thiện thuật toán một cách hiệu quả, cũng như không hiểu rõ mức độ phức tạp của thuật toán cần thiết cho từng loại dữ liệu Kết quả là, học sinh gặp khó khăn trong việc áp dụng kiến thức vào các bài toán tương tự và không linh hoạt khi đối mặt với các bài toán mới, dẫn đến việc họ chỉ đạt điểm số thấp và thường chỉ nhận giải khuyến khích.
Tôi luôn duy trì việc hướng dẫn và uốn nắn học sinh trong cách giải bài, rèn luyện kỹ năng tinh chỉnh thuật toán và nhận biết độ lớn dữ liệu để lựa chọn thuật toán phù hợp Trong quá trình giảng dạy, tôi khuyến khích học sinh kiểm chứng qua phần mềm Themis, giúp dễ dàng so sánh và ghi nhớ, từ đó nâng cao hiệu quả học tập.
Các giải pháp giải quyết vấn đề
Nhiều bài toán có vẻ đơn giản và dễ giải, nhưng khi xử lý với dữ liệu lớn, chúng có thể không đáp ứng được thời gian yêu cầu hoặc không thực hiện được tất cả các bài kiểm tra cần thiết Do đó, việc tìm kiếm thuật toán tối ưu nhất trở nên cần thiết.
Tối ưu hoá là một yếu tố quan trọng trong giải quyết các bài toán tin học, đòi hỏi tư duy thuật toán cao và khả năng sử dụng cấu trúc dữ liệu thành thạo Việc tìm kiếm thuật toán tối ưu không hề đơn giản, thường được thực hiện từ hai góc độ: tối ưu không gian lưu trữ và tối ưu thời gian xử lý Tuy nhiên, việc đạt được cả hai mục tiêu này đồng thời không phải lúc nào cũng khả thi, vì tối ưu thời gian có thể dẫn đến tăng không gian lưu trữ và ngược lại Các bài toán trong tin học rất đa dạng, khiến nhiều giáo viên gặp khó khăn trong việc hướng dẫn học sinh thiết kế và lựa chọn thuật toán phù hợp để giảm độ phức tạp, đồng thời đáp ứng yêu cầu đề bài.
Để đánh giá xem chương trình có đáp ứng được yêu cầu của đề bài hay không, chúng ta cần ước lượng số lượng test mà nó có thể thực hiện Việc này chỉ có thể thực hiện khi ôn luyện, còn trong kỳ thi, các em không thể tự đánh giá kết quả bài làm Một phương pháp để xác định khả năng của chương trình là đánh giá độ phức tạp của thuật toán Do đó, để tối ưu hóa thuật toán, trước tiên chúng ta cần hiểu rõ về độ phức tạp và cách ước lượng thuật toán so với dữ liệu đầu vào yêu cầu.
3.1.1 Độ phức tạp thuật toán
3.1.1.1 Tính hiệu quả của thuật toán
Khi giải bài toán, việc chọn lựa thuật toán "tốt" nhất là rất quan trọng Để đánh giá sự ưu việt của một thuật toán so với thuật toán khác, chúng ta thường dựa trên hai tiêu chí chính.
1 Thuật toán đơn giản, dễ hiểu, dễ cài đặt (dễ viết chương trình)
2 Thuật toán hiệu quả: Chúng ta thường đặc biệt quan tâm đến thời gian thực hiện của thuật toán (gọi là độ phức tạp tính toán), bên cạnh đó chúng ta cũng quan tâm tới dung lượng không gian nhớ cần thiết để lưu giữ các dữ liệu vào, ra và các kết quả trung gian trong quá trình tính toán
Khi phát triển phần mềm, tiêu chuẩn (1) quan trọng cho các chương trình sử dụng ít lần, nhưng tiêu chuẩn (2) lại cần thiết hơn cho các ứng dụng nhiều người dùng Trong những trường hợp này, mặc dù thuật toán có thể phức tạp, nhưng việc ưu tiên hiệu suất và tốc độ chạy của chương trình là điều cần thiết để đảm bảo tính hiệu quả.
3.1.1.2 Tại sao cần thuật toán có tính hiệu quả?
Kỹ thuật máy tính đang phát triển nhanh chóng, với khả năng tính toán của máy tính lớn đạt hàng nghìn tỉ phép tính mỗi giây Điều này đặt ra câu hỏi về sự cần thiết của việc tìm kiếm các thuật toán hiệu quả Một ví dụ điển hình là bài toán kiểm tra tính nguyên tố của một số nguyên dương n (n ≥ 2) thông qua hàm bool is_prime(int n).
{ for(int k=2;k 3) không chia hết cho 2 nhưng chia hết cho 3, cần thực hiện hai lần thử (chia 2 và chia 3) để xác định n không nguyên tố Trong trường hợp n là một số nguyên tố, thuật toán sẽ phải thực hiện nhiều lần thử hơn.
Trong tài liệu này, chúng ta hiểu hàm số T(n) là thời gian nhiều nhất cần thiết để thực hiện thuật toán với mọi bộ dữ liệu đầu vào cỡ n
Kí hiệu ô lớn được sử dụng để mô tả độ lớn của hàm trong toán học Với n là số nguyên dương và T(n), f(n) là hai hàm thực không âm, ta có T(n) = O(f(n)) nếu tồn tại các hằng số dương c và n₀, sao cho T(n) ≤ c × f(n) cho mọi n ≥ n₀.
Nếu một thuật toán có thời gian thực hiện T(n)= O(f(n)) chúng ta nói rằng thuật toán có thời gian thực hiện cấp f(n)
Ví dụ: Giả sử T(n) = n 2 + 2n, ta có n 2 + 2n ≤ 3n 2 với mọi n ≥ 1
Vậy T(n) = O(n 2 ) trong trường hợp này ta nói thuật toán có thời gian thực hiện cấp n 2
3.1.1.4 Các quy tắc đánh giá thời gian thực hiện thuật toán Để đánh giá thời gian thực hiện thuật toán được trình bày bằng ngôn ngữ C++, ta cần biết cách đánh giá thời gian thực hiện các câu lệnh của C++
Trước tiên, chúng ta hãy xem xét các câu lệnh chính trong C++ Các câu lệnh trong C++ được định nghĩa như sau:
1 Các phép gán, đọc, viết là các câu lệnh (được gọi là lệnh đơn)
2 Nếu S1, S2, , Sm là câu lệnh thì
{ S1; S2; …; Sm; } là câu lệnh (được gọi là lệnh hợp thành hay khối lệnh)
3 Nếu S1 và S2 là các câu lệnh và E là biểu thức lôgic thì
If (E) S1; else S2; là câu lệnh (được gọi là lệnh rẽ nhánh hay lệnh If)
4 Nếu S là câu lệnh và E là biểu thức lôgic thì
While (E) S; là câu lệnh (được gọi là lệnh lặp điều kiện trước hay lệnh While)
5 Nếu S1, S2,…,Sm là các câu lệnh và E là biểu thức lôgic thì
While (E); là câu lệnh (được gọi là lệnh lặp điều kiện sau hay lệnh Do While)
6 Nếu S là lệnh, E1 và E2 là các biểu thức cùng một kiểu thứ tự đếm được Thì For (i i