Tìm kiếm · Chia đôi
Binary Search — Tìm kiếm nhị phân
Tìm kiếm trên mảng đã sắp xếp bằng cách chia đôi không gian tìm kiếm sau mỗi bước — hiệu quả gấp hàng chục lần Linear Search.
Ý tưởng
Thay vì kiểm tra từng phần tử như Linear Search, Binary Search chia đôi
mảng mỗi bước: so sánh target với phần tử giữa (mid).
Nếu target nhỏ hơn → tìm nửa trái; lớn hơn → tìm nửa phải; bằng → tìm thấy!
💡
Ví dụ trực quan: Mảng 1.000 phần tử — Linear Search cần tối đa 1.000 bước,
Binary Search chỉ cần tối đa 10 bước (log₂ 1000 ≈ 10).
Thuật toán (lặp)
- Đặt
lo = 0,hi = n - 1 - Trong khi
lo ≤ hi: tínhmid = (lo + hi) / 2 - Nếu
a[mid] == target→ trả vềmid - Nếu
a[mid] < target→lo = mid + 1 - Nếu
a[mid] > target→hi = mid - 1 - Nếu thoát vòng lặp → không tìm thấy, trả về
-1
Cài đặt bằng C
binary_search.c
#include <stdio.h> /** * Binary Search trên mảng đã sắp xếp tăng dần * Trả về chỉ số của target, hoặc -1 nếu không tìm thấy */ int binarySearch(int a[], int n, int target) { int lo = 0, hi = n - 1; while (lo <= hi) { int mid = lo + (hi - lo) / 2; // Tránh tràn số (overflow) if (a[mid] == target) return mid; // Tìm thấy! else if (a[mid] < target) lo = mid + 1; // Tìm nửa phải else hi = mid - 1; // Tìm nửa trái } return -1; // Không tìm thấy } int main() { int a[] = {2, 5, 8, 12, 16, 23, 38, 56, 72, 91}; int n = sizeof(a) / sizeof(a[0]); int target = 23; int idx = binarySearch(a, n, target); if (idx != -1) printf("Tìm thấy %d tại chỉ số %d\n", target, idx); else printf("Không tìm thấy %d\n", target); return 0; }
✅
Lưu ý quan trọng: Dùng
mid = lo + (hi - lo) / 2 thay vì
(lo + hi) / 2 để tránh tràn số nguyên khi lo + hi vượt quá INT_MAX.
Demo tương tác
🔍 Minh họa Binary Search
Mảng (đã sort):
Tìm giá trị:
Nhập mảng đã sắp xếp và giá trị cần tìm, nhấn Tìm kiếm
Phân tích độ phức tạp
| Trường hợp | Thời gian | Không gian | Ghi chú |
|---|---|---|---|
| Tốt nhất | O(1) | O(1) | Phần tử nằm đúng giữa |
| Trung bình | O(log n) | O(1) | Cần chia đôi log₂n lần |
| Tệ nhất | O(log n) | O(1) | Phần tử không tồn tại |
So sánh Linear vs Binary Search
| Kích thước n | Linear Search | Binary Search |
|---|---|---|
| 10 | 10 bước | 4 bước |
| 100 | 100 bước | 7 bước |
| 1.000 | 1.000 bước | 10 bước |
| 1.000.000 | 1.000.000 bước | 20 bước |