
- •Содержание
- •Введение
- •Структуры данных Классификация структур данных
- •Операции над данными
- •Понятие алгоритма
- •Массивы Описание массива
- •Представление массивов в памяти
- •Рис 1. Представление вектора в памяти
- •Рис 2. Представление вектора ml в памяти
- •Алгоритмы поиска
- •Алгоритмы сортировки
- •Пример сортировки простыми вставками.
- •Описание записи
- •Операции над записями
- •Записи с вариантами
- •Представление записи в памяти
- •Общие процедуры и функции для работы с файлами
- •Процедуры и функции для работы с типизированными файлами.
- •Сортировка содержимого файлов (Внешняя сортировка)
- •Пример внешней сортировки прямым слиянием
- •Пример внешней сортировки естественным слиянием
- •Динамическая память и данные с динамической структурой
- •Ссылочный тип в языке Pascal
- •Типизированные указатели
- •Нетипизированные указатели
- •Операции над переменными ссылочного типа.
- •Динамические списки
- •Реализация списков на языке Pascal.
- •Стек, очередь, дек
- •Рекурсия
- •Нелинейные структуры данных. Деревья
- •Бинарные деревья
- •Реализация бинарных деревьев
- •Способы обхода бинарных деревьев
- •Сортировка с прохождением бинарного дерева
Алгоритмы поиска
Пусть задан набор уникальных элементов. И задан некоторый ключ х для поиска.
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
( begin
if
{find}
else
if
then
else
end;
if
{not find} |
|
Способы улучшения алгоритма:
1. поменять местами заголовки условных операторов. Проверку на равенство можно выполнять в последнюю очередь, так как она встречается единожды и приводит к окончанию работы.
2. Отказаться от окончания поиска при фиксации совпадения.