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 19 · KHMT. Bài toán tìm kiếm

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 bài toán tìm kiếm là xác định giá trị hoặc vị trí của một phần tử trong dãy, và phải quy định cách xử lí khi không tìm thấy hoặc khi phần tử xuất hiện nhiều lần.
  • Giải thích được ý tưởng tìm kiếm tuyến tính: duyệt lần lượt từ vị trí 00, dừng ngay khi gặp phần tử cần tìm; thuật toán áp dụng được cho dãy bất kì.
  • Giải thích được ý tưởng tìm nhị phân: thu hẹp khoảng tìm kiếm dựa trên so sánh với phần tử giữa; điều kiện bắt buộc là dãy đã được sắp theo thứ tự thích hợp.
  • Vận dụng được quy ước vị trí bắt đầu từ 00 và trả về −1-1 khi không thấy; nhận biết được tìm nhị phân cơ bản không bảo đảm trả về vị trí đầu tiên khi dãy có phần tử lặp.

2. Năng lực

a) Năng lực chung

  • Tự chủ và tự học: tự đọc chương trình mẫu, dự đoán kết quả rồi kiểm tra bằng cách chạy chương trình trên máy tính.
  • Giao tiếp và hợp tác: thảo luận theo cặp và nhóm, trình bày lập luận khi chọn thuật toán và giải thích kết quả trace.
  • Giải quyết vấn đề và sáng tạo: chọn thuật toán phù hợp với dữ liệu; sửa cách dừng của chương trình để tìm mọi vị trí của một giá trị.

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

  • NLa: sử dụng trình soạn thảo Python (IDLE hoặc Thonny) để nhập, chạy và xem kết quả chương trình tìm kiếm.
  • NLc: giải quyết bài toán tìm kiếm với sự hỗ trợ của máy tính: thử dữ liệu mẫu, kiểm tra trường hợp không thấy và trường hợp lặp.
  • NLd: sử dụng trang bài học số NeoEdu để xem ví dụ và làm bài tập tương tác phục vụ tự học.
  • NLe: phối hợp trong nhóm để chia sẻ mã nguồn, thống nhất đáp án và kiểm tra chéo kết quả chạy chương trình.

3. Phẩm chất

  • Chăm chỉ: làm đủ các bài trace và bài tập lập trình, kiểm tra lại kết quả khi chưa khớp với dự đoán.
  • Trung thực: ghi đúng kết quả chạy thực tế vào phiếu, không sao chép đáp án của bạn mà không hiểu lập luận.
  • Trách nhiệm: hoàn thành phần việc được giao trong nhóm và đối chiếu kết quả trước khi báo cáo.

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 chương trình mẫu và kết quả chạy.
  • Phần mềm soạn thảo Python (IDLE hoặc Thonny) đã cài sẵn trên máy giáo viên.
  • Bảng phụ hoặc bảng trắng ghi sẵn dãy mẫu [8,3,6,3] và [2,4,6,8,10].
  • Phiếu học tập số 1 và Phiếu học tập số 2 (in đủ cho 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 tại neoedu.vn/learn/11/informatics/bai-19-khmt-bai-toan-tim-kiem; dùng ở hoạt động luyện tập và vận dụng.

2. Học sinh

  • Máy tính có cài Python hoặc truy cập trình duyệt để mở trang NeoEdu (làm theo nhóm 2–4 em).
  • Vở ghi, bút, bút chì để làm trace bảng.
  • Phiếu học tập số 1 và Phiếu học tập số 2.

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

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

Tìm số trong dãy

a) Mục tiêu

Xác định vấn đề: bài toán tìm kiếm cần trả lời được gì và cần quy định cách xử lí các trường hợp nào.

b) Nội dung

GV ghi dãy [8,3,6,3][8,3,6,3] lên bảng và đặt lần lượt các câu hỏi:

  • Trong dãy có số 33 không? Nó nằm ở vị trí nào? Nếu xuất hiện hai lần thì trả lời thế nào?
  • Tìm số 99 trong dãy trên: máy tính nên trả về kết quả gì để người dùng biết là không có?
  • Dãy [2,4,6,8,10][2,4,6,8,10] đã được sắp xếp. Em có cách nào tìm số 88 nhanh hơn việc xét từng phần tử không?
    HS trả lời miệng, GV ghi các ý chính lên bảng.

c) Sản phẩm

