Giáo án Tin học 11 · Chung, Khoa học máy tính và Tin học ứng dụng
Tin họcLớp 11Phần 6. KHMT · Chủ đề 6. Kĩ thuật lập trình · Chọn định hướng, không bắt buộc THUD

Giáo án Bài 24 · KHMT. Đánh giá độ phức tạp thời gian thuật toán

Kế hoạch bài dạy theo mẫu Công văn 5512/BGDĐT-GDTrH · 2 tiết (90 phút)

I. Mục tiêu

1. Kiến thức

  • Nêu được độ phức tạp thời gian của thuật toán là mô tả mức tăng trưởng số thao tác theo kích thước đầu vào nn, không phải thời gian tính bằng giây.
  • Giải thích được ý nghĩa của các bậc O(n)O(n), O(n2)O(n^2), O(log⁡n)O(\log n) và nhận biết cấu trúc vòng lặp tương ứng: một vòng lặp, hai vòng lặp lồng nhau, chia đôi dãy đã sắp.
  • Phân biệt được trường hợp tốt nhất và trường hợp xấu nhất của một thuật toán tìm kiếm.
  • Giải thích được vì sao khi phân loại bậc có thể bỏ hằng số và hệ số (ví dụ T(n)=3n+2T(n)=3n+2 thuộc O(n)O(n)), nhưng khi tính số thao tác chính xác phải giữ chúng.
  • Vận dụng được quy trình bốn bước (chọn kích thước nn, đếm thao tác chính, viết hàm đếm, xác định bậc và trường hợp) để đánh giá một chương trình Python đơn giản.

2. Năng lực

a) Năng lực chung

  • Tự chủ và tự học: HS tự chạy chương trình mẫu trên máy, đối chiếu kết quả với dự đoán và tự kiểm tra đáp án trong phiếu học tập.
  • Giao tiếp và hợp tác: HS làm việc theo cặp đôi và nhóm 4, trình bày lập luận đếm thao tác, phản biện cách đếm của bạn bằng ngôn ngữ toán học và ngôn ngữ lập trình.
  • Giải quyết vấn đề và sáng tạo: HS đề xuất cách đếm thao tác cho những thuật toán mới, đánh giá thuật toán nào phù hợp hơn khi nn rất lớn.

b) Năng lực đặc thù

  • Sử dụng và quản lí các phương tiện công nghệ thông tin và truyền thông: HS sử dụng môi trường Python (Thonny hoặc IDE tương đương) để chạy và sửa chương trình đếm thao tác.
  • Giải quyết vấn đề với sự hỗ trợ của công nghệ thông tin và truyền thông: HS dùng chương trình đếm để kiểm chứng công thức n2n^2, nn, log⁡2n\log_2 n với nhiều giá trị nn khác nhau.
  • Ứng dụng công nghệ thông tin và truyền thông trong học và tự học: HS tra cứu bài tập tương tác trên trang NeoEdu để tự luyện và tự kiểm tra sau giờ học.
  • Hợp tác trong môi trường số: HS chia sẻ mã nguồn và kết quả chạy trong nhóm qua tệp chung hoặc nhóm trò chuyện của lớp, không sao chép mã của người khác mà không ghi nguồn.

3. Phẩm chất

  • Chăm chỉ: HS hoàn thành đủ các bài đếm thao tác, tự kiểm tra lại từng bước đếm khi kết quả chưa khớp.
  • Trung thực: HS ghi đúng kết quả chạy thực tế của chương trình, không ghi kết quả dự đoán như kết quả đã kiểm chứng.
  • Trách nhiệm: HS giữ gìn thiết bị phòng máy, lưu bài làm đúng thư mục và nộp bài tập về nhà đúng hạn.

II. Thiết bị dạy học và học liệu

1. Giáo viên

  • Máy tính và máy chiếu để trình chiếu hai đoạn chương trình mẫu, các phiếu học tập và đáp án.
  • Phần mềm Python (Thonny hoặc IDE tương đương) đã cài sẵn trên máy GV.
  • Bảng phụ hoặc khổ giấy A0 để ghi kết quả đếm của các nhóm.
  • Học liệu số NeoEdu: trang bài học có bài giảng, ví dụ và bài tập tương tác (neoedu.vn/learn/11/informatics/bai-24-khmt-danh-gia-do-phuc-tap-thoi-gian-thuat-toan), dùng ở hoạt động luyện tập và giao về nhà.

