Я читал книгу алгоритмов, в которой был следующий алгоритм двоичного поиска:
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;
}
}
Автор говорит: "Ошибка в назначении m = (l+u)/2;
, это может привести к переполнению и должно быть заменено на m = l + (u-l)/2
."
Я не вижу, как это вызвало бы переполнение. Когда я запускаю алгоритм в своем уме для нескольких разных входов, я не вижу, чтобы значение середины выходило из индекса массива.
Итак, в каких случаях произойдет переполнение?