Изменения

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

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

95 байт добавлено, 10:10, 16 июня 2014
Нет описания правки
'''Целочисленный двоичный поиск (бинарный поиск) ''' (англ. <i>(англ. binary search)</i>''' ) {{---}} алгоритм поиска объекта по заданному признаку в множестве объектов, упорядоченных по тому же самому признаку, работающий за логарифмическое время.
== Формулировка задачи ==
Для простоты дальнейших определений будем считать, что <tex>a[0] = -\infty</tex> и что <tex>a[n] = +\infty</tex>.
{{Определение|definition='''Правосторонний бинарный поиск ''' (англ. <i>(англ. rightside binary search)</i>''' ) {{---}} бинарный поиск, с помощью которого мы ищем <tex> \max\limits_{i \in [0,n]}(\{i | \mid a[i] \leqslant x) \} </tex>, где <tex>a</tex> {{---}} массив, а <tex>x</tex> {{---}} искомый ключ}}
{{Определение|definition='''Левосторонний бинарный поиск ''' (англ. <i>(англ. leftside binary search)</i>''' ) {{---}} бинарный поиск, с помощью которого мы ищем <tex> \min\limits_{i \in [0,n]}(\{i | \mid a[i] \geqslant x) \} </tex>, где <tex>a</tex> {{---}} массив, а <tex>x</tex> {{---}} искомый ключ}}
Использовав эти два вида двоичного поиска, мы можем найти интервал отрезок позиций <tex>[l,r]</tex> таких, что <tex>\forall i \in [l,r] : a[i] = x</tex> и <tex> \forall i \notin [l,r] : a[i] \neq x </tex>
<b><i>Например:</i></b>
== Код ==
'''int''' binSearch('''Objectint[]''' a, '''Objectint''' key) <font color="green">// l, r - левая и правая границы</font>
'''int''' l = 0
'''int''' r = len(a) + 1
'''while''' l < r - 1 <font color="green">// запускаем цикл</font>
m = (l + r) / 2 <font color="green">// m {{- --}} середина области поиска</font>
'''if''' a[m] < key
l = m
Заметим, что если нам необходимо просто проверить наличие элемента в упорядоченном множестве, то можно использовать любой из правостороннего и левостороннего поиска.
При этом давайте будем на каждой итерации проверять "не попали ли мы в элемент, равный искомому", и в случае попадания заканчивать поиск.
'''Эвристика с запоминанием ответа на предыдущий запрос'''
* [http://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA Википедия - двоичный поиск]
* [http://habrahabr.ru/post/146228/| Интересная статья про типичные ошибки]
* [http://algolist.manual.ru/search/advbin.php|Бинарный поиск на algolist]
[[Категория: Дискретная математика и алгоритмы]]
[[Категория: Алгоритмы поиска]]
10
правок

Навигация