2. Học sinh

  • Máy tính hoặc thiết bị có cài Python (Thonny hoặc IDE tương đương) để chạy chương trình mẫu.
  • Sách Tin học 11, vở ghi, bút màu để ghi kết quả đếm của nhóm.
  • Phiếu học tập số 1 và số 2 (GV phát in hoặc chiếu lên màn hình).

III. Tiến trình dạy học

Hoạt động 1: Mở đầu · 10 phút

Máy nào nhanh hơn?

a) Mục tiêu

HS nhận ra cần đo tốc độ thuật toán bằng số thao tác theo kích thước đầu vào, không chỉ bằng số dòng mã hay thời gian chạy trên một máy cụ thể.

b) Nội dung

GV trình chiếu hai đoạn mã: đoạn A có một vòng lặp chạy nn lần; đoạn B có hai vòng lặp lồng nhau, mỗi vòng chạy nn lần. GV hỏi: Nếu n=5n=5 rồi n=50n=50, đoạn nào tăng số thao tác nhanh hơn? Dự đoán số thao tác của mỗi đoạn khi n=5n=5 và n=50n=50 rồi ghi vào vở. Sau đó HS chạy thử đoạn B với n=5n=5 để kiểm tra dự đoán.

c) Sản phẩm

Bảng dự đoán của HS: đoạn A thực hiện 55 thao tác khi n=5n=5 và 5050 thao tác khi n=50n=50; đoạn B thực hiện 2525 thao tác khi n=5n=5 và 25002500 thao tác khi n=50n=50. Kết luận ban đầu: số thao tác của đoạn B tăng nhanh hơn nhiều khi nn lớn, nên cần đo theo kích thước đầu vào thay vì đo theo giây.

d) Tổ chức thực hiện

  1. Giáo viên

    Bước 1: Chuyển giao nhiệm vụ

    GV chiếu hai đoạn mã và nêu câu hỏi: đoạn nào sẽ có số thao tác tăng nhanh hơn khi nn tăng từ 55 lên 5050? GV yêu cầu HS ghi dự đoán ra vở trong 2 phút.

    Học sinh

    HS đọc hai đoạn mã, ghi dự đoán. Dự kiến HS trả lời: Đoạn B tăng nhanh hơn vì có hai vòng lặp lồng nhau.

  2. Giáo viên

    Bước 2: Thực hiện nhiệm vụ

    GV hướng dẫn HS mở Thonny, chạy đoạn B với n=5n=5 và ghi kết quả in ra. GV đi quanh lớp kiểm tra các máy đã chạy đúng.

    Học sinh

    HS nhập đoạn mã, chạy với n=5n=5, đọc kết quả là 2525 và so sánh với dự đoán của mình.

  3. Giáo viên

    Bước 3: Báo cáo, thảo luận

    GV mời 2 đến 3 HS nêu dự đoán và kết quả chạy. GV đặt câu hỏi: Nếu chạy trên máy cũ và máy mới, số thao tác có thay đổi không?

    Học sinh

    HS trả lời: Số thao tác không đổi, chỉ thời gian tính bằng giây mới thay đổi theo máy.

  4. Giáo viên

    Bước 4: Kết luận, nhận định

    GV chốt: để so sánh thuật toán, ta đếm số thao tác theo kích thước đầu vào nn. Đoạn B có số thao tác tăng theo n2n^2, đoạn A tăng theo nn. Từ đây bài học đi vào các khái niệm chính.

    Học sinh

    HS ghi tựa đề bài 24 và câu chốt vào vở.

Hoạt động 2.1: Hình thành kiến thức mới · 20 phút

Đếm thao tác và bậc tăng trưởng

a) Mục tiêu

HS giải thích được ý nghĩa của bậc O(n)O(n) và O(n2)O(n^2), nhận biết cấu trúc một vòng và hai vòng lồng nhau, và đếm được số thao tác chính của chương trình Python.