Dự kiến HS trả lời:

  • Số 33 có trong dãy, vị trí đầu tiên là 11 (đếm từ 00), vị trí thứ hai là 33. Vì có hai kết quả nên cần quy ước trả về vị trí nào.
  • Số 99 không có trong dãy, cần quy ước trả về −1-1.
  • Với dãy đã sắp xếp, có thể bỏ qua một nửa dãy sau mỗi lần so sánh.
    Kết luận ghi vở: Bài toán tìm kiếm cần xác định giá trị hoặc vị trí và cách xử lí khi không thấy hoặc khi phần tử lặp lại.

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

  1. Giáo viên

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

    GV ghi dãy mẫu lên bảng, nêu câu hỏi khởi động và yêu cầu HS suy nghĩ 1 phút trước khi trả lời.

    Học sinh

    HS suy nghĩ cá nhân, giơ tay phát biểu theo câu hỏi.

  2. Giáo viên

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

    GV gợi ý nếu HS chưa rõ về vị trí lặp; cho HS so sánh hai cách: duyệt từng phần tử và chia đôi dãy.

    Học sinh

    HS nêu ý kiến. Dự kiến: 'Số 3 có ở vị trí 1 và 3'; 'Số 9 không có nên phải báo bằng một giá trị đặc biệt'.

  3. Giáo viên

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

    GV mời 2–3 HS trình bày, ghi các ý lên bảng dưới hai cột: 'Cần trả lời' và 'Cần quy định'.

    Học sinh

    HS trình bày ý kiến. Dự kiến: 'Cần biết có tìm thấy hay không và ở vị trí nào'; 'Cần quy định khi không thấy là trả về −1-1'.

  4. Giáo viên

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

    GV chốt: bài toán tìm kiếm cần xác định giá trị hoặc vị trí và cách xử lí khi không thấy hoặc lặp; giới thiệu hai thuật toán sẽ học trong tiết này.

    Học sinh

    HS ghi tên bài và kết luận vào vở.

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

Tìm kiếm tuyến tính

a) Mục tiêu

Giải thích được ý tưởng và điều kiện áp dụng của tìm kiếm tuyến tính; giải thích được vì sao chương trình trả về vị trí đầu tiên.

b) Nội dung

HS làm việc theo cặp với Phiếu học tập số 1. Cặp đọc hàm tim(a,x) duyệt bằng vòng for, dự đoán kết quả của tim([8,3,6,3],3), sau đó chạy chương trình trên máy để kiểm tra. Cặp trả lời các câu hỏi trong phiếu: vì sao có câu lệnh return ngay khi gặp phần tử; điều gì xảy ra khi không thấy; thuật toán có cần dãy được sắp xếp không.

c) Sản phẩm

Kiến thức HS rút ra:

  • Ý tưởng: duyệt lần lượt ii từ 00 đến len(a)−1\mathrm{len(a)-1}, so sánh a[i]a[i] với xx; khi a[i]=xa[i]=x thì return ii ngay.
  • Kết quả chạy chương trình với dãy [8,3,6,3][8,3,6,3] và x=3x=3 là 11, vì return dừng ở lần gặp đầu tiên.
  • Nếu duyệt hết dãy mà không gặp xx thì return −1-1.
  • Tìm tuyến tính duyệt được dãy bất kì, không cần dãy được 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 chiếu chương trình tim(a,x) lên máy chiếu, nêu nhiệm vụ: dự đoán kết quả, chạy kiểm tra, trả lời Phiếu học tập số 1 trong 10 phút.

    Học sinh

    HS nhận Phiếu học tập số 1, ngồi theo cặp và đọc đề.

  2. Giáo viên

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

    GV đi quanh lớp, hỏi: 'Nếu đổi thành tim([8,3,6],9) thì máy in ra gì?' và nhắc các cặp chưa chạy được chương trình kiểm tra lỗi thụt đầu dòng.

    Học sinh

    HS dự đoán, chạy chương trình và điền bảng. Dự kiến: 'Kết quả là 11 với dữ liệu đầu, −1-1 với dữ liệu thứ hai, vì duyệt hết không gặp 99'.

  3. Giáo viên

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

    GV mời 2 cặp trình bày: một cặp nêu ý tưởng duyệt, một cặp nêu trường hợp không thấy và trường hợp lặp.

    Học sinh

    HS trình bày. Dự kiến: 'Dừng ở vị trí 11 vì đó là lần đầu gặp 33'; 'Không cần sắp xếp dãy vì chỉ so sánh từng phần tử'.

  4. Giáo viên

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

    GV chốt: tìm tuyến tính duyệt từ vị trí 00, return ngay khi gặp, return −1-1 khi không thấy; áp dụng được cho dãy bất kì. GV nhấn mạnh về quy ước vị trí đầu tiên.

    Học sinh

    HS ghi kết luận vào vở và đánh dấu kết quả đúng trong phiếu.

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

