Thứ tự cho biết có thể bỏ phần nào
**Tìm kiếm nhị phân** xét phần tử giữa vùng đang tìm. Trong bài này dãy đã được sắp xếp **tăng dần**. Nếu giá trị cần tìm bằng giá trị giữa thì tìm thấy; nếu nhỏ hơn thì chỉ cần tìm nửa trước, nếu lớn hơn thì chỉ cần tìm nửa sau.
Hai nửa mới không gồm phần tử giữa vừa xét. Nhờ thứ tự tăng dần, ta biết những phần tử ở phía bị bỏ không thể là giá trị cần tìm. Không dùng cách loại một nửa như vậy trên dãy chưa sắp xếp: có thể bỏ nhầm phần tử cần tìm.
Giữ nguyên vị trí đánh số theo dãy ban đầu. Sau khi thu hẹp, không đánh lại từ 1 cho phần còn lại, vì đầu ra cần chỉ đúng vị trí trong toàn dãy.
Bài luyện
Muốn thực hiện tìm kiếm nhị phân theo quy tắc của bài này, danh sách phải đáp ứng điều kiện nào?
Chín phần tử chỉ là kích thước của ví dụ.
Không có yêu cầu mọi số đều chẵn.
Thứ tự tăng dần là căn cứ để loại một nửa.
Giá trị có thể ở vị trí khác hoặc không có trong dãy.
Lời giải
Quy tắc nhỏ hơn thì tìm nửa trước, lớn hơn thì tìm nửa sau dựa trên thứ tự tăng dần. Không có thứ tự này thì cách thu hẹp không bảo đảm đúng.
Xác định phần tử giữa và vùng mới
Ban đầu vùng tìm kiếm là toàn bộ dãy. Vị trí giữa được tính bằng phần nguyên của (vị trí đầu + vị trí cuối)/2. Vì các vị trí là số dương, chẳng hạn 7.5 lấy phần nguyên là 7.
Vùng từ vị trí 6 đến 9 có giữa là vị trí 7, vì (6+9)/2 = 7.5. Nửa trước gồm vị trí 6; nửa sau gồm vị trí 8 và 9. Vị trí 7 không nằm trong hai nửa mới.
Lặp lại việc xét giữa và chọn nửa thích hợp. Nếu vùng không còn phần tử, thông báo không tìm thấy; không cố đọc một vị trí nằm ngoài dãy.
Bài luyện
Vùng hiện tại từ vị trí 6 đến 9. Theo quy tắc lấy phần nguyên của trung điểm, vị trí giữa là gì?
6 là vị trí đầu của vùng.
(6+9)/2 = 7.5, lấy phần nguyên được 7.
8 là cách chọn vị trí giữa còn lại; khác quy ước đang dùng.
9 là vị trí cuối, không phải giữa theo quy tắc này.
Lời giải
Tổng hai vị trí đầu và cuối là 15; chia 2 được 7.5. Lấy phần nguyên theo quy ước của bài, vị trí giữa là 7.
Ba lần xét để tìm 63
Dãy trong hình có chín số tăng dần; các vị trí được đánh số từ 1. Tìm 63 theo đúng quy tắc vừa học:
1. Vùng 1–9 có giữa 5, giá trị 31. Vì 63 > 31, giữ vùng 6–9.
2. Vùng 6–9 có giữa 7, giá trị 57. Vì 63 > 57, giữ vùng 8–9.
3. Vùng 8–9 có giữa 8, giá trị 63. Tìm thấy và trả vị trí 8.
Mỗi lần xét chỉ một phần tử giữa. Kết quả là tìm thấy 63 sau ba lần xét, không phải đã kiểm trực tiếp từng phần tử bị loại.
Bài luyện
Đang tìm 63, vùng 6–9 có giữa 7 chứa 57. Vùng tiếp theo là gì?
63 lớn hơn 57 nên không tìm nửa trước.
Phải loại vị trí giữa 7 đã xét.
Đây không phải nửa sau của vùng hiện tại.
Giữ đúng nửa sau và bỏ phần tử giữa.
Lời giải
Vì 63 > 57 trong dãy tăng dần, chỉ nửa sau có thể chứa 63. Nửa sau không gồm vị trí giữa 7, nên vùng mới là 8–9.
Tìm một giá trị không có trong dãy
Viết chín số 6, 12, 18, 25, 31, 44, 57, 63, 80 lên thẻ và giữ thứ tự tăng dần. Lập bảng gồm vùng đầu–cuối, vị trí giữa, giá trị giữa và vùng mới. Thử tìm 60:
| Lần xét | Vùng | Giữa | Giá trị | Kết quả |
|---|---|---|---|---|
| 1 | 1–9 | 5 | 31 | Giữ 6–9 |
| 2 | 6–9 | 7 | 57 | Giữ 8–9 |
| 3 | 8–9 | 8 | 63 | Giữ 8–7: vùng rỗng |
Sau lần thứ ba, vị trí đầu lớn hơn vị trí cuối nên không còn phần tử để tìm. Kết luận không tìm thấy 60. Kiểm mỗi vùng mới đã bỏ phần tử giữa; không chỉ thu vùng mà giữ nguyên điểm giữa mãi.
Sắp xếp giúp tìm kiếm nhị phân loại bớt dữ liệu. Tuy nhiên không phải mọi lần tìm đều ít bước hơn tuần tự: với cùng dãy, tìm 6 bằng tuần tự chỉ cần một lần xét, còn nhị phân cần ba. Việc so sánh này chỉ đếm các lần tìm, chưa tính công sắp xếp dãy ban đầu.
Bài luyện
Trong ví dụ tìm 60, sau khi xét 63 ở vị trí 8, vùng mới có đầu 8 và cuối 7. Cần làm gì?
Đầu lớn hơn cuối cho biết không còn phần tử để xét.
Vị trí giữa đã bị loại và vùng không còn phần tử.
Vị trí 8 chứa 63, khác 60.
Thêm dữ liệu làm thay đổi đầu vào của bài toán tìm kiếm.
Lời giải
Vùng 8–7 không chứa vị trí nào. Thuật toán dừng với thông báo không tìm thấy 60 trong dãy ban đầu.
Bài luyện
Với dãy đã cho, tuần tự tìm 6 cần một lần xét còn nhị phân cần ba. Nhận xét nào đúng?
Nhị phân vẫn đúng; số bước không phải lúc nào cũng nhỏ hơn tuần tự.
Tuần tự dùng được cả dãy đã và chưa sắp xếp.
Cần đọc điều kiện và dữ liệu cụ thể khi so sánh số bước.
Không bỏ dữ liệu đầu dãy trước khi bắt đầu.
Lời giải
Thứ tự giúp tìm nhị phân thu hẹp vùng, nhưng tuần tự có lợi khi gặp ngay phần tử đầu. Không suy từ một ví dụ thành khẳng định nhị phân luôn ít bước hơn.
Đang học