- •Ответы на экзаменационные вопросы по курсу «Алгоритмы и структуры данных»
- •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.Нерекурсивный алгоритм обхода бинарного дерева.
Утилизация освободившихся элементов в многосвязных списках
При работе с динамическими структурами возможны случаи, когда происходит обнуление полей указателей у элементов, что приводит к ситуации, в которой не связанные ни с чем элементы занимают динамическую память машины. Данные элементы необходимо утилизировать. Первый способ утилизации - метод счетчиков.
Метод счетчиков
В каждый элемент многосвязного списка вставляется поле счетчика, который считает количество ссылок на данный элемент. Когда счетчик элемента оказывается в нулевом состоянии, а поля указателей элемента находятся в состоянии nil, этот элемент может быть возвращен в пул свободных элементов.
Второй способ утилизации - метод маркера (сборки мусора, то есть неиспользуемых элементов)
Метод маркера
Если с каким-то элементом установлена связь, то однобитовое поле элемента (маркер) устанавливается в “1”, иначе - в “0”. По сигналу переполнения отыскиваются элементы, у которых маркер установлен в ноль, т. е. включается программа сборки мусора, которая просматривает всю отведенную память и возвращает в список свободных элементов все элементы, не помеченные маркером.
13.Очередь и операции над ней при реализации связными списками
Операции с очередью, применимые к спискам.
Указатель начала списка принимаем за указатель начала очереди F, а указатель R, указывающий на последний элемент списка - за указатель конца очереди.
Проверка очереди на пустоту
Empty(Q)
If F = nil
then print “Очередь пуста”
Stop
endif
return
Операция удаления из очереди Remove(Q)
Операция удаления из очереди должна происходить из ее начала.
Remove(Q)
If F = nil
then print “Очередь пуста”
Stop
endif
P = F
F = Ptr(P)
X = Info(P)
FreeNode(P)
return
Операция вставки в очередь
Insert(Q, x)
Операция вставки в очередь должна осуществляться к ее концу.
Insert(Q, x)
P = GetNode
Info(P) = x
Ptr(P) = Nil
Ptr(R)= P
R = P
return
14.Операции вставки и извлечения элементов из списка. Сравнение этих операций с аналогичными в массивах. Недостаток связного списка по сравнению с массивом.
Вставка и извлечение элементов из списка
Cначала определяем элемент, после которого необходимо провести операцию вставки или удаления.
Вставка производится с помощью функции InsAfter(P, x), а удаление - DelAfter(P).
При этом рабочий указатель P должен указывать на элемент, после которого необходимо произвести вставку или удаление.
Вставка InsAfter(P, x)
Пусть необходимо вставить новый элемент с информационным полем x после элемента, на который указывает рабочий указатель P.
1) Необходимо сгенерировать новый элемент.
Q = GetNode
2) Информационному полю этого элемента присвоить значение X.
Info(Q) = x
3) Вставить полученный элемент.
Ptr(Q) = Ptr(P)
Ptr(P) = Q
Это и есть функция InsAfter(Q, X), алгоритм которой ниже
Q = GetNode
info(Q) = x
ptr(Q) = ptr(P)
ptr(P) = Q
return
Удаление DelAfter(P)
Пусть необходимо удалить элемент списка, который следует после элемента, на который указывает рабочий указатель P.
Для этого:
1) Присваиваем Q значение указателя на удаляемый элемент.
Q = Ptr(P)
2) В переменную X сохраняем значение информационного поля удаляемого элемента.
X = Info(Q)
3) Меняем значение указателя на удаляемый элемент на значение указателя на следующий элемент и производим удаление .
Ptr(P) = Ptr(Q)
FreeNode(Q)
Это и есть процедура DelAfter(P, X), ниже записан алгоритм
Q = ptr(P)
X = info(Q)
ptr(P) = ptr(Q)
FreeNode(Q)
return
При работе с односвязным спиком доступ имеется к его началу, поэтому, для вставки или удаления любого элемента, кроме первого, необходим алгоритм просмотра односвязного списка
Алгоритм просмотра односвязного списка при вставке и удалении
Q =Nil
P = Lst
while (P <> nil) do
Q = P
P = ptr(P)
endwhile
return