b) Nội dung

HS làm theo nhóm 4 với Phiếu học tập số 1. HS chạy chương trình mẫu (một vòng với n=7n=7; hai vòng lồng nhau với n=4n=4; hai vòng lồng nhau với n=5n=5 và thay đổi nn để quan sát). Nhóm ghi kết quả đếm, trả lời câu hỏi về mối liên hệ giữa cấu trúc vòng lặp và bậc tăng trưởng. Sau khi nhóm hoàn thành, GV dùng chương trình mẫu để kiểm chứng.

c) Sản phẩm

Kết quả trong Phiếu học tập số 1: chương trình một vòng với n=7n=7 in ra 77; hai vòng lồng nhau n×nn\times n với n=4n=4 in ra 1616 và với n=5n=5 in ra 2525. Kết luận HS rút ra: một vòng lặp chạy nn lần cho bậc O(n)O(n); hai vòng lồng nhau mỗi vòng nn lần cho bậc O(n2)O(n^2); khi nn tăng gấp đôi, số thao tác của hai vòng lồng nhau tăng gấp bốn.

d) Tổ chức thực hiện

  1. Giáo viên

    Bước 1: Chuyển giao nhiệm vụ

    GV phát Phiếu học tập số 1, chia nhóm 4 HS, nêu nhiệm vụ: chạy các chương trình, đếm thao tác, điền kết quả và trả lời câu hỏi. GV nhấn mạnh: đếm thao tác là đếm số lần lệnh cộng dd được thực hiện.

    Học sinh

    Các nhóm nhận phiếu, phân công người gõ mã, người ghi kết quả, người kiểm tra lại bằng tính nhẩm.

  2. Giáo viên

    Bước 2: Thực hiện nhiệm vụ

    GV quan sát các nhóm, gợi ý khi HS đếm sai: Hãy đếm xem thân vòng lặp trong chạy bao nhiêu lần cho mỗi lượt vòng lặp ngoài?

    Học sinh

    HS chạy chương trình, ghi kết quả và trả lời các câu hỏi trong phiếu. Dự kiến HS trả lời: Vòng lồng nhau có nn lượt ngoài, mỗi lượt nn lượt trong nên tổng là n×nn\times n.

  3. Giáo viên

    Bước 3: Báo cáo, thảo luận

    GV mời đại diện 2 nhóm trình bày kết quả và cách đếm. GV hỏi thêm: Nếu n=100n=100 thì số thao tác của vòng đơn và vòng lồng là bao nhiêu?

    Học sinh

    HS trả lời: Vòng đơn có 100100 thao tác; vòng lồng có 10 00010\,000 thao tác. Các nhóm khác nhận xét và bổ sung.

  4. Giáo viên

    Bước 4: Kết luận, nhận định

    GV chốt: một vòng lặp chạy nn lần thì thuộc O(n)O(n); hai vòng lồng nhau n×nn\times n thì thuộc O(n2)O(n^2). Khi phân loại bậc, ta bỏ hằng số và hệ số; khi đếm chính xác, ta giữ lại chúng.

    Học sinh

    HS ghi kết luận vào vở và đối chiếu với kết quả của nhóm mình.

Hoạt động 2.2: Hình thành kiến thức mới · 20 phút

Trường hợp tốt, xấu và bậc logarit

a) Mục tiêu

HS phân biệt được trường hợp tốt nhất và trường hợp xấu nhất, giải thích được vì sao bỏ hằng số khi phân loại bậc, và nhận biết thuật toán chia đôi có bậc O(log⁡n)O(\log n).

b) Nội dung

HS làm theo cặp đôi với Phiếu học tập số 2. Nhiệm vụ gồm: (1) tìm một giá trị xx trong dãy nn phần tử bằng cách duyệt từ đầu đến cuối, xác định số lần so sánh trong trường hợp tốt nhất và trường hợp xấu nhất; (2) phân loại bậc của T(n)=3n+2T(n)=3n+2; (3) chạy chương trình đếm số lần chia đôi nn cho đến khi bằng 11 với n=8n=8 và n=16n=16, rồi rút ra bậc của thuật toán chia đôi.