Tìm kiếm nhị phân

a) Mục tiêu

Giải thích được ý tưởng thu hẹp khoảng tìm kiếm của tìm nhị phân; nêu được điều kiện dãy phải sắp thứ tự và hạn chế với phần tử lặp.

b) Nội dung

Nhóm 4 HS làm Phiếu học tập số 2. Nhóm đọc chương trình tim(a,x) dùng biến l, r, m, chạy với a=[2,4,6,8,10] và x=8, lập bảng theo dõi giá trị l, r, m, a[m] qua từng vòng lặp. Sau đó nhóm trả lời: vì sao sau khi a[m] < x thì đặt l=m+1; nếu dãy không được sắp xếp thì điều gì xảy ra; với dãy [8,3,6,3] thì tìm nhị phân có đảm bảo trả về vị trí đầu tiên của 3 không.

c) Sản phẩm

Bảng trace dự kiến:

  • Lượt 1: l=0, r=4, m=2, a[m]=6; 6 nhỏ hơn 8 nên đặt l=3.
  • Lượt 2: l=3, r=4, m=3, a[m]=8; bằng 8 nên return 3.
    Kết quả in ra là 3.
    Kiến thức HS rút ra:
  • Mỗi lần so sánh a[m] với x để loại một nửa khoảng tìm kiếm.
  • Điều kiện bắt buộc: dãy phải được sắp theo thứ tự thích hợp; dãy [8,3,6,3] không được sắp nên không áp dụng được.
  • Với phần tử lặp, tìm nhị phân cơ bản không bảo đảm trả về vị trí đầu tiên.

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 nhiệm vụ: lập bảng trace và trả lời 3 câu hỏi trong phiếu; nhắc HS ghi giá trị l, r, m sau mỗi lượt.

    Học sinh

    Nhóm nhận Phiếu học tập số 2, phân công một bạn ghi bảng, một bạn kiểm tra chương trình.

  2. Giáo viên

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

    GV quan sát các nhóm và hỏi: 'Vì sao m lấy là (l+r)//2?' và 'Nếu x lớn hơn cả dãy thì khoảng tìm kiếm còn gì?'.

    Học sinh

    HS lập bảng trace và thảo luận. Dự kiến: 'Lấy phần tử ở giữa để loại được một nửa'; 'Khoảng bị thu hẹp dần, nếu l lớn hơn r thì dừng và return −1-1'.

  3. Giáo viên

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

    GV mời nhóm 2 trình bày bảng trace, nhóm khác nhận xét về trường hợp dãy không sắp xếp.

    Học sinh

    Nhóm trình bày. Dự kiến: 'Hai lượt là đủ, kết quả là 33'; 'Dãy không sắp xếp thì so sánh a[m] với x không còn cho biết nên đi về nửa nào'.

  4. Giáo viên

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

    GV chốt: tìm nhị phân yêu cầu dãy sắp thứ tự và thu hẹp khoảng sau mỗi lần so sánh; với phần tử lặp cần lưu ý vị trí trả về có thể không phải lần đầu.

    Học sinh

    HS ghi vào vở: điều kiện áp dụng, quy trình thu hẹp khoảng, hạn chế với phần tử lặp.

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

Luyện tập đoán kết quả và viết chương trình

a) Mục tiêu

Vận dụng quy ước vị trí và trả về −1-1; phân biệt điều kiện áp dụng của hai thuật toán; viết và kiểm tra chương trình tìm kiếm.

b) Nội dung

HS làm cá nhân các bài 2 đến 7, sau đó đối chiếu trong nhóm. Nhóm làm tiếp bài 8 và bài 9: viết chương trình tìm tuyến tính trả về vị trí đầu của 33 trong [8,3,6,3][8,3,6,3], sau đó sửa để tìm mọi vị trí. Nhóm có thể dùng bài tập tương tác trên trang NeoEdu để kiểm tra kết quả.
Bài tập:

  • Bài 2: in tim([8,3,6],9).
  • Bài 3: in tim([5,2,5],5).
  • Bài 4: tìm nhị phân tim([2,4,6,8,10],8).
  • Bài 5: điều kiện của tìm nhị phân là gì? A. Dãy được sắp theo thứ tự thích hợp; B. Dãy bất kì; C. Các phần tử bắt buộc khác nhau; D. Chỉ toàn số dương.
  • Bài 6: trả về −1-1 có phải là phần tử cuối cần lấy không?
  • Bài 7: sắp xếp các bước giải một bài tìm kiếm.
  • Bài 8 và 9: viết và sửa chương trình.

