Бинарный поиск на Java.md
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Struchkov Mark 2024-09-08 22:28:18 +03:00
parent 513ea8e541
commit 63602c5647
No known key found for this signature in database
GPG Key ID: A3F0AC3F0FA52F3C

View File

@ -75,11 +75,11 @@ public class Binary {
Если элемент не найден, то вернется `-1`. Если элемент не найден, то вернется `-1`.
> [!WARNING] m = l + (r - l) / 2; > [!WARNING] m = l + (r - l) / 2;
> Во многих примерах в интернете можно встретить запись `int m = (l + r) / 2;`, вместо `int mid = l + (r - l) / 2;`. И у меня в заметке тоже была такая запись, пока один из читателей не обратил на это внимание. > Во многих примерах в интернете можно встретить запись `int m = (l + r) / 2;`, вместо `int mid = l + (r - l) / 2;`.
> >
> Но использование второго варианта является лучшей практикой, так как это помогает избежать переполнения, когда размер массива велик. > Но использование второго варианта является лучшей практикой, так как это помогает избежать переполнения, когда размер массива велик.
> >
> Например, если `l = 2147483647` и `r = 2147483647`, сумма `l` и `r` будет равна 4294967294, что превышает максимальное значение, которое может удерживать `int`, вызывая переполнение. > Например, если `l = 2147483647` и `r = 2147483647`, сумма `l` и `r` будет равна 4294967294, что превышает максимальное значение, которое может хранить `int`, вызывая переполнение.
> >
> С другой стороны, если вы используете `mid = l + (r - l) / 2;` это будет работать, как и ожидалось, потому что вычитание будет сделано первым, а результат будет равен нулю, поэтому деление будет равно нулю, а сложение вернет значение `l`. > С другой стороны, если вы используете `mid = l + (r - l) / 2;` это будет работать, как и ожидалось, потому что вычитание будет сделано первым, а результат будет равен нулю, поэтому деление будет равно нулю, а сложение вернет значение `l`.