Как мне вернуть индекс того, куда должно идти число, если оно не найдено в бинарном поиске в JAVA?

1

Таким образом, у меня есть двоичный код поиска, который находит, где номер должен быть размещен для поддержания упорядоченного порядка. Я занимаюсь этим чуть более полутора часов, пытаясь понять это, поэтому я мог бы использовать толчок.

Какое значение я верну в конце метода, если значение не найдено в массиве, но место, в которое оно должно быть помещено, найдено? В основном значение, указывающее, что индекс, в котором находится этот номер, находится в пределах + / - 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 _____;        
}   
  • 0
    Подумайте об этом так: если значение поиска выше, чем последняя середина, которую вы найдете, это будет середина +1, верно? А если его нижняя не должна быть в середине -1?
Теги:
arrays
binary-search

3 ответа

4
Лучший ответ

Большинство методов возвращают побитовое отрицание индекса, куда поместить элемент, таким образом ~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 отрицательным).

онлайн демо JDoodle.

  • 0
    Это приводит к -1 . Таким образом, вы можете сначала проверить, если оно меньше 0 и если так, снова использовать побитовое отрицание, чтобы вычислить позицию вставки, равную 0 .
1

См. Arrays.binarySearch.

return -low - 1;

Отрицательное число, самое большее -1. Так как mid (точка ввода) находится в диапазоне от 0.

возвращается

индекс ключа поиска, если он содержится в массиве; в противном случае (- (точка ввода) - 1). Точка вставки определяется как точка, в которой ключ будет вставляться в массив: индекс первого элемента больше ключа или a.length, если все элементы в массиве меньше указанного ключа. Обратите внимание, что это гарантирует, что возвращаемое значение будет> = 0 тогда и только тогда, когда ключ найден.

  • 0
    С этим я получаю ошибку, которая говорит мне, что mid никогда не инициализировался, что имеет смысл, потому что mid инициализируется только в цикле while, как бы я справился с этим?
  • 0
    @NoivernEvo: вы должны инициализировать mid до в while цикла. Например, с (lo+hi)>>1 .
Показать ещё 3 комментария
-1

Фактический код - это return -1. Но я смутил ваше описание. Что такое "если значение не найдено в массиве, но место, в которое оно должно быть установлено, найдено?" имея в виду? Значение находится либо в массиве, либо нет. Он не найден раньше, while это значит, что он не находится в массиве, поэтому вы должны return -1.

  • 0
    Двоичный поиск обычно возвращает отрицательное значение индекса, в котором следует разместить значение.
  • 0
    Друг, который задал вопрос, написал неверный код с mid , я проигнорировал его код. Но в двоичном поиске return -1 - это здравый смысл, оооо, что вы хотите получить, если метод не находит значение в массиве?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню