Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metodichka_po_Pascal_2_chast.doc
Скачиваний:
108
Добавлен:
18.02.2016
Размер:
5.11 Mб
Скачать

Алгоритмы поиска

Пусть задан набор уникальных элементов. И задан некоторый ключ х для поиска.

const n=15;{размерность массива}

Var mass: array [1..n] of Byte;

i: byte;

Последовательный поиск

Условия:

- данные не упорядочены.

- количество элементов фиксировано.

Алгоритм последовательного поиска начинается с первого элемента данных. Последовательно сравнивается каждый элемент с ключом до тех пор, пока не будет найден искомый элемент или достигнут конец набора данных. Т.о., условия завершения алгоритма:

- элемент найден, т.е. некоторый -ый элемент;

- весь массив просмотрен и совпадения не обнаружено.

Порядок выполнения последовательного поиска:

ш.1) перейти в начало набора

ш.2) пока не достигнут конец набора и текущий элемент не равен искомому → ш.3, иначе ш.4

ш.3) переход к следующему элементу → ш.2

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

while and do

;

if then

{find}

else

{not find}

На каждом шаге происходит увеличение индекса и проверка 2-ух условий. Алгоритм можно упростить по следующему принципу: при нескольких проверках во внутреннем цикле следует свести их к минимуму (одной), при этом следует гарантировать, что совпадение произойдет всегда.

Последовательный поиск с барьером

Является улучшением алгоритма последовательного поиска.

В последовательности создается «барьер»: последним дописывается элемент, равный искомому. В таком случае, ключ ищется до тех пор, пока не будет совпадения (или найден элемент, или достигнут барьер).

;

while () do

;

if then

{not find}

else

{find}

Блок схема последовательного поиска

Блок схема последовательного поиска с барьером

Двоичный поиск

(поиск делением пополам, двоичный поиск)

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

Приведем алгоритм, основанный на знаний того, что массив а упорядочен, т.е. удовлетворяет условию , где

Условия:

- данные упорядочены.

- количество элементов фиксировано.

Алгоритм решает задачу, уменьшая размер рассматриваемого поддиапазона, в котором может находиться ключ x.

В начале в качестве диапазона рассматривается весь массив, в котором ищется средний элемент. Затем средний элемент сравнивается с ключом:

- если он меньше ключа, то делается вывод о том, что все элементы с индексами, меньшими индекса среднего элемента, можно исключить из дальнейшего поиска;

- если же средний элемент больше искомого значения, то исключаются элементы с индексами, большими индекса среднего элемента.

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

Рис.4. Поиск делением пополам

ш.1) установить левую и правую границы диапазона;

ш.2) если диапазон не пуст то → ш.3), иначе→ ш.5)

ш.3) вычислить индекс среднего элемента;

ш.4) сравнить средний элемент с ключом:

если средний элемент равен ключу, то — успешный поиск, завершение поиска, иначе если средний элемент больше ключа, изменить правую границу, → ш.3); иначе если средний элемент меньше ключа, изменить левую границу, → ш.3);

ш.5) элемент не найден.

;

while () do

begin

if then

{find}

else if

then

else

;

end;

if then

{not find}

Способы улучшения алгоритма:

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

2. Отказаться от окончания поиска при фиксации совпадения.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]