Tìm Kiếm Nhị Phân (Binary Search)
Bạn sẽ học được gì
Cách tìm một phần tử trong mảng đã sắp xếp với độ phức tạp O(log n) thay vì O(n), và — quan trọng hơn — nhận ra khi nào một bài toán có thể giải bằng tìm kiếm nhị phân.
1. Trực quan: tại sao lại "nhị phân"?
Tưởng tượng bạn tra một từ trong từ điển 1000 trang. Bạn không lật từng trang. Bạn mở giữa, thấy từ cần tìm nằm trước hay sau, rồi bỏ đi một nửa. Lặp lại — mỗi bước loại bỏ một nửa số trang còn lại. Đó chính là tìm kiếm nhị phân.
Bấm Play để xem từng bước thu hẹp khoảng [L, R]:
🎬 Trực quan hóa:
binary_search(arr, 11) · Bước 1/21
L
3
5
7
M
9
11
13
R
arr[3] = 7 < mục tiêu → bỏ nửa trái, left = 4
Component này do dự án tự xây theo mô hình Algorithm Visualizer (license MIT).
2. Khái niệm & nguyên lý
Điều kiện tiên quyết: mảng phải đã được sắp xếp.
Ta duy trì khoảng [left, right]. Mỗi bước:
- Tính
mid = left + (right - left) // 2(tránh tràn số). - So sánh
arr[mid]vớitarget:- Bằng → tìm thấy.
arr[mid] < target→left = mid + 1(tìm nửa phải).arr[mid] > target→right = mid - 1(tìm nửa trái).
- Lặp đến khi
left > right→ không tìm thấy.
Ba lỗi kinh điển
- Quên mảng phải sắp xếp.
- Vòng lặp vô hạn — quên
+1/-1khi cập nhật biên. - Tràn số — dùng
(left + right) // 2với mảng cực lớn.
3. Code mẫu (chạy trực tiếp)
- Python
- C++
- Java
Đang tải trình chạy code…
int binarySearch(const vector<int>& arr, int target) {
int left = 0, right = (int)arr.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
int binarySearch(int[] arr, int target) {
int left = 0, right = arr.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
🎬 Trực quan hóa tương tác — VisuAlgo
Nhập mảng và target tùy ý, theo dõi L/R/mid thu hẹp từng bước. Thử target không tồn tại để xem khi nào L > R.
Nguồn: visualgo.net — Steven Halim, NUS. Dùng cho lớp học; ảnh chụp/video cần ghi nguồn URL.
4. Độ phức tạp
| Độ phức tạp | Giải thích | |
|---|---|---|
| Thời gian | O(log n) | Mỗi bước loại bỏ một nửa → tối đa log₂(n) bước |
| Bộ nhớ | O(1) | Bản lặp chỉ dùng vài biến |
Với mảng 1 tỷ phần tử, binary search chỉ cần ~30 bước (2³⁰ ≈ 10⁹).