Изменения

Перейти к: навигация, поиск

Целочисленный двоичный поиск

2146 байт добавлено, 22:44, 15 июня 2014
Нет описания правки
== Алгоритм двоичного поиска ==
[[Файл:shcemebinsearch.png|350px|thumb|right|Схема бин. бинарного поиска]]
Идея поиска заключается в том, чтобы брать элемент посередине, между границами, и сравнивать его с искомым.
В случае равенства возвращать его, а если Если искомое больше(в случае правостороннего {{---}} не меньше), чем элемент сравнения,то сужаем область поиска так, чтобы новая левая граница была равна индексу середины предыдущей области. В противном случае присваиваем это значение правой границе. Проделываем эту процедуру до тех пор, пока правая граница больше левой более чем на <tex>1</tex>. В случае правостороннего бинарного поиска ответом будет индекс <tex>l</tex>, или же пока мы не найдём искомый индекса в случае левостороннего {{---}} <tex>r</tex>.
== Код ==
Инвариант цикла: пусть левый индекс не больше искомого элемента, а правый {{---}} строго больше, тогда если <tex>l = r - 1</tex>, то понятно, что <tex>l</tex> {{---}} самое правое вхождение (так как следующее уже больше).
 
== Несколько слов об эвристиках ==
 
'''Эвристика с завершением поиска, при досрочном нахождении искомого элемента'''
 
Заметим, что если нам необходимо просто проверить наличие элемента в упорядоченном множестве, то можно использовать любой из правостороннего и левостороннего поиска.
При этом давайте будем на каждой итерации проверять "не попали ли мы в элемент, равный искомому", и в случае попадания заканчивать поиск.
 
'''Эвристика с запоминанием ответа на предыдущий запрос'''
 
Пусть дан отсортированный массив чисел, упорядоченных по неубыванию.
Также пусть запросы приходят в таком порядке, что каждый следующий не меньше, чем предыдущий.
Для ответа на запрос будем использовать левосторонний двоичный поиск.
При этом после того как обработался первый запрос, запомним чему равно <tex>l</tex>, запишем его в переменную <tex>start\_l</tex>.
Когда будем обрабатывать следующий запрос, то проинициализируем левую границу как <tex>start\_l</tex>.
Заметим, что все элементы, которые лежат не правее <tex>start\_l</tex>, строго меньше текущего искомого элемента, так как они меньше предыдущего запроса, а значит и меньше текущего. Значит инвариант цикла выполнен.
== См. также ==
10
правок

Навигация