btvn.vn
Tìm kiếm Đăng nhập

Tìm kiếm nhị phân trên dãy tăng

Lưu trên thiết bị này
Kĩ thuật lập trình — CS · Chọn bài khác

Sắp xếp là điều kiện để bỏ nửa dãy

Xét `a = [3, 7, 11, 15, 19, 23, 27]` đã tăng dần và cần tìm 23. Phạm vi ban đầu là chỉ số 0–6. Phần tử giữa ở chỉ số `(0+6)//2=3` có giá trị 15. Vì 23 lớn hơn 15, mọi phần tử ở **bên trái và tại giữa** đều nhỏ hơn 23, nên chỉ cần xét phạm vi 4–6. Giữa phạm vi mới là chỉ số 5, có giá trị 23: tìm thấy sau hai lần so sánh. Nếu dãy chưa sắp xếp, so sánh ở giữa không cho phép bỏ cả một nửa. Chẳng hạn với `[9, 1, 5]`, tìm 9 bằng cách bỏ nửa trái sau khi thấy 1 ở giữa sẽ trả sai dù 9 nằm ở đầu.

Mỗi bước làm phạm vi ngắn hơn

```python def tim_nhi_phan_tang(a, k): left = 0 right = len(a) - 1 while left <= right: mid = (left + right) // 2 if a[mid] == k: return mid if a[mid] < k: left = mid + 1 else: right = mid - 1 return -1 print(tim_nhi_phan_tang([3, 7, 11, 15, 19, 23, 27], 23)) print(tim_nhi_phan_tang([3, 7, 11, 15, 19, 23, 27], 20)) ``` Kết quả là `5` và `-1`. Ở mỗi lần chưa khớp, bỏ luôn `mid` vì đã biết `a[mid]` khác `k`; `left=mid+1` hoặc `right=mid-1` làm phạm vi nhỏ đi. Khi `left>right`, phạm vi rỗng nên không thấy. Với dãy rỗng, `right=-1` và vòng lặp không chạy. Hàm này **chỉ dùng khi dãy đã sắp xếp tăng**; mã không tự kiểm hoặc tự sắp xếp dữ liệu.

Bài luyện

Dãy tăng `[3,7,11,15,19,23,27]`, tìm 23: sau khi xét phần tử giữa 15, phạm vi nào còn cần tìm?
Chọn một đáp án

Bài luyện

Điều kiện nào bắt buộc để dùng đúng hàm `tim_nhi_phan_tang` trong bài?
Chọn một đáp án

Bài luyện

Khi `left > right` trong hàm tìm nhị phân, kết luận nào đúng?
Chọn một đáp án

Đang học