Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Дроздов С. Методичка. Сортировка и поиск.doc
Скачиваний:
102
Добавлен:
02.05.2014
Размер:
561.66 Кб
Скачать
    1. Бинарный поиск

Теперь предположим, что массив Aявляетсясортированным, т.е. значения в нем расположены по возрастанию значений ключа.

В этом случае можно применить совершенно иной, более быстрый алгоритм поиска, не требующий проверки всех подряд элементов. Вместо этого сравним искомый ключ xсо значением среднего по порядку элемента массива, т.е. элемента с индексом(n+1)/2. Еслиnчетное, то неважно, какой из двух средних элементов будет выбран.

Если xокажется меньше, чем проверяемый средний элемент, то ясно, что искомое значение может содержаться только в левой половине массива (или нигде). И наоборот, еслиxбольше проверяемого элемента, то поиск надо продолжать в правой половине массива. В том и другом случае выполнение одной проверки позволяет в два раза уменьшить размер той части массива, в которой следует искатьx. Далее та же процедура применяется к выбранной половине массива (т.е. проверяется элемент с индексом либо(n+1)/4, либо3(n+1)/4) и т.д., пока не будет найден нужный элемент либо не обнаружится его отсутствие.

Описанный алгоритм называется бинарным поискомв массиве. Соответствующая функция поиска приведена ниже.

function BinarySearch(A: TableType, x: KeyType

): Integer;

var

i, j, q: Integer;

begin

i := 1; j := N;

repeat

q := (i + j) div 2;

if A[q] < x then

i := q + 1

else

j := q – 1;

until (A[q] = x) or (i > j);

if A[q] = x then BinarySearch := q {Успех}

else BinarySearch := 0; {Неудача}

end; {BinarySearch}

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

Оценим эффективность алгоритма. Каждая итерация цикла (включающая проверку значения и смещение одной из границ) сокращает интервал поиска по меньшей мере в два раза. Поиск завершается, когда интервал сведется к одному элементу. Для этого придется выполнить не более log2nитераций. Таким образом, можно сказать, что алгоритм бинарного поиска имеетлогарифмическуюоценку эффективностиT(n) = O(log(n)).

Сопоставим это с числом итераций линейного поиска, примерно равным n. Соответствующие значения для разныхnприведены в табл.2.1.

Таблица 2.1

n

10

100

1000

10 000

100 000

1 000 000

log2(n)

3

7

10

13

17

20


Если учесть, что одна итерация бинарного поиска заметно сложнее, чем одна итерация линейного поиска, то можно сделать примерно следующие выводы. Для очень маленьких таблиц, имеющих около 10 элементов, использование бинарного поиска не дает существенного выигрыша по сравнению с линейным. Для таблиц размером около 100 выигрыш уже ощутим, но необходимость использования бинарного поиска еще можно считать спорной (потому что на современных процессорах экономия составит не более нескольких микросекунд). Однако при размерах от 1000 и выше спорить уже не приходится, поскольку бинарный поиск работает просто несравнимо лучше, чем линейный.

Не будем только забывать, что для применимости бинарного поиска требуется, чтобы массив был сортированным.