ВУЗ:
Составители:
Рубрика:
Бинарный поиск НАЧАЛО Далее сравниваем элемент под номером C с поисковой переменной P и в зависимости Поиск можно выполнять значительно эффективнее, если данные Ввод n, P, от результата сравнения заново вычисляем будут упорядочены, то есть значения элементов последовательности X(n) границы A или B. Проверку на совпадение возрастают (убывают) с увеличением номера элемента. Будем X(C)=P для повышения эффективности рассматривать упорядоченный по возрастанию массив, для которого A:= 1; алгоритма будем выполнять после выхода из выполняются условия: X[ i 1]≤X[ i ] для всех i из интервала [1, n]. цикла. По условию цикл прекращает свою B:= n; Основная идея выбрать случайно некоторый элемент, работу при A=B. Как достичь этого? Пусть мы предположим X[k] и сравнить его с поисковой переменной P. Если нет несколько раз сделали пересчет A и В и дошли X[ k ]=P, то поиск заканчивается. Если X[ k ]P исключаются все элементы с индексами большие или будем искать нужный элемент среди двух, равные k. Наша задача исключить на каждом шаге как можно больше C:=(A+B)div2 расположенных рядом Х(А) и Х(В). Пусть А=7, элементов. Оптимальным решением будет выбор в качестве X[ k ] В=8 и Х(8)=Р. тогда C=(7+8)div 2=7, то есть среднего элемента, так как при этом в любом случае будет исключаться С=А и будет выполняться соотношение нет Х(С)<Р. поэтому нужно сделать так, чтобы А половина массива. Тогда максимальное число сравнений с поисковой X(C)=P переменной P равно log2n, округленному до ближайшего целого числа. стало равным В, то есть при выполнении да условия Х(С)<Р следует полагать А=С+1. Если Обратимся к листу опорного сигнала №2 (Рисунок 17.). Как найти выполняется условие Х(С)>Р, то искомым нужную книгу на полке среди расставленных по порядку томов Ф.М. A:=C+1; элементом, возможно, является Х(А), тогда для Достоевского? Если мы знаем, что всего томов 40, то сразу выберем завершения работы цикла следует полагать средний (20-ый том) и посмотрим, этот ли нам нужен. Если нет, то В=С. проверим, справа или слева находится интересующий нас 15-тый том. B:=C; Поскольку он должен находиться между 1-ым и 20-тым томами, выбираем Легко убедиться, что такие средний 10-тый том и снова делаем проверку, 15-тый том находится присваивания не противоречат выбранному правее. Делим промежуток межу 10-тым и 20-тым томами пополам и алгоритму на любом шаге работы цикла. сразу находим нужный 15-тый том. Запоминаем место, где он стоит. нет После выхода из цикла необходимо проверить X(A )=P условие Х(А)=Р, если оно выполняется, то В процессе поиска мы сдвигаем границы интервала, в котором да индекс искомого элемента k=А, в противном ищется нужная книга. Причем, после нового сравнения изменяем лишь случае будем полагать k=0 (элемент не одну границу либо нижнюю, либо верхнюю. k:= A; найден). Метод, использующий последовательное уменьшение исследуемых На Рисунке 21 приведена блок-схема данных в два раза, называется бинарным или методом дихотомии (деление рассмотренного алгоритма. пополам). Разработаем блок-схему метода дихотомии для упорядоченного k:= 0; по возрастанию массива данных. Обозначим A=1 (индекс наименьшего Программа 13. Процедура для массива элемента), B=n (индекс наибольшего элемента), n количество элементов. символьного типа Основой алгоритма будет итерационный цикл, который выполняется до Печать k Const n=40; тех пор, пока границы A и B не совпадут. В теле цикла выбираем средний Type mass=array[1 . . n] of char; индекс C, разделив интервал индексов пополам. Так как индекс C должен КОНЕЦ Procedure BiPoisk(X:mass; P:char; n: integer; var быть целым числом, нужно воспользоваться функцией div деление k:integer); нацело двух чисел, то есть будем вычислять C по формуле: C:=(A+B)div2. Рисунок 21. Блок-схема бинарного поиска 35 36
Страницы
- « первая
- ‹ предыдущая
- …
- 16
- 17
- 18
- 19
- 20
- …
- следующая ›
- последняя »