- •Основные понятия структур
- •Концепция типа данных, простейшие типы данных, стандартные типы данных, органические типы (диапазоны)
- •Статические и полустатические структуры данных
- •2. 1. Массив.
- •2. 2. Запись, записи с вариантами.
- •2. 3. Стек.
- •5. Очередь
- •2. 7. Отображение
- •Динамические структуры данных
- •3.1. Односвязные списки, кольцевой список
- •3. 2. Двусвязный список, кольцевой двусвязный список
- •4. Рекурсивные алгоритмы
- •4. 1. Деревья, бинарные деревья, представление деревьев
- •4. 2. Основные операторы, используемые для работы с деревьями
- •4. 3. Алгоритм создания дерева бинарного поиска
- •4. 4. Прохождение бинарных деревьев
- •1. Прохождение в прямом порядке
- •3. Прохождение в обратном порядке
- •4. 5. Когда рекурсию использовать не нужно
- •4. 6. Рекурсивные программы, примеры
- •5. Поиск
- •5. 1. Линейный поиск
- •5. 2. Двоичный поиск
- •5. 3. Индексно-последовательный поиск
- •5. 3. Поиск в таблице
- •5. 4. Поиск прямой строки
- •Поиск по бинарному дереву
- •Алгоритм кнута, Морриса и Пратта
- •5. 6. Алгоритм Боуера и Мура
- •Сортировка. Необходимые определения и классификация сортировок. Сортировки прямого включения и выбора. Их эффективность Необходимые определения и классификация сортировок.
- •Сортировка методом прямого включения
- •Эффективность алгоритма сортировки прямого включения
- •Сортировка методом прямого выбора
- •Эффективность алгоритма сортировки прямого выбора
- •Сортировка прямого обмена. Её эффективность
- •Эффективность алгоритма сортировки прямого обмена
- •Улучшенные методы сортировки. Быстрая сортировка. Её эффективность.
- •Быстрая сортировка
- •Принцип работы быстрой сортировки
- •Пример работы быстрой сортировки
- •Блок-схема быстрой сортировки
- •Улучшенные методы сортировки. Сортировка шелла. Её эффективность. Сортировка шелла
- •Принцип работы сортировки шелла и необходимые расчёты для её реализации
- •Пример расчёта последовательности расстояний для малых массивов
- •Пример работы сортировки шелла
- •Принцип работы пирамидальной сортировки
- •Пример работы пирамидальной сортировки
- •Представление графов
- •Нахождение кратчайших путей между парами вершин
5. Поиск
Поиск является одной из основных операций при обработке информации в ЭВМ. Ее назначение - по заданному аргументу найти среди массива те данные, которые соответствуют этому аргументу.
Признак, по которому элемент структуры отличается от других данных называется ключом.
Если в таблице существует только одно данное с ключом, то такой ключ является уникальным и называется первичным.
Вторичный ключ в одной таблице может повторяться, но по нему тоже можно организовать поиск.
Ключи данных могут быть собраны в одном месте (в другой таблице) или представлять собой запись, в которой одно из полей - это ключ.
Внешний ключ (и) - это Ключ (и), который выделен из таблицы данных и организован в свой файл, называются
Внутренний ключ – это ключ, который находится в записи
Поиском по заданному аргументу называется алгоритм, определяющий соответствие ключа с заданным аргументом.
Результатом работы алгоритма поиска является нахождение этого данного или отсутствие его в таблице. В случае отсутствия данного возможны две операции:
индикация того, что данного нет
вставка данного в таблицу.
Пусть k - массив ключей. Для каждого k(i) существует r(i) - данное. Key - аргумент поиска. Ему соответствует информационная запись геc. В зависимости от того, какова структура данных в таблице, различают несколько видов поиска.
5. 1. Линейный поиск
Линейный (последовательный) поиск применяется в том случае, если неизвестна организация данных или данные неупорядочены.
Производится последовательный просмотр, по всей таблице начиная от младшего адреса в оперативной памяти к самым старшим.
Последовательный поиск в массиве осуществляется с помощью переменной search, которая хранит номер найденного элемента.
Рис. 26 - Последовательный поиск в массиве
for i:=l to n
if k(i) = key then
search = i
return
end if
next i
search = 0
return
На Паскале программа будет выглядеть следующим образом:
for i:=l to n do
if k[i] = key then
begin
search = i;
exit;
end;
search = 0;
exit;
Эффективность последовательного поиска в массиве можно определить как количество производимых сравнений М.
Mmin = 1, Mmax = n. Если данные расположены равновероятно во всех ячейках массива, то Мср ≈ (п + 1)/2.
Если элемент не найден в таблице и необходимо произвести вставку, то последние 2 оператора заменяются на n = n + 1
на Паскале
n:=n+l n:=n+l;
k(n) = key k[n]:=key;
r(n) = rec r[n]:=rec;
search = n search :=n;
return exit;
Если таблица данных задана в виде односвязного списка, то производится последовательный поиск в списке (рис. 5.2).
table
Рис. – Поиск в списке
Пример программы
q:=nil;
p:=table;
while (p<> nil) do
begin
if p^.k = key then
begin
search = p ;
exit;
end;
q = p;
p = p^.nxt;
end;
New (s);
s^.k:= key
s^.r = rec
s^.nxt: = nil;
if q = nil then table = s
else q.^nxt = s;
search: = s;
exit
Достоинством списковой структуры является ускоренный алгоритм удаления или вставки элемента в список.
Время вставки или удаления не зависит от количества элементов, а в массиве каждая вставка или удаление требуют передвижения примерно половины элементов.
Эффективность последовательного поиска
Эффективность любого поиска может оцениваться по количеству сравнений аргумента поиска С с ключами таблицы данных. Чем меньше количество сравнений, тем эффективнее алгоритм поиска.
Эффективность последовательного поиска в массиве:
С = 1 +п, С = (п + 1)/2.
Целью поиска является выполнение следующих процедур:
Найденную запись считать.
При отсутствии записи произвести ее вставку в таблицу.
Найденную запись удалить.
Первая процедура занимает для них одно время. Вторая и третья процедуры для списочной структуры более эффективна (т. к. у массивов надо сдвигать элементы).
Если k - число передвижений элементов в массиве, то k= (n + 1)/2.