--- aliases: tags: - maturity/🌱 date: 2024-04-07 zero-link: - "[[../../meta/zero/00 Алгоритм|00 Алгоритм]]" - "[[../../meta/zero/00 Π‘Π½ΠΈΠΏΠ΅Ρ‚Ρ‹ для Java|00 Π‘Π½ΠΈΠΏΠ΅Ρ‚Ρ‹ для Java]]" parents: - "[[../algorithm/Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск|Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск]]" linked: link: https://struchkov.dev/blog/ru/java-binary-search/ --- ## Π‘Π΅Π· рСкурсии ```java public class Binary { public static void main(String[] args) { int[] values = {1, 1, 2, 3, 4, 10}; int valueToFind = 3; System.out.printf("Index = %d%n", binarySearch(values, valueToFind, 0, values.length - 1)); } private static int binarySearch(int[] sortedArray, int valueToFind, int low, int high) { int index = -1; while (low <= high) { int mid = low + (high - low) / 2; if (sortedArray[mid] < valueToFind) { low = mid + 1; } else if (sortedArray[mid] > valueToFind) { high = mid - 1; } else if (sortedArray[mid] == valueToFind) { index = mid; break; } } return index; } } ``` ## Π‘ использованиСм рСкурсии ```java public class Binary { public static void main(String[] args) { int[] values = {1, 1, 2, 3, 4, 10}; int valueToFind = 3; System.out.printf("Index = %d%n", binarySearch(values, valueToFind, 0, values.length - 1)); } private static int binarySearch(int[] values, int valueToFind, int l, int r) { if (l == r) { return (values[l] == valueToFind) ? l : -1; } int m = l + (r - l) / 2; if (valueToFind > values[m]) { return binarySearch(values, valueToFind, m + 1, r); } else if (values[m] > valueToFind) { return binarySearch(values, valueToFind, l, m - 1); } return m; } } ``` Если элСмСнт Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½, Ρ‚ΠΎ вСрнСтся `-1`. > [!WARNING] m = l + (r - l) / 2; > Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ запись `int m = (l + r) / 2;`, вмСсто `int mid = l + (r - l) / 2;`. И Ρƒ мСня Π² Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ΅ Ρ‚ΠΎΠΆΠ΅ Π±Ρ‹Π»Π° такая запись, ΠΏΠΎΠΊΠ° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ» Π½Π° это Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. > > Но использованиС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° являСтся Π»ΡƒΡ‡ΡˆΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ пСрСполнСния, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ массива Π²Π΅Π»ΠΈΠΊ. > > НапримСр, Ссли `l = 2147483647`Β ΠΈΒ `r = 2147483647`, сумма `l`Β ΠΈΒ `r`Β Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½Π° 4294967294, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΒ `int`, вызывая ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. > > Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅Β `mid = l + (r - l) / 2;` это Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈ оТидалось, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ сдСлано ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, поэтому Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ, Π° слоТСниС Π²Π΅Ρ€Π½Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β `l`.