c) Sản phẩm

Đáp án:

  • Bài 2: −1-1, vì duyệt hết dãy không có 99.
  • Bài 3: 00, vì dừng ở lần gặp đầu tiên tại vị trí 00.
  • Bài 4: 33, vì lượt đầu m=2m=2 có a[2]=6<8a[2]=6<8 nên l=3l=3; lượt sau m=3m=3 và a[3]=8a[3]=8.
  • Bài 5: Đáp án A, vì nhị phân dựa vào thứ tự để loại một nửa dãy.
  • Bài 6: Đúng, −1-1 chỉ là quy ước báo không thấy, không được dùng a[−1]a[-1] làm kết quả.
  • Bài 7: Xác định mục tiêu và kiểu kết quả → Chọn thuật toán theo dữ liệu → Tìm và trả về vị trí hoặc −1-1 → Kiểm tra có hoặc không và xử lí lặp.
  • Bài 8: chương trình mẫu:
    def tim(a,x):
    for i in range(len(a)):
    if a[i]==x:
    return i
    return -1
    print(tim([8,3,6,3],3))
    Kết quả in 11. Thang chấm tham khảo: duyệt theo chỉ số 00 đến n−1n-1 (0,3 điểm); return ngay lần đầu (0,25 điểm); kết quả 11 (0,25 điểm); trả −1-1 khi không thấy và giải thích (0,2 điểm). Chấp nhận phương án tương đương đúng.
  • Bài 9: không return sớm, giữ danh sách kết quả:
    def tim_tat_ca(a,x):
    ket_qua=[]
    for i in range(len(a)):
    if a[i]==x:
    ket_qua.append(i)
    return ket_qua
    print(tim_tat_ca([8,3,6,3],3))
    Kết quả in [1, 3]; nếu không thấy thì trả về danh sách rỗng. Chấp nhận cách diễn đạt tương đương.

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 danh sách bài 2 đến 9, nêu thời gian: 8 phút làm cá nhân bài 2 đến 7, 14 phút làm nhóm bài 8 và 9.

    Học sinh

    HS nhận đề, làm cá nhân bài 2 đến 7 vào vở.

  2. Giáo viên

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

    GV kiểm tra nhanh bài 4 và 5, nhắc nhóm kiểm tra chương trình bằng máy tính; gợi ý khi nhóm chưa biết sửa cách dừng: 'Nếu không return ngay thì cần biến gì để lưu kết quả?'.

    Học sinh

    HS làm bài và đối chiếu. Nhóm viết và chạy chương trình bài 8, 9. Dự kiến: 'Cần tạo danh sách rỗng trước vòng for và append khi gặp xx'.

  3. Giáo viên

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

    GV mời 1 nhóm trình bày chương trình bài 9 và 1 HS trả lời bài 6; GV nhận xét về quy ước −1-1 và trường hợp dãy không thấy.

    Học sinh

    Nhóm trình bày mã, chạy trước lớp. Dự kiến HS trả lời bài 6: 'Không, −1-1 là giá trị báo không thấy'.

  4. Giáo viên

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

    GV chốt đáp án và nhấn mạnh: tìm tuyến tính trả về vị trí đầu khi return sớm; muốn lấy mọi vị trí thì không return sớm và lưu vào danh sách.

    Học sinh

    HS sửa lỗi trong vở, ghi đáp án đúng.

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

Chọn thuật toán cho danh sách thực tế

a) Mục tiêu

Vận dụng được điều kiện áp dụng để chọn thuật toán phù hợp với một tình huống thực tế và giải thích lựa chọn.

b) Nội dung

GV nêu tình huống: nhà trường có danh sách họ tên học sinh của lớp, chưa sắp xếp, và danh sách mã số học sinh đã sắp tăng dần. Cần tìm học sinh có tên 'Lê Minh' và mã số 1205 để tra cứu. HS nhận xét nên dùng thuật toán nào cho mỗi danh sách và cần xử lí thế nào khi không tìm thấy.
Nhiệm vụ về nhà: viết chương trình tìm mã số trong danh sách đã sắp xếp bằng tìm nhị phân, kiểm tra với ít nhất 3 trường hợp (có, không có, vị trí đầu và cuối dãy) trên trang NeoEdu.

