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

Bài 13 Thuật toán tìm kiếm trang 71 sách giáo khoa tin học lớp 7, NXB Chân trời sáng tạo, mời các em tham khảo cùng Bumbii.

Chủ đề 5. Giải quyết vấn đề với sự trợ giúp của máy tính. Bài 13. Thuật toán tìm kiếm.

KHỞI ĐỘNG

Có 9 thẻ số, mỗi thẻ được ghi số ở một mặt và mặt còn lại không ghi gì. Đặt úp các thẻ số trên mặt bàn và xếp thành một dãy như Hình 1.

dùng thuật toán để tìm kiếm một thẻ bất kì
Hình 1. Các thẻ được ghi số ở mặt úp

Em hãy trao đổi với bạn để thực hiện tìm một số bất kì có trong dãy số ghi trên các thẻ ở Hình 1 hay không.

Đáp án:

Có 2 cách tìm:

Cách 1: Lật lần lượt từng thẻ số theo thứ tự cho đến khi tìm thấy hoặc đã lật hết thẻ mà không tìm thấy.

Cách 2: Lật từng thẻ số một cách ngẫu nhiên cho đến khi tìm thấy hoặc đã lật hết các thẻ mà không tìm thấy. Cách này có thể sẽ rất nhiều thẻ số và mỗi lần lật một thẻ số rồi phải úp lại mới được lật thẻ tiếp theo.

Như vậy cách 1 để dễ thực hiện, dễ nhớ thẻ đã lật, thẻ chưa lật.

KHÁM PHÁ

Thuật toán tìm kiếm tuần tự
Câu 1

Các số ghi trên mỗi thẻ ở Hình 1 lần lượt là: 26, 14, 24, 18, 15, 21, 19, 25, 12.

Em hãy tạo Bảng 1 và điền thông tin của mỗi lần lặp để tìm số 21 trong đãy theo thuật toán tìm kiếm tuần tự.

Bảng 1. Tìm số 21 trong dãy số bằng thuật toán tìm kiếm tuần tự

Lần lặpSố ghi trên thẻĐúng số cần tìm?Đã hết thẻ số?
126SaiSai
214SaiSai

Đáp án:

Bảng 1. Tìm số 21 trong dãy số bằng thuật toán tìm kiếm tuần tự

Lần lặpSố ghi trên thẻĐúng số cần tìm?Đã hết thẻ số?
126SaiSai
214SaiSai
324SaiSai
418SaiSai
515SaiSai
621Đúng 

Đã tìm thấy số 21 ở lần lặp 6, thuật toán kết thúc.

Câu 2

Lựa chọn phương án đúng. Để tìm kiếm một số trong dãy số bằng thuật toán tìm kiếm tuần tự, ta thực hiện:

A. Lấy ngẫu nhiên một số trong dãy số để so sánh với số cần tìm.

B. So sánh lần lượt từ số đầu tiên trong dãy số với số cần tìm.

C. Sắp xếp dãy số theo thứ tự tăng dần.

D. So sánh số cần tìm với số ở giữa dãy số.

Đáp án:

Phương án đúng là B.

Thuật toán tìm kiếm tuần tự thực hiện so sánh lần lượt từ phần tử đầu tiên của dãy với giá trị cần tìm, việc tìm kiếm kết thúc khi tìm thấy hoặc đã duyệt hết các phần tử trong dãy.

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

Câu hỏi

Em và bạn hãy thực hiện trò chơi mô phỏng thuật toán tìm kiếm nhị phân theo hướng dẫn sau:

a) Chuẩn bị 10 thẻ, mỗi thẻ ghi một số khác nhau. Sắp xếp các thẻ số thành một dãy trên mặt bàn theo thứ tự giá trị tăng dần của số ghi trên thẻ. Đặt úp mặt ghi số để không nhìn thấy số ghi trên các thẻ.

b) Em đề nghị bạn thực hiện thuật toán tìm kiếm nhị phân để tìm một số do em đưa ra.

c) Hoán đổi vai trò, em thực hiện tìm kiếm theo đề nghị của bạn.

Đáp án: (gợi ý)

Ví dụ, có 10 thẻ số được sắp xếp tăng dần như sau:

