При написании кода сегодня я столкнулся с обстоятельством, которое заставило меня написать двоичный поиск такого рода, которого я никогда раньше не видел. Есть ли у этого двоичного поиска имя и действительно ли это «двоичный» поиск?
Прежде всего, чтобы упростить понимание поиска, я объясню вариант использования, который породил его создание.
Допустим, у вас есть список упорядоченных номеров. Вам будет предложено найти в списке индекс числа, ближайшего к x.
int findIndexClosestTo(int x);
Вызовы findIndexClosestTo ()
always следуют этому правилу:
Если последний результат
findIndexClosestTo ()
былоi
, тогда индексы, близкие кi
, имеют большую вероятность быть результатом текущего вызоваfindIndexClosestTo ()
.
Другими словами, индекс, который нам нужно найти на этот раз, с большей вероятностью будет ближе к последнему найденному нами, чем дальше от него.
Для примера представьте себе симулированного мальчика, который ходит влево и вправо. экран. Если мы часто запрашиваем индекс местоположения мальчика, вероятно, он где-то рядом с последним местом, где мы его нашли.
В приведенном выше случае нам известен последний результат findIndexClosestTo ()
было i
(если это фактически первый раз, когда функция вызывается, i
по умолчанию используется средний индекс списка, для простоты, хотя отдельный двоичный поиск найти результат первого вызова будет быстрее), и функция была вызвана снова. Учитывая новое число x
, мы следуем этому алгоритму, чтобы найти его индекс:
interval = 1;
x
, расположено в и
? Если да, верните i
; x
выше или ниже i
. (Помните, что список отсортирован.) интервал
индексов в направлении x
. x
в нашем новом местоположение, верните это местоположение. интервал
. (например, interval * = 2
) x
, вернемся назад интервал
индексов, установите interval = 1
, перейти к 4. Учитывая правило вероятности, указанное выше (под заголовком «Мотивация»), мне кажется, что это наиболее эффективный способ найти правильный индекс. Вы знаете более быстрый способ?