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

Tìm kiếm nhị phân theo chia để trị

Lưu trên thiết bị này
Chuyên đề lựa chọn CS: Chia để trị · Chọn bài khác

Loại phần không còn phù hợp

A đã sắp xếp **không giảm**. Hàm tìm K trong đoạn chỉ số [left,right], gồm cả hai đầu. Khi có phần tử, lấy mid ở giữa; nếu A[mid]==K thì trả mid. Nếu A[mid]<K, chỉ tìm bên phải; nếu A[mid]>K, chỉ tìm bên trái. Chia: tách miền qua phần tử giữa. Trị: giải nhánh còn có khả năng chứa K. Kết hợp: trả kết quả của nhánh ấy về nơi gọi. Do tính chất dãy đã sắp xếp, không cần giải cả hai nhánh rồi ghép hai kết quả.

Cơ sở được kiểm trước khi đọc phần tử

```python def binarySearch(A, left, right, K): if left > right: return -1 mid = (left + right) // 2 if A[mid] == K: return mid if A[mid] < K: return binarySearch(A, mid + 1, right, K) return binarySearch(A, left, mid - 1, K) ``` Gọi đầu với left=0, right=len(A)−1. Miền rỗng trả −1. Khi left==right, vẫn phải đọc và so sánh phần tử duy nhất; nếu khác K thì lời gọi tiếp tạo miền rỗng. Nếu nhiều phần tử bằng K, hàm chỉ cần trả một chỉ số phù hợp, không hứa trả vị trí đầu tiên.

So sánh giá trị, không so sánh chỉ số với K

Với A=[100,200,300] và K=100, lần đầu mid=1 nhưng A[mid]=200. Vì 200>100, chọn miền [0,0]; phần tử duy nhất bằng K nên trả 0. Không dùng mid<K để quyết định nhánh: chỉ số 1 và giá trị 100 là hai đại lượng khác nhau. Return trước lời gọi nhỏ chuyển chỉ số tìm được về lời gọi ban đầu. Bản dùng vòng lặp cũng có thể liên tục cập nhật left/right theo cùng cách chia miền; cách viết không đệ quy vẫn giữ ý tưởng chia để trị của thuật toán.

Bài luyện

Với A=[100,200,300], K=100, ở lần đầu cần dùng phép so sánh nào để chọn nhánh?
Chọn một đáp án

Bài luyện

Tìm K=5 trên A=[7] bằng hàm trong bài. Điều gì xảy ra?
Chọn một đáp án

Bài luyện

Trong cách giải này, bước kết hợp được thực hiện như thế nào?
Chọn một đáp án

Bài luyện

Viết tìm kiếm nhị phân bằng vòng lặp, vẫn chia miền và chỉ giữ nửa phù hợp. Nhận xét nào đúng?
Chọn một đáp án

Đang học