Thứ tự12345678910
Dãy thẻ số12141819212426273032

Dùng thuật toán tìm kiếm nhị phân để tìm số 26 trong dãy thẻ số ở trên.

Lần lặp 1. Lật thẻ số ở giữa của dãy (thẻ thứ 5)

Thứ tự12345678910
Dãy thẻ số12141819212426273032

So sánh số cần tìm là 26 với số ghi trên thẻ vừa lật là 21. Do 26 > 21 nên chỉ cần tìm ở nửa sau của dãy thẻ.

Thứ tự12345678910
Dãy thẻ số12141819212426273032

Lần lặp 2. Lật thẻ số ở giữa của nửa sau (thẻ thứ 8).

Thứ tự12345678910
Dãy thẻ số12141819212426273032

So sánh số cần tìm là 26 với số ghi trên thẻ vừa lật là 27. Do 26 < 27 nên chỉ cần tìm ở nửa trước của dãy thẻ.

Thứ tự12345678910
Dãy thẻ số12141819212426273032

Lần lặp 3. Lật thẻ số ở giữa của nửa trước (thẻ thứ 6)

Thứ tự12345678910
Dãy thẻ số12141819212426273032

So sánh số cần tìm là 26 với số ghi trên thẻ vừa lật là 24. Do 26>24 nên chỉ cần tìm ở nửa sau của dãy thẻ.

Thứ tự12345678910
Dãy thẻ số12141819212426273032

Lần lặp 4. Lật thẻ số ở giữa của nửa sau (thẻ thứ 7)

Thứ tự12345678910
Dãy thẻ số12141819212426273032

Giá trị ghi trên thẻ thứ 7 là 26, bằng với số cần tìm nên kết quả là: tìm thấy số 21 trong dãy ở vị trí thứ 6 và thuật toán kết thúc.

LUYỆN TẬP

Câu 1

Hãy sử dụng thuật toán tìm kiếm tuần tự để tìm trong lớp em có bạn cùng tháng sinh với em hay không. Có thể sử dụng danh sách lớp có ghi thông tin ngày sinh hoặc hỏi trực tiếp. Lập Bảng 2 vào vở và ghi kết quả thực hiện (dòng 1 là ví dụ minh họa).

Bảng 2. Tìm bạn sinh cùng tháng với em bằng thuật toán tìm kiếm tuần tự

Lần lặpTháng sinh của bạnCùng tháng sinh với emĐã hết danh sách/ đã hỏi hết các bạn
14SaiSai
2

Đáp án: (gợi ý)

Ví dụ: Em (tên là An) sinh tháng 2 (14/02/2009), em tìm và hỏi được ngày sinh của 5 bạn trong lớp như sau:

Tên học sinhNgày sinh
Quí14/07/2009
Bình02/05/2009
Minh01/01/2009
Hoa16/09/2009
Phát26/02/2009
Hòa11/12/2009

Bảng 2. Tìm bạn sinh cùng tháng với em bằng thuật toán tìm kiếm tuần tự

Lần lặpTháng sinh của bạnCùng tháng sinh với emĐã hết danh sách/ đã hỏi hết các bạn
17SaiSai
25SaiSai
31SaiSai
49SaiSai
52Đúng 

Sau 5 lần lặp, em đã tìm thấy bạn sinh cùng tháng 2 là bạn Phát và thuật toán kết thúc.

Câu 2

Bảng 3 là danh sách hai số đầu biển số xe của một số tỉnh (tên tỉnh đã của một số tỉnh được sắp xếp theo thứ tự trong bảng chữ cái).

a) Áp dụng thuật toán tìm kiếm tuần tự để tìm ra tỉnh có hai đầu của biển số xe là 25. Cho biết em đã thực hiện bao nhiêu lần lặp.

b) Áp dụng thuật toán tìm kiếm nhị phân để tìm hai số đầu tiên của biển số xe của tỉnh Lai Châu. Cho biết em đã thực hiện bao nhiêu lần lặp.

c) Số lần lặp em thực hiện ở câu a ít hơn hay ở câu b ít hơn? Tại sao?

d) Có thể áp dụng thuật toán tìm kiếm nhị phân để tìm ra tỉnh khi biết hai số đầu của biển số xe của tỉnh đó hay không? Tại sao?

