Комбинаторные алгоритмы для программистов

          

Бинарный поиск


Когда ячейки таблицы последовательно распределены в памяти с произвольным доступом и имена хранятся в таблице в их естественном порядке, возможен бинарный поиск - один из наиболее широко используемых методов поиска. Идея этого метода состоит в том, чтобы искать имя

Это утверждение очевидно первый раз,
в интервале, крайними точками которого являются два заданных указателя
Это утверждение очевидно первый раз,
(для "низа") и
Это утверждение очевидно первый раз,
(для "верха"). Новый указатель
Это утверждение очевидно первый раз,
(для "средней точки") устанавливается где-то около середины интервала, и либо
Это утверждение очевидно первый раз,
с именем в этой ячейке сводит интервал поиска к одному из интервалов
Это утверждение очевидно первый раз,
или
Это утверждение очевидно первый раз,
. Если интервал становится пустым, поиск завершается безуспешно.

Для получения логарифмического времени поиска существенно устанавливать указатель

Это утверждение очевидно первый раз,
за время, не зависящее от длины интервала; это требование делает непригодным бинарный поиск на большинстве вспомогательных запоминающих устройств. Требование, чтобы
Это утверждение очевидно первый раз,
помещалось точно в середине интервала, несущественно, хотя выбор средней точки в качестве
Это утверждение очевидно первый раз,
обычно дает самый эффективный алгоритм. В некоторых частных случаях полезно разбить интервал на подинтервалы длины
Это утверждение очевидно первый раз,
и
Это утверждение очевидно первый раз,
для фиксированного значения
Это утверждение очевидно первый раз,
, отличного от
Это утверждение очевидно первый раз,
. Когда таблица размещена не последовательно, а хранится в виде списка древовидной структуры, доля
Это утверждение очевидно первый раз,
должна, вероятно, меняться от интервала к интервалу.

Бинарный поиск по идее прост, но с деталями условия завершения поиска нужно обращаться осторожно. Частные случаи

Это утверждение очевидно первый раз,
и
Это утверждение очевидно первый раз,
требуют пристального внимания в любой программе бинарного поиска. В алгоритме 13.4 эти случаи обрабатываются тем же кодом, что и в общем случае, и поучительно посмотреть, как это делается, проследив за выполнением алгоритма для
Это утверждение очевидно первый раз,
и
Это утверждение очевидно первый раз,
.

Это утверждение очевидно первый раз,

Алгоритм 13.4. Бинарный поиск имени
Это утверждение очевидно первый раз,
в таблице
Это утверждение очевидно первый раз,
, хранящейся в естественном порядке.

Корректность алгоритма 13.4 следует из утверждения, данного в комментарии в начале тела цикла. Он устанавливает, что если

Это утверждение очевидно первый раз,

находится где-либо в таблице, то оно должно находиться в интервале

Это утверждение очевидно первый раз,
; иначе говоря, при нашем предположении, что имя появляется в таблице не больше одного раза, утверждается, что
Это утверждение очевидно первый раз,
не встречается ни в интервале
Это утверждение очевидно первый раз,
, ни в интервале
Это утверждение очевидно первый раз,
. Это утверждение очевидно первый раз,


Комбинаторные алгоритмы для программистов

          

Это утверждение очевидно первый раз,


Это утверждение очевидно первый раз, когда мы входим в цикл при
Это утверждение очевидно первый раз,
и
Это утверждение очевидно первый раз,
, и непосредственно по индукции проверяется, что оно выполняется при каждом проходе через цикл. Когда мы выходим из цикла, то должно быть
Это утверждение очевидно первый раз,
, и поэтому утверждение принимает вид
Это утверждение очевидно первый раз,
и
Это утверждение очевидно первый раз,
, откуда следует, что
Это утверждение очевидно первый раз,
.


Содержание раздела





Содержание раздела