c) Sản phẩm

Dự kiến sản phẩm:

  • Danh sách họ tên chưa sắp xếp: dùng tìm tuyến tính, vì chỉ điều kiện duyệt được dãy bất kì là đủ.
  • Danh sách mã số đã sắp tăng dần: có thể dùng tìm nhị phân, vì điều kiện sắp thứ tự được thoả mãn và thu hẹp khoảng nhanh.
  • Khi không tìm thấy: trả về −1-1 và thông báo 'Không tìm thấy'.
  • Bảng kiểm tra dữ liệu gồm: trường hợp có trong dãy, trường hợp không có, trường hợp ở đầu và cuối dãy.

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

  1. Giáo viên

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

    GV đọc tình huống và nêu câu hỏi: 'Danh sách nào dùng được tìm nhị phân? Vì sao?'.

    Học sinh

    HS đọc tình huống, suy nghĩ 2 phút và ghi ý kiến vào vở.

  2. Giáo viên

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

    GV đi quanh lớp, nhắc HS giải thích dựa trên điều kiện sắp thứ tự, không chỉ nêu tên thuật toán.

    Học sinh

    HS thảo luận cặp. Dự kiến: 'Danh sách họ tên chưa sắp xếp, phải dùng tìm tuyến tính'.

  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 lựa chọn và cách xử lí khi không thấy.

    Học sinh

    HS trình bày. Dự kiến: 'Danh sách mã số đã sắp nên dùng nhị phân, không thấy thì trả về −1-1'.

  4. Giáo viên

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

    GV chốt: chọn thuật toán dựa trên điều kiện dữ liệu; giao nhiệm vụ về nhà và nhắc HS ghi đầy đủ quy ước xử lí không thấy.

    Học sinh

    HS ghi nhiệm vụ về nhà vào vở.

Phiếu học tập

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

Tìm kiếm tuyến tính
Đọc chương trình sau:
def tim(a,x):
for i in range(len(a)):
if a[i]==x:
return i
return -1
Câu 1. Dự đoán kết quả của tim([8,3,6,3],3) và giải thích vì sao kết quả là vị trí đầu tiên.
Câu 2. Chạy chương trình và điền bảng:

  • Dữ liệu a = [8,3,6,3], x = 3: dự đoán ...; kết quả thực tế ...
  • Dữ liệu a = [8,3,6], x = 9: dự đoán ...; kết quả thực tế ...
  • Dữ liệu a = [5,2,5], x = 5: dự đoán ...; kết quả thực tế ...
    Câu 3. Vì sao câu lệnh return i được thực hiện ngay khi gặp phần tử đầu tiên?
    Câu 4. Tìm tuyến tính có cần dãy được sắp xếp trước không? Vì sao?

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

Tìm kiếm nhị phân
Đọc chương trình sau:
def tim(a,x):
l=0
r=len(a)-1
while l<=r:
m=(l+r)//2
if a[m]==x:
return m
if a[m]<x:
l=m+1
else:
r=m-1
return -1
Câu 1. Lập bảng theo dõi khi chạy tim([2,4,6,8,10],8):

  • Lượt 1: l = ..., r = ..., m = ..., a[m] = ..., quyết định: ...
  • Lượt 2: l = ..., r = ..., m = ..., a[m] = ..., quyết định: ...
    Câu 2. Vì sao khi a[m] nhỏ hơn x thì đặt l=m+1?
    Câu 3. Nếu dãy [8,3,6,3] không được sắp xếp thì tìm nhị phân có còn đúng không? Vì sao?
    Câu 4. Với dãy có phần tử lặp, tìm nhị phân cơ bản có đảm bảo trả về vị trí đầu tiên không? Giải thích.

Hướng dẫn về nhà

  • Hoàn thành bài 8 và bài 9 trong sách, ghi lại mã nguồn và kết quả chạy vào vở.
  • Viết chương trình tìm mã số học sinh trong danh sách đã sắp tăng dần bằng tìm nhị phân; kiểm tra ít nhất 3 trường hợp: có trong dãy, không có trong dãy, nằm ở đầu hoặc cuối dãy.
  • Làm các bài tập tương tác của Bài 19 trên trang neoedu.vn/learn/11/informatics/bai-19-khmt-bai-toan-tim-kiem và ghi lại câu sai cùng lí do trong vở.
  • Đọc trước Bài 20 trong sách giáo khoa.

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.