Tìm kiếm nhị phân
Tìm kiếm nhị phân (hoặc nhị phân) là thuật toán tìm kiếm hiệu quả và nhanh hơn tìm kiếm tuyến tính. Ví dụ: đối với một mảng gồm 1024 phần tử, tìm kiếm tuyến tính trong trường hợp xấu nhất (khi phần tử mong muốn không có trong mảng) sẽ xử lý tất cả 1024 phần tử, nhưng nó đủ để xử lý 10 phần tử bằng tìm kiếm nhị phân. Kết quả này đạt được là do sau bước đầu tiên của vòng lặp, khu vực tìm kiếm thu hẹp xuống còn 512 phần tử, sau bước thứ hai – lên đến 256, v.v.
Nhược điểm của thuật toán như vậy là yêu cầu sắp xếp thứ tự dữ liệu, cũng như khả năng truy cập bất kỳ phần tử dữ liệu nào trong một khoảng thời gian không đổi (không phụ thuộc vào lượng dữ liệu). Do đó, thuật toán không thể hoạt động trên mảng không có thứ tự.
Thuật toán
- Chọn phần tử ở giữa
A[c]
và so sánh với X
.
- Nếu
X = A[c]
thì tìm thấy (dừng).
- Nếu
X < A[c]
, tìm kiếm thêm trong nửa đầu.
- Nếu
X > A[c]
, hãy xem thêm nửa sau.
Triển khai
L = 0; R=N; // đoạn đầu
trong khi ( L < R - 1)
{
c = (L + R)/2; // tìm thấy giữa
if ( X < A[c] ) // nén đoạn
R=c;
khác
L = c;
}
nếu ( A[L] == X)
cout << "A" << Đ<< "]=" << x;
khác
cout << "Không tìm thấy";
ở đâu:
A
- mảng nguồn,
N
- kích thước mảng,
X
- số đã tìm kiếm,
Có thể triển khai các cách khác.
Ví dụ: sử dụng lối thoát sớm khỏi vòng lặp
L = 0; R = N - 1;
trong khi (R >= L)
{
c = (L + R)/2;
nếu ( X == A[c] )
{
nX = c;
phá vỡ;
}
if (X < A[c]) R = giữa - 1;
if (X > A[c]) L = giữa + 1;
}
nếu ( nX < 0)
cout << "Không tìm thấy";
khác
cout << "A" << nX<< "]=" << X;