Хитрость с эффективными двоичными поисками заключается в том, что вы проверяете самый первый и самый последний элемент в массиве первым.
Очевидно, что если искомое значение находится за пределами, нет необходимости выполнять бинарный поиск; и если какой-либо конец совпадет, вы его нашли.
Однако тогда это означает, что границы для двоичного поиска являются исключительными . Когда вы вычисляете индекс для следующего проверяемого элемента, если он соответствует одной из границ, вы знаете, что совпадения нет.
В псевдокоде это означает, что мы можем записать двоичный поиск, предполагая отсортированный массив со значениями в возрастающих значениях и индексацию, начинающуюся с 0, как в C, как
Function BinarySearch(array[], length, value):
If (length < 1):
# Empty array.
Return NotFound
End If
If (value < array[0]):
# Value is smaller than those in the array.
Return NotFound
Else If (value == array[0]):
Return Found at index 0
End If
If (value > array[length - 1]):
# Value is greater than those in the array.
Return NotFound
Else If (value == array[length - 1]):
Return Found at index length - 1
End If
Let iMin = 0
Let iMax = length - 1
Loop:
Let i = (iMin + iMax) / 2 # Integer division, rounds towards zero
If (i == iMin):
Return NotFound
End If
If (array[i] < value):
iMin = i
Else If (array[i] > value):
iMax = i
Else:
Return Found at index i
End If
End Loop
End Function
Когда используется целочисленное деление, а iMin
и iMax
неотрицательны (положительные или нулевые), i = (iMin + iMax)/2
округляется до нуля, и i == iMin
происходит первым, поэтому нам не нужно явно проверять i == iMax
. (То есть i == iMax
происходит в этом случае только тогда, когда i == iMin
, так что нет необходимости проверять.)
В цикле, когда мы обновляем iMin
или iMax
, мы уже рассмотрели array[iMin]
или array[iMax]
соответственно. iMin
относится к индексу, который имеет меньшее значение, чем тот, который мы ищем, а iMax
к индексу, который имеет большее значение, чем тот, который мы ищем. Итак, мы по существу рассматриваем только элементы массива с индексами больше, чем iMin
, но меньше, чем iMax
; исключая индексы iMin
и iMax
.