c) Sản phẩm

Kết quả trong Phiếu học tập số 2: tìm kiếm tuyến tính có trường hợp tốt nhất là 11 lần so sánh (giá trị nằm đầu dãy) và trường hợp xấu nhất là nn lần so sánh (giá trị nằm cuối dãy hoặc không có trong dãy). T(n)=3n+2T(n)=3n+2 thuộc O(n)O(n) vì bỏ hằng số và hệ số. Chia đôi 88 xuống 11 cần 33 bước, 1616 xuống 11 cần 44 bước, nên số bước tăng theo log⁡2n\log_2 n, thuộc O(log⁡n)O(\log n) khi dãy đã sắp xếp.

d) Tổ chức thực hiện

  1. Giáo viên

    Bước 1: Chuyển giao nhiệm vụ

    GV phát Phiếu học tập số 2, yêu cầu cặp đôi thảo luận và trả lời từng câu. GV nhắc: trường hợp tốt nhất là trường hợp ít thao tác nhất với cùng kích thước nn.

    Học sinh

    HS đọc phiếu, chia việc: một bạn làm phần tìm kiếm, một bạn làm phần đếm chia đôi.

  2. Giáo viên

    Bước 2: Thực hiện nhiệm vụ

    GV hướng dẫn HS chạy chương trình chia đôi trên Thonny: lặp khi n>1n>1 thì gán n=n//2n=n//2 và tăng biến đếm. GV kiểm tra các cặp có đếm đúng bước không.

    Học sinh

    HS chạy chương trình, ghi kết quả: n=8n=8 cho 33 bước, n=16n=16 cho 44 bước. HS trả lời câu hỏi về trường hợp tốt, xấu. Dự kiến HS trả lời: nếu xx nằm đầu dãy thì chỉ cần 11 lần so sánh.

  3. Giáo viên

    Bước 3: Báo cáo, thảo luận

    GV mời 2 cặp báo cáo, yêu cầu các cặp khác bổ sung: Vì sao 3n+23n+2 và nn cùng bậc?

    Học sinh

    HS trình bày: khi nn lớn, số hạng 3n3n chiếm ưu thế, hằng số 33 và số 22 không làm đổi bậc tuyến tính.

  4. Giáo viên

    Bước 4: Kết luận, nhận định

    GV chốt: tìm kiếm tuyến tính có bậc O(n)O(n) trong trường hợp xấu nhất và O(1)O(1) trong trường hợp tốt nhất. Thuật toán chia đôi trên dãy đã sắp có bậc O(log⁡n)O(\log n). Không phải thuật toán nào cũng có một bậc duy nhất, nên cần nói rõ trường hợp.

    Học sinh

    HS ghi bảng so sánh hai trường hợp vào vở.

Hoạt động 3: Luyện tập · 25 phút

Trò chơi bốn bước và trắc nghiệm nhanh

a) Mục tiêu

HS vận dụng quy trình đếm thao tác và phân loại bậc để làm đúng các bài tập cơ bản, đồng thời tự kiểm tra đáp án.

b) Nội dung

Các nhóm thi đua theo hình thức đội chơi: GV đọc hoặc chiếu lần lượt bài 1 đến bài 6, nhóm giơ bảng đáp án. Sau đó HS làm bài 8 trên giấy và trình bày bằng lời. Có thể tham khảo bài tập tương tác trên trang NeoEdu để tự luyện thêm.

c) Sản phẩm

Đáp án: Bài 1: 77. Bài 2: 1616. Bài 3: 66 (vì 0+1+2+3=60+1+2+3=6). Bài 4: đáp án A, O(n)O(n) vì hệ số và hằng số không làm đổi bậc tuyến tính. Bài 5: Sai, vì O(n)O(n) là bậc tăng trưởng, không phải đơn vị thời gian thực. Bài 6: chọn kích thước nn, đếm thao tác chính, viết hàm số đếm, xác định bậc tăng trưởng và trường hợp. Bài 8: Không; hai vòng nối tiếp mỗi vòng nn có 2n2n thao tác và thuộc O(n)O(n), còn hai vòng lồng nhau n×nn\times n có n2n^2 thao tác và thuộc O(n2)O(n^2); với n=5n=5 là 1010 và 2525.

