Tôi đã đọc một cuốn sách thuật toán trong đó có thuật toán sau đây để tìm kiếm nhị phân:Tính trung trong tìm kiếm nhị phân
public class BinSearch {
static int search (int [ ] A, int K) {
int l = 0 ;
int u = A. length −1;
int m;
while (l <= u) {
m = (l+u) /2;
if (A[m] < K) {
l = m + 1 ;
} else if (A[m] == K) {
return m;
} else {
u = m−1;
}
}
return −1;
}
}
Tác giả nói "Lỗi này là ở sự phân công m = (l+u)/2;
nó có thể dẫn đến tràn và nên được thay thế bởi m = l + (u-l)/2
. "
Tôi không thể thấy điều đó có thể gây tràn. Khi tôi chạy thuật toán trong tâm trí của tôi cho một vài đầu vào khác nhau, tôi không thấy giá trị của giữa đi ra khỏi chỉ mục mảng.
Vì vậy, trong trường hợp nào xảy ra tràn?
cộng, trừ, nhân 2 số tất cả tạo ra nhiều bit hơn, do đó rõ ràng là có khả năng tràn –
Có thể trùng lặp [tính toán giá trị trung bình tìm kiếm nhị phân] (http://stackoverflow.com/questions/4534342/binary-search- tính toán giá trị trung bình) –