Bảng 3. Danh sách hai số đầu biển số xe của một số tỉnh

Tên tỉnhHai số đầu của biển số xe
An Giang67
Bà Rịa – Vũng Tàu72
Bình Định77
Cà Mau69
Điện Biên27
Gia Lai81
Khánh Hòa79
Lai Châu25
Nam Định18
Yên Bái21

Đáp án:

a. Áp dụng thuật toán tìm kiếm tuần tự để tìm ra tỉnh có hai đầu của biển số xe là 25.

Lần lặpHai số đầu của biển số xeĐúng số cần tìm?Đã hết danh sách cần tìm?
167SaiSai
272SaiSai
377SaiSai
469SaiSai
527SaiSai
681SaiSai
779SaiSai
825Đúng 

Sau khi thực hiện 8 lần lặp, thuật toán đã tìm thấy số cần tìm là 25, thuật toán kết thúc. Đó là tỉnh Lai Châu.

b. Áp dụng thuật toán tìm kiếm nhị phân để tìm hai số đầu tiên của biển số xe của tỉnh Lai Châu.

Hai số đầu tiên của biển số xe của tỉnh Lai Châu là 25.

Ta sắp xếp các hai số đầu tiên của biển số xe các tỉnh thành một dãy số tăng dần như sau:

Thứ tự12345678910
Dãy số18212527676972777981

Lần lặp 1. Chọn số ở vị trí giữa dãy (vị trí thứ 5)

Thứ tự12345678910
Dãy số18212527676972777981

So sánh số cần tìm là 25 với số ở giữa dãy là 67. Do 25<67 nên chỉ cần tìm ở nửa trước của dãy.

Lần lặp 2. Chọn số ở vị trí giữa dãy (vị trí thứ 2)

Thứ tự12345678910
Dãy số18212527676972777981

So sánh số cần tìm là 25 với số ở giữa dãy là 21. Do 25>21 nên chỉ cần tìm ở nửa sau của dãy.

Lần lặp 3. Chọn số ở vị trí giữa dãy (vị trí thứ 1)

Thứ tự12345678910
Dãy số18212527676972777981

So sánh số cần tìm là 25 với số ở giữa dãy là 25. Do 25=25 nên thuật toán đã tìm thấy số 25 -> thuật toán kết thúc.

Như vậy sau 3 lần lặp, ta đã tìm thấy số 25.

c. Số lần lặp ở câu b) ít hơn vì danh sách tên tỉnh đã được sắp xếp nên có thể áp dụng thuật toán tìm kiếm nhị phân để tìm.

d. Không thể áp dụng thuật toán tìm kiếm nhị phân để tìm ra tỉnh khi biết hai số đầu của biển số xe của tỉnh đó vì danh sách hai số đầu của biển số xe chưa được sắp xếp.

VẬN DỤNG

Câu 1

Em tìm một từ tiếng Anh trong cuốn từ điển theo cách nào? Tại sao em dùng cách đó?

Đáp án:

Các từ trong từ điển được sắp xếp theo thứ tự 24 chữ cái trong bảng chữ cái: a, b, c, …, z. Nên để tìm một từ tiếng Anh trong cuốn từ điển, em dùng thuật toán tìm kiếm nhị phân để tìm kiếm nhanh hơn.

Câu 2

Hãy vận dụng thuật toán tìm kiếm nhị phân để xác định một bạn trong lớp được sinh vào ngày nào trong tháng với không quá 5 câu hỏi trắc nghiệm Đúng/Sai. Tương tự, để xác định một bạn được sinh vào tháng nào trong năm thì em cần dùng nhiều nhất bao nhiêu câu hỏi Đúng/Sai?

Đáp án:

Để xác định ngày sinh là tìm một số trong dãy số được sắp xếp từ 1 đến 31.

Để xác định ngày sinh là tìm một số trong dãy số được sắp xếp từ 1 đến 12.

Như vậy có thể áp dụng thuật toán tìm kiếm nhị phân để xác định ngày sinh, tháng sinh của một bạn.

Áp dụng thuật toán tìm kiếm nhị phân để xác định ngày sinh như sau:

