Вы не дали нам достаточно информации, чтобы точно знать как у вас возникли проблемы, но я собираюсь догадаться, что вы сделали что-то вроде этого:
double[] a = ... // create and initialize
int i = ... // a valid subscript for
int result = binarySearch(a, (int)(a[i]));
// result is -1
Вот почему это не работает
- Когда вы приводите значение с плавающей запятой к целочисленному типу, вы можете потерять точность; то есть
1.5
становится 1
, и вы потеряли 0.5
. - Когда вы сравниваете тип с плавающей запятой и целочисленный тип, используя
==
, <
, >
и т. д., интегральное значение преобразуется в ближайшее значение в типе с плавающей запятой ... перед сравнением чисел. Это преобразование также может потерять точность.
Итак, когда мы посмотрим, что делает ваш код, вы возьмете double
в вашем массиве a
, приведя его к int
так что вы можете использовать его как key
... и затем преобразовывать key
обратно в double
каждый раз, когда binarySearch
выполняет сравнение.
double -> int -> double.
Причина, по которой вы видите глюки, заключается в том, что что начальный double
и конечный double
не совпадают с a[i]
, который вы ищете. Так что ==
дает вам false
, когда вы хотите, чтобы оно было true
.
Решение состоит в том, чтобы изменить тип key
, чтобы он совпадал с базовым типом массива, который вы используете. в поиске. Так что нет необходимости приводить или преобразовывать значения.
Улилоп поднимает еще один важный момент в своем ответе. Даже если мы исключим преобразования, которые я описал выше, компьютерные числа с плавающей запятой и арифметически с плавающей запятой принципиально неточны. Например:
double one_third = 1.0 / 3.0;
double one = one_third * 3.0;
System.printf(one == 1.0); // prints "false" !!!!
Поэтому, когда вы делаете что-либо, связанное со сравнением значений с плавающей запятой, вы должны учитывать возможность округления ошибок в вычислениях.
Подробнее об этом topi c, прочитайте их:
НАКОНЕЦ вы предоставили нам свой реальный код.
Причина, по которой ваш реальный код дает вам неправильный ответ, заключается в том, что что вы выполняете двоичный поиск в массиве, который не упорядочен. Бинарный поиск работает только в том случае, если искомый массив упорядочен. Как Википедия заявляет:
"В информатике бинарный поиск, также известный как полуинтервальный поиск, логарифмический поиск c или бинарная отбивная, является Алгоритм поиска, который находит позицию целевого значения в отсортированном массиве . "