- •Ответы на экзаменационные вопросы по курсу «Алгоритмы и структуры данных»
- •1.Понятие типов и структур данных. Оперативные и внешние структуры.
- •2.Стандартные и пользовательские типы данных.
- •3.Определение и представление структур данных.
- •4.Классификация структур данных. Векторы и массивы как статистические структуры. Классификация структур данных
- •Статические структуры данных Векторы
- •Массивы
- •5.Записи и таблицы как статические структуры. Записи
- •6.Понятие списковой структуры. Стек как полустатическая структура. Операция над стеками
- •Алгоритмы основных операций со стеком
- •7.Очередь как полустатическая структура. Операции над очередью. Очередь
- •8.Недостатки полустатической очереди, методы их исправления. Очередь со сдвигом.
- •9.Кольцевая полустатическая очередь. Операции над кольцевой очередью. Деки, операции над ними.
- •10.Понятие динамических структур данных. Организация односвязных и двусвязных списков. Простейшие операции над односвязными списками. Динамические структуры данных
- •Связные списки
- •Односвязные списки
- •Кольцевой односвязный список
- •Двусвязный список
- •Кольцевой двусвязный список
- •Простейшие операции над односвязными списками
- •11.Реализация стеков с помощью списков.
- •Утилизация освободившихся элементов в многосвязных списках
- •13.Очередь и операции над ней при реализации связными списками
- •14.Операции вставки и извлечения элементов из списка. Сравнение этих операций с аналогичными в массивах. Недостаток связного списка по сравнению с массивом.
- •15.Пример алгоритма решения задачи извлечения элементов из списка по заданному признаку.
- •16.Пример алгоритма решения задачи вставки заданного элемента в упорядоченный список.
- •17.Элементы заголовков в списках; нелинейные связные структуры.
- •Нелинейные связанные структуры
- •18.Понятие рекурсивных структур данных. Деревья, их признаки и представления.
- •Деревья
- •Бинарные деревья
- •19.Алгоритм сведения m-арного дерева к бинарному; основные операции над деревьями; виды обхода.
- •Графическое пояснение алгоритма
- •Основные операции с деревьями
- •Рекурсивные алгоритмы обхода (прохождения) бинарных деревьев
- •20.Понятие поиска и ключей; назначение и структуры алгоритмов поиска.
- •21.Последовательный поиск и его эффективность.
- •22.Индексно-последовательный поиск.
- •23.Оптимизация поиска. Переупорядочивание таблицы с учетом вероятности поиска элемента. Дерево оптимального поиска.
- •24.Метод оптимизации поиска путем перестановки в начало списка.
- •25.Метод транспозиции при оптимизации поиска.
- •26.Бинарный поиск
- •27.Алгоритм создания упорядоченного бинарного дерева.
- •28.Поиск по бинарному дереву. Эффективность поиска по бинарному дереву.
- •29.Поиск по бинарному дереву с включением.
- •30.Поиск по бинарному дереву с удалением.
- •31.Алгоритмы прохождения бинарных деревьев. Рекурсивные алгоритмы обхода (прохождения) бинарных деревьев
- •32.Понятие сортировки, ее эффективность; классификация методов сортировки.
- •33.Сортировка методом прямого выбора.
- •34.Сортировка методом прямого включения. Сортировка методом прямого включения
- •Эффективность алгоритма прямого включения
- •35.Сортировка методом прямого обмена.
- •36.Быстрая сортировка.
- •37.Сортировка Шелла.
- •38.Сортировка с помощью бинарного дерева.
- •39.Сравнительный анализ эффективности методов сортировки.
- •40.Нерекурсивный алгоритм обхода бинарного дерева.
19.Алгоритм сведения m-арного дерева к бинарному; основные операции над деревьями; виды обхода.
Сведение m-арного дерева к бинарному
Неформальный алгоритм:
1.В любом узле дерева отсекаются все ветви, кроме крайней левой, соответствующей старшим сыновьям.
2.Соединяются горизонтальными линиями все сыновья одного родителя.
3. Старшим (левым) сыном в любом узле полученной структуры будет узел, находящийся под данным узлом (если он есть).
Графическое пояснение алгоритма
Реализация полученного бинарного дерева с помощью нелинейного двусвязного списка можно представить в иде рисунка ние
Основные операции с деревьями
1. Обход дерева.
2. Удаление поддерева.
3. Вставка поддерева.
Для выполнения обхода дерева необходимо выполнить три процедуры:
1.Обработка корня.
2.Обработка левой ветви.
3.Обработка правой ветви.
В зависимости от того, в какой последовательности выполняются эти три процедуры, различают три вида обхода.
1.Обход сверху вниз. Процедуры выполняются в последовательности
1- 2 - 3.
2.Обход слева направо. Процедуры выполняются в последовательности
2 - 1- 3.
3.Обход снизу вверх. Процедуры выполняются в последовательности
2 - 3 -1.
Направления обхода дерева
A-B-C-E-D-F-G – сверху вниз
C-B-D-E-F-A-G – слева направо
C-D-F-E-B-G-A – снизу вверх
В зависимости от того, после какого по счету захода в узел он подвергается обработке, реализуется один из трех видов обхода.
Если обработка идет после первого захода в узел, то это обход сверху вниз,
если после второго - то слева направо,
если после третьего - то снизу вверх.
Операция удаления поддерева
Необходимо указать узел, к которому подсоединяется удаляемое поддерево и указатель корня этого поддерева.
Исключение поддерева состоит в том, что разрывается связь с удаляемым поддеревом, т. е. указатель элемента, связанного с узлом-корнем удаляемого поддерева, устанавливается в nil.
Cтепень исхода данного узла уменьшается на единицу.
Операция вставки поддерева
Необходимо знать указатель корня вставляемого поддерева и узел, к которому подвешивается поддерево.
Установить указатель этого узла на корень поддерева, а степень исхода данного узла увеличить на единицу.
При этом, в общем случае, необходимо произвести перенумерацию сыновей узла, к которому подвешивается поддерево.
Алгоритмы вставки и удаления будут рассмотрены позднее.
Создание дерева бинарного поиска
Пусть заданы элементы с ключами: 14, 18, 6, 21, 1, 13, 15.
Построим упорядоченное бинарное дерево по этим ключам.
Алгоритм создания следующий:
read (key, rec)
tree = maketree(key, rec)
while not eof do
p = tree
q = tree
read (key, rec)
v = maketree(key, rec)
while p <> nil do
q = p
if key < k(p) then
p = left(p)
else
p = right(p)
endif
endwhile
if key < k(q) then
left(q) = v
else
right(q) = v
endif
endwhile
return
После выполнения вышеприведенного алгоритма получится дерево, изображенное на рисунке ниже
Рекурсивные алгоритмы обхода (прохождения) бинарных деревьев
В зависимости от последовательности обхода поддеревьев различают три вида обхода (прохождения) деревьев.
1. Сверху вниз А, В, С.
2. Слева направо или симметричное прохождение В, А, С.
3. Снизу вверх В, С, А.
Наиболее часто применяется второй способ.
Алгоритмы:
“сверху вниз”
subroutine pretrave (tree)
if tree <> nil then
print info(tree)
pretrave(left(tree))
pretrave(right(tree))
endif
return
“симметричный или слева-направо”
subroutine intrave (tree)
if tree <> nil then
intrave(left(tree))
print info(tree)
intrave(right(tree))
endif
return
Поясненим подробнее рекурсию обхода бинарного дерева на примере процедуры intrave (tree).
Пронумеруем строки алгоритма процедуры
1. if tree <> nil
2. then intrave (left(tree))
3. print info (tree)
4. intrave (right (tree))
5.endif
6.return
Обозначим указатели: t → tree; l → left; r → right.
На приведенном ниже рисунке проиллюстрирована последовательность вызова процедуры intrave (tree) по мере обхода узлов простейшего дерева из трех узлов