Ta có dãy số theo ngày sinh:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31.

Câu hỏi 1: Ngày sinh của bạn có phải ở nửa trước của dãy số ngày sinh đúng không?

Dự đoán trả lời: Đúng-> Như vậy ngày sinh cần tìm ở phần nửa trước của dãy.

Ta có số 16 là vị trí giữa dãy:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31.

Nửa trước của dãy là: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.

Câu hỏi 2: Ngày sinh của bạn có phải ở nửa trước của dãy số ngày sinh mới đúng không?

Dự đoán trả lời: Đúng -> Như vậy ngày sinh cần tìm ở phần nửa trước của dãy.

Ta có số 8 là vị trí giữa dãy mới:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.

Nửa trước của dãy mới này là: 1, 2, 3, 4, 5, 6, 7.

Câu hỏi 3: Ngày sinh của bạn có phải ở nửa trước của dãy số ngày sinh mới đúng không?

Dự đoán trả lời: Đúng -> Như vậy ngày sinh cần tìm ở phần nửa trước của dãy.

Ta có số 4 là vị trí giữa dãy mới: 1, 2, 3, 4, 5, 6, 7.

Nửa trước của dãy mới này là: 1, 2, 3.

Câu hỏi 4: Ngày sinh của bạn có phải ở nửa trước của dãy số ngày sinh đúng không?

Dự đoán trả lời: Đúng -> Như vậy ngày sinh cần tìm ở phần nửa trước của dãy.

Ta có số 2 là vị trí giữa dãy mới: 1, 2, 3.

Nửa trước của dãy mới này là: 1.

Câu hỏi 5: Ngày sinh của bạn có phải là số trong dãy mới này không?

Trả lời: Đúng. Vì dãy mới còn có một số trong dãy.

Tương tự cho các câu trả lời là Đúng/Sai ở các trường hợp khác. Như vậy, để tìm ngày sinh của một bạn, chúng ta dùng nhiều nhất không quá 5 câu hỏi Đúng/Sai.

Áp dụng thuật toán tìm kiếm nhị phân để xác định tháng sinh như sau:

Ta có dãy số theo tháng sinh:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12

Câu hỏi 1: Tháng sinh của bạn có phải ở nửa trước của dãy số tháng sinh đúng không?

Dự đoán trả lời: Sai -> Như vậy tháng sinh cần tìm ở phần nửa sau của dãy.

Ta có số 6 là vị trí giữa dãy:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12.

Nửa sau của dãy: 7, 8, 9, 10, 11, 12.

Câu hỏi 2: Tháng sinh của bạn có phải ở nửa trước của dãy số tháng sinh mới đúng không?

Dự đoán trả lời: Sai -> Như vậy tháng sinh cần tìm ở phần nửa sau của dãy.

Ta có số 9 là vị trí giữa dãy:

7, 8, 9, 10, 11, 12.

Nửa sau của dãy: 10, 11, 12.

Câu hỏi 3: Tháng sinh của bạn có phải ở nửa trước của dãy số tháng sinh đúng không?

Dự đoán trả lời: Đúng -> Như vậy tháng sinh cần tìm ở phần nửa trước của dãy.

Ta có số 11 là vị trí giữa dãy: 10, 11, 12.

Nửa trước của dãy: 10.

Câu hỏi 4: Tháng sinh của bạn có phải là số trong dãy mới này không?

Trả lời: Đúng. Vì dãy mới chỉ còn một số trong dãy.

Tương tự cho các câu trả lời là Đúng/Sai ở các trường hợp khác. Như vậy, để tìm ngày sinh của một bạn, chúng ta dùng nhiều nhất không quá 4 câu hỏi Đúng/Sai.

__________***__________

Xem các bài giải khác tại https://bumbii.com/giai-bai-tap-sgk-tin-hoc-lop-7-nxb-chan-troi-sang-tao/

Thông tin liên hệ & mạng xã hội:
Website: https://bumbii.com/
Facebook: https://www.facebook.com/bumbiiapp
Pinterest: https://www.pinterest.com/bumbiitech

0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest

0 Bình luận
Phản hồi nội tuyến
Xem tất cả bình luận
0
Cùng chia sẻ bình luận của bạn nào!x