количество сравнений бинарного поиска

Каково общее количество сравнений, необходимых для поиска всех n отсортированных различных целых чисел в массиве с помощью двоичного поиска? Я думаю, что число равно n log2 n (2 — основание), но я не уверен. Что вы думаете?


person alan    schedule 07.04.2010    source источник


Ответы (5)


Если вам нужен точный ответ, то это явно не N log(N) или N log2(N). Для большинства целых чисел N значения logN и log2 не являются рациональными, но количество сравнений должно быть целым числом.

Кроме того, точный ответ будет зависеть от деталей реализации алгоритма бинарного поиска. Например, если «сравнение» — это простое отношение, которое возвращает истину и ложь, требуется больше сравнений, чем когда «сравнение» возвращает отрицательное значение, ноль или положительное значение. (В последнем случае вы можете закоротить, когда алгоритм рано нажмет на клавишу.)

person Stephen C    schedule 07.04.2010

Требуется log2 n, чтобы найти каждый, и это нужно сделать n раза, так что n log n получается.

person Ignacio Vazquez-Abrams    schedule 07.04.2010

Я бы сказал, что это занимает n log m

Где m — размер массива, поэтому log m найти значение. Затем вы делаете это n раза для n различных целых чисел.

Всего n log m.

person dafmetal    schedule 07.04.2010
comment
подробнее о моем вопросе: алгоритм поиска: int left = 0,right = array.length()-1; while(left‹=right){ int middle = (left+right)/2; если (массив [середина] == ключ) { вернуть true; }else if(array[middle]‹key){ left=middle+1; }else{ справа = средний-1; } } вернуть ложь; еще одно предположение: нам не разрешено повторно использовать результаты других поисков; мы можем только выполнять каждый поиск отдельно. мой ответ должен быть потолком (nlong2n) (2 - это база). - person alan; 07.04.2010
comment
Я неправильно понял ваш вопрос, я думал, что заранее известно, сколько различных целых чисел нужно найти (= n) в отсортированном массиве произвольной длины (= m). Виноват. - person dafmetal; 07.04.2010
comment
Спасибо за ваши комментарии, теперь я ясно. Я думаю, что то, что сказал Стивен С, правда. Я думаю, что мы не можем выработать формулу для этого вопроса, если у нас нет точного значения. Однако, если n=2^n-1, например 511(2^9-1), это легко вычислить. Для 511 общее количество сравнений = 1x1 + 2X2 + 3X4 + 4X8 + ​​5X16 + 6X32 + 7X64 + 8X128 + 9X256 = 4097. - person alan; 07.04.2010

Будет не более (2 * log2n + 1) округленных вниз (таким образом, 7,6 => 7) сравнений для 1 числа.

Когда мы находим какое-то число в массиве, сначала мы проверяем, является ли оно тем, которое мы ищем. (== первое сравнение). После этого проверяем, меньше (или больше) (второе сравнение).

Чтобы найти число, мы должны обработать не более log2n чисел.

И мы должны сделать последнее сравнение с последним числом, чтобы убедиться, что это именно оно.

Таким образом, поиск 16 в [1..16] потребует 2*log216 + 1 = 9 сравнений (при условии, что мы попадаем на эти числа: 8, 12, 14, 15, 16). И поиск 10 в [1..10] займет 2 * log210 + 1 = 7,6 => 7 (предполагая, что мы попадаем на эти числа: 5, 8, 9, 10).

Таким образом, для n чисел их будет не более чем в n раз больше.

person Draco Ater    schedule 07.04.2010

Спасибо за ваши комментарии, теперь я ясно. Я думаю, что то, что сказал Стивен С, правда. Я думаю, что мы не можем выработать формулу для этого вопроса, если у нас нет точного значения. Однако, если n=2^n-1, например 511(2^9-1), это легко вычислить. Для 511 общее количество сравнений = 1x1 + 2X2 + 3X4 + 4X8 + ​​5X16 + 6X32 + 7X64 + 8X128 + 9X256 = 4097.

person alan    schedule 07.04.2010