- •Ответы на экзаменационные вопросы по курсу «Алгоритмы и структуры данных»
- •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.Нерекурсивный алгоритм обхода бинарного дерева.
30.Поиск по бинарному дереву с удалением.
Удаление узла не должно нарушить упорядоченности дерева.
Возможны три варианта.
Найденный узел является листом. Тогда он просто удаляется с помощью обычной процедуры удаления.
Найденный узел имеет только одного сына. Тогда сын перемещается на место отца.
У удаляемого узла два сына. Тогда на место отца помещается либо его предшественник при обходе слева направо, либо его преемник при том же виде обхода.
Предшественник - это самый правый элемент левого поддерева (для достижения этого элемента необходимо перейти в следующий узел по левой ветви, а затем двигаться только по правой ветви этого узла до тех пор, пока очередная ссылка не будет равна nil.
Преемник - это самый левый элемент правого поддерева (для достижения этого элемента необходимо перейти в следующий узел по правой ветви, а затем двигаться только по левой ветви этого узла до тех пор, пока очередная ссылка не будет равна nil.
Предшественником удаляемого узла (12) является самый правый узел левого поддерева (11).
Преемником узла (12) - самый левый узел правого поддерева (13).
Будем разрабатывать алгоритм для преемника (узел 13), который будет поставлен на место удаляемого узла 12.
Введем указатели:
p - рабочий указатель;
q - отстает от р на один шаг;
v - указывает на преемника удаляемого узла;
t - отстает от v на один шаг;
s - на один шаг впереди v (указывает на левого сына или пустое место).
В результате поиска преемника на узел 13 должен указывать указатель v, а указатель s - на пустое место (как показано на рисунке).
q = nil
p = tree
while (p <> nil) and (k(p) <> key) do
q = p
if key < k(p) then
p = left(p)
else
p = right(p)
endif
endwhile
if p = nil then ‘Ключ не найден’
return
endif
if left(p) = nil then v = right(p)
else if right(p) = nil
then v = left(p)
else
‘У nod(p) - два сына’
‘Введем два указателя (t отстает от v на 1 шаг, s - опережает)’
t = p
v = right(p)
s = left(v)
while s <> nil do
t = v
v = s
s = left(v)
endwhile
if t <> p then
‘v не является сыном p’
left(t) = right(v)
right(v) = right(p)
endif
left(v) = left(p)
endif
endif
if q = nil then ‘p - корень’
tree = v
else if p = left(q)
then left(q) = v
else right(q) = v
endif
endif
freenode(p)
return
Следует заметить, что данный алгоритм, пожалуй, является наиболее сложным из изучаемых в данном курсе, и для его полного осмысления необходимо самостоятельно пошагово проанализировать происходящие в нем действия.
31.Алгоритмы прохождения бинарных деревьев. Рекурсивные алгоритмы обхода (прохождения) бинарных деревьев
В зависимости от последовательности обхода поддеревьев различают три вида обхода (прохождения) деревьев.
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) по мере обхода узлов простейшего дерева из трех узлов