d) Tổ chức thực hiện

  1. Giáo viên

    Bước 1: Chuyển giao nhiệm vụ

    GV nêu luật chơi: mỗi nhóm có bảng con, giơ đáp án sau khi GV đọc đề. Nhóm đúng đầu tiên được cộng điểm. Bài 8 làm bằng lời trong nhóm.

    Học sinh

    HS nhóm lại, chuẩn bị bảng con và bút.

  2. Giáo viên

    Bước 2: Thực hiện nhiệm vụ

    GV đọc từng bài 1 đến 6, cho nhóm 1 phút suy nghĩ. Với bài 8, GV đi quanh lớp và gợi ý: so sánh số thao tác khi n=5n=5.

    Học sinh

    HS giơ bảng đáp án; thảo luận nhóm với bài 8. Dự kiến HS trả lời bài 8: không giống nhau vì một bên là 2n2n, một bên là n2n^2.

  3. Giáo viên

    Bước 3: Báo cáo, thảo luận

    GV công bố đáp án đúng, yêu cầu nhóm sai giải thích lại cách đếm của mình.

    Học sinh

    Các nhóm đối chiếu đáp án, sửa lỗi và ghi chú vào vở.

  4. Giáo viên

    Bước 4: Kết luận, nhận định

    GV chốt: khi đếm thao tác, cần xác định thân vòng lặp chạy bao nhiêu lần; khi phân loại bậc, hệ số và hằng số bị bỏ; hai vòng nối tiếp không bằng hai vòng lồng nhau.

    Học sinh

    HS ghi điểm và câu chốt vào vở.

Hoạt động 4: Vận dụng · 15 phút

Tìm tên trong danh bạ điện thoại

a) Mục tiêu

HS vận dụng kiến thức về bậc thời gian để ước lượng và lựa chọn thuật toán tìm kiếm phù hợp với dữ liệu thực tế, đồng thời kiểm tra điều kiện áp dụng của thuật toán chia đôi.

b) Nội dung

Tình huống: danh bạ điện thoại có 10001000 người. Cách A: duyệt từ đầu đến cuối để tìm tên. Cách B: nếu danh bạ đã sắp theo tên thì chia đôi để tìm. HS tính số thao tác trong trường hợp xấu nhất của cả hai cách. Sau đó HS viết chương trình đếm tuyến tính với n=5n=5 để kiểm tra mã nguồn như bài 7 trong bài tập (đếm hai vòng n×nn\times n với n=5n=5 in ra 2525), rồi trả lời câu hỏi: Vì sao không được chia đôi nếu danh bạ chưa sắp theo tên?

c) Sản phẩm

Kết quả HS rút ra: cách A trong trường hợp xấu nhất cần khoảng 10001000 lần so sánh, thuộc O(n)O(n); cách B cần khoảng 1010 lần chia đôi (log⁡21000≈9,97\log_2 1000 \approx 9{,}97), thuộc O(log⁡n)O(\log n). Điều kiện áp dụng: chỉ chia đôi được khi dãy đã sắp theo tên, nếu không kết quả có thể sai. Bài 7 (hai vòng n×nn\times n với n=5n=5) in ra 2525, mã đúng là hai vòng lồng nhau với biến đếm dd; kết quả bậc O(n2)O(n^2), không phải giây.

