Thuật toán & Cấu trúc dữ liệu/CTDL & Tìm kiếm/Binary Search — Tìm kiếm nhị phân
1/3
~18 phútCTDL & Tìm kiếm

Binary Search — Tìm kiếm nhị phân

Binary search cơ bản và các biến thể: lower bound, upper bound, search on answer.

Binary Search cơ bản

Điều kiện: mảng đã sort.

public int binarySearch(int[] arr, int target) {
    int left = 0, right = arr.length - 1;

    while (left <= right) {
        int mid = left + (right - left) / 2; // tránh overflow

        if (arr[mid] == target) return mid;
        else if (arr[mid] < target) left = mid + 1;
        else right = mid - 1;
    }

    return -1; // not found
}

Biến thể: Lower Bound

Tìm vị trí đầu tiên >= target:

public int lowerBound(int[] arr, int target) {
    int left = 0, right = arr.length;

    while (left < right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] < target) left = mid + 1;
        else right = mid;
    }

    return left;
}

Search on Answer

Binary search không chỉ dùng trên mảng — dùng trên không gian đáp án:

// Tìm số nguyên nhỏ nhất x sao cho f(x) = true
// f phải monotonic: false false false true true true
public int searchOnAnswer(int lo, int hi) {
    while (lo < hi) {
        int mid = lo + (hi - lo) / 2;
        if (check(mid)) hi = mid;
        else lo = mid + 1;
    }
    return lo;
}

Key insight: Binary search áp dụng được khi có tính chất monotonic — một bên thỏa, một bên không. Không nhất thiết phải là mảng sorted.