Таким образом, у меня есть двоичный код поиска, который находит, где номер должен быть размещен для поддержания упорядоченного порядка. Я занимаюсь этим чуть более полутора часов, пытаясь понять это, поэтому я мог бы использовать толчок.
Какое значение я верну в конце метода, если значение не найдено в массиве, но место, в которое оно должно быть помещено, найдено? В основном значение, указывающее, что индекс, в котором находится этот номер, находится в пределах + / - 1 среднего значения.
Вот двоичный поиск, я не хочу его менять, а просто ищу, чтобы переменная возвращалась туда, где находится _____.
private static int bsearch( int[] arr, int count, int key )
{
if (count==0) return -1;
int lo = 0, hi = count - 1, mid;
while(hi >= lo)
{
mid = (lo + hi) / 2;
if(arr[mid] == key) return mid;
if ( key < arr[mid] ) hi = mid-1;
else lo = mid+1;
}
return _____;
}
Большинство методов возвращают побитовое отрицание индекса, куда поместить элемент, таким образом ~idx
.
Двоичный поиск делает предположение, что все элементы до lo
меньше key
и аналога для hi
.
В случае hi < lo
, это означает, что hi
было установлено в mid-1
а mid
была равна lo
(потому что hi
и lo
отличаются не более одного) или аналогом с lo
. Таким образом, место, где должен быть размещен элемент находится в lo
. Таким образом, возвращается:
return ~lo;
Оптимизированная версия алгоритма:
private static int bsearch( int[] arr, int count, int key) {
if (count==0) return -1;
int lo = 0, hi = count - 1, mid = hi>>1;
while(hi >= lo) {
mid = (lo + hi) >> 1;
if ( key < arr[mid] ) hi = mid-1;
else if ( key > arr[mid] ) lo = mid+1;
else return mid;
}
return ~lo;
}
Как тест:
for(int i = 0; i <= 22; i++) {
int r = bsearch(new int[] {2,3,7,9,11,15,21},7,i);
System.out.println(""+i+" -> "+r+" "+(~r));
}
дает:
0 -> -1 0
1 -> -1 0
2 -> 0 -1
3 -> 1 -2
4 -> -3 2
5 -> -3 2
6 -> -3 2
7 -> 2 -3
8 -> -4 3
9 -> 3 -4
10 -> -5 4
11 -> 4 -5
12 -> -6 5
13 -> -6 5
14 -> -6 5
15 -> 5 -6
16 -> -7 6
17 -> -7 6
18 -> -7 6
19 -> -7 6
20 -> -7 6
21 -> 6 -7
22 -> -8 7
x → ij
с i
результатом и j
поразрядным отрицательным (используется как индекс вставки в случае i
отрицательным).
-1
. Таким образом, вы можете сначала проверить, если оно меньше 0
и если так, снова использовать побитовое отрицание, чтобы вычислить позицию вставки, равную 0
.
См. Arrays.binarySearch.
return -low - 1;
Отрицательное число, самое большее -1. Так как mid
(точка ввода) находится в диапазоне от 0.
возвращается
индекс ключа поиска, если он содержится в массиве; в противном случае (- (точка ввода) - 1). Точка вставки определяется как точка, в которой ключ будет вставляться в массив: индекс первого элемента больше ключа или a.length, если все элементы в массиве меньше указанного ключа. Обратите внимание, что это гарантирует, что возвращаемое значение будет> = 0 тогда и только тогда, когда ключ найден.
mid
до в while
цикла. Например, с (lo+hi)>>1
.
Фактический код - это return -1
. Но я смутил ваше описание. Что такое "если значение не найдено в массиве, но место, в которое оно должно быть установлено, найдено?" имея в виду? Значение находится либо в массиве, либо нет. Он не найден раньше, while
это значит, что он не находится в массиве, поэтому вы должны return -1
.
mid
, я проигнорировал его код. Но в двоичном поиске return -1
- это здравый смысл, оооо, что вы хотите получить, если метод не находит значение в массиве?