d) Tổ chức thực hiện

  1. Giáo viên

    Bước 1: Chuyển giao nhiệm vụ

    GV trình bày tình huống danh bạ 10001000 người, nêu hai cách tìm kiếm và yêu cầu HS ước lượng số thao tác trong trường hợp xấu nhất.

    Học sinh

    HS đọc tình huống, làm việc cá nhân trong 4 phút và ghi kết quả ước lượng ra vở.

  2. Giáo viên

    Bước 2: Thực hiện nhiệm vụ

    GV hướng dẫn HS đối chiếu với kết quả chia đôi trên Thonny. Nhắc HS kiểm tra lại mã đếm hai vòng với n=5n=5 như bài 7.

    Học sinh

    HS viết và chạy đoạn mã đếm, ghi kết quả. Dự kiến HS trả lời: tuyến tính cần khoảng 10001000 lần so sánh, chia đôi cần khoảng 1010 lần.

  3. Giáo viên

    Bước 3: Báo cáo, thảo luận

    GV mời 2 HS trình bày ước lượng và nêu điều kiện áp dụng chia đôi. GV đặt câu hỏi phản biện: Nếu danh bạ không sắp xếp thì có chia đôi được không?

    Học sinh

    HS trả lời: không; vì chia đôi dựa vào việc biết nửa trước hay nửa sau chứa giá trị cần tìm, nên dãy phải được sắp theo tên.

  4. Giáo viên

    Bước 4: Kết luận, nhận định

    GV chốt: chọn thuật toán cần dựa trên bậc thời gian và điều kiện áp dụng; độ phức tạp là mức tăng trưởng theo nn, không phải số giây cụ thể. Giao bài tập về nhà.

    Học sinh

    HS ghi kết luận vào vở và chuẩn bị nộp bài về nhà.

Phiếu học tập

Phiếu học tập số 1

Nhiệm vụ: chạy các chương trình Python sau và điền kết quả vào bảng.

  • Chương trình A: n = 7, d = 0, một vòng for i chạy n lần, mỗi lần d += 1, in d. Kết quả: ...
  • Chương trình B: n = 4, d = 0, hai vòng for lồng nhau, mỗi vòng chạy n lần, mỗi lần d += 1, in d. Kết quả: ...
  • Chương trình C: n = 5, cấu trúc như chương trình B. Kết quả: ...

Câu hỏi:

  • Chương trình A có bậc tăng trưởng nào? Vì sao?
  • Chương trình B có bậc tăng trưởng nào? Vì sao?
  • Khi n tăng gấp đôi, số thao tác của chương trình A và B tăng bao nhiêu lần?
  • Viết đoạn Python đếm số thao tác của B nếu n = 100 và nêu kết quả.

Phiếu học tập số 2

Nhiệm vụ 1: Dãy có n phần tử. Tìm giá trị x bằng cách duyệt từ đầu đến cuối.

  • Trường hợp tốt nhất: ...
  • Trường hợp xấu nhất: ...

Nhiệm vụ 2: Phân loại bậc của T(n) = 3n + 2.

  • Bậc: ...
  • Vì sao bỏ được hằng số và hệ số: ...

Nhiệm vụ 3: Chương trình chia đôi (lặp khi n > 1, gán n = n // 2, tăng biến đếm).

  • Với n = 8, số bước là: ...
  • Với n = 16, số bước là: ...
  • Bậc tăng trưởng của thuật toán chia đôi là: ...

Nhiệm vụ 4: Điều kiện áp dụng thuật toán chia đôi là gì?

Hướng dẫn về nhà

  • Hoàn thành Phiếu học tập số 2 và viết lại đoạn mã đếm hai vòng lồng nhau với n=5n=5, kiểm tra kết quả in ra là 2525. Giải thích bằng lời vì sao đây là bậc O(n2)O(n^2), không phải số giây.
  • Làm bài 7 và bài 8 trong sách giáo khoa, nộp bài theo đúng định dạng GV yêu cầu. Bài 7 cần viết chương trình hoàn chỉnh, kiểm tra theo dữ liệu mẫu và lập luận về bậc.
  • Luyện thêm bài tập tương tác trên trang NeoEdu (neoedu.vn/learn/11/informatics/bai-24-khmt-danh-gia-do-phuc-tap-thoi-gian-thuat-toan) và ghi lại các câu sai để hỏi GV ở tiết sau.
  • Suy nghĩ: nếu danh bạ có 1 000 0001\,000\,000 người thì số thao tác xấu nhất của cách duyệt tuần tự và cách chia đôi khác nhau thế nào? Viết câu trả lời ngắn gọn vào vở.

Giáo án do NeoEdu soạn với sự hỗ trợ của AI, dựa trên nội dung bài học trên Học liệu. Thầy cô nên đọc lại và điều chỉnh cho phù hợp với học sinh của mình; bản Word để sửa trực tiếp.