Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
вопросы к экзамену.docx
Скачиваний:
5
Добавлен:
28.12.2024
Размер:
430.24 Кб
Скачать

25. Сортировка с использованием деревьев. Пирамидальная сортировка (heap-sort).

Сортировка использует структуру данных бинарная куча.

Это бинарное дерево с ограничениями: значение в любом узле не меньше, чем в любом из его потомков, бинарное дерево полное.

Чтобы представить дерево в виде массива, можно использовать такую идею:

Первым идет корень дерева, тогда индекс для левого потомка 2n+1, для правого – 2n+2

Сам алгоритм сортировки сводится к:

Элементы последовательности переставляются таким образом, чтобы они удовлетворяли условиям бинарной кучи.

Меняется первый элемент с последним (т.к. он будет являться самым большим), выполняется операция по восстановлению бинарной кучи, т. к. после обмена дерево может не соответствовать первому ограничению.

26. Поразрядные, блочные сортировки и сортировка подсчётом.

Поразрядная сортировка предназначена для объекта, который можно поделить на «разряды».

Сравнение происходит «поразрядно». Сначала сравниваются значения крайнего разряда, на основании этого объекты группируются, затем сравниваются значения следующего разряда и так далее.

Блочная сортировка

Сортируемые элементы распределяются между конечным числом отдельных блоков (карманов, корзин) так, чтобы все элементы в каждом следующем по порядку блоке были всегда больше (или меньше), чем в предыдущем. Каждый блок затем сортируется отдельно, либо рекурсивно тем же методом, либо другим. Затем элементы помещаются обратно в массив.

Сортировка подсчетом применяется если диапазон возможных чисел мал, но само количество чисел велико (миллион натуральных чисел меньше 1000)

Алгоритм:

Создать вспомогательный массив длиной равной диапазону наших чисел, затем последовательно считать все элементы массива и для каждого A[i] увеличить C[A[i]] на единицу.

Потом останется лишь пройти по массиву C и для каждого j (0, k) записать число j C[j] раз.

27. Графы. Основные понятия. Поиск в ширину. Поиск в глубину. Топологическая сортировка и поиск кратчайшего пути.

Граф – это совокупность двух множеств – множества вершин и множества их парных связей - ребер.

DFS – cтек, BFS – очередь.

Алгоритм поиска в глубину:

Идея поиска заключается в том, что мы двигаемся от начальной вершины до тех пор пока не достигнем конца пути либо же нужной нам вершины. Если мы не достигли нужной нам вершины, то мы возвращаемся назад и идем по другому маршруту.

  1. Выбираем начальную вершину из еще не пройденных. (u)

  2. Запускаем поиск в глубину(u):

Помечаем вершину u как пройденную

Для каждой не пройденной смежной c u вершины запускаем поиск в глубину (v)

Повторяем 1 и 2, пока не пройденных вершин не останется.

Для реализации используется рекурсия и стек.

Общая идея алгоритма состоит в следующем: для каждой не пройденной вершины необходимо найти все не пройденные смежные вершины и повторить поиск для них.

Алгоритм поиска в ширину:

Идея – вместо того, чтобы идти до конца какого-то пути, мы посещаем одного соседа за раз. Затем посещаем соседа соседей и так далее.

Для реализации используется очередь, мы помещаем туда ближайшую вершину, затем ее соседей, которых мы не посещали и продолжаем пока очередь не опустеет.

поиск кратч пути это просто обход в ширину, в котором мы еще запоминаем, из какой вершины мы приходим как только дошли до нужной вершины - кратчайший путь найден

Алгоритм:

  1. Поместить первый узел в пустую очередь.

  2. Добавить всех преемников узла и извлечь узел из начала очереди, пометив его как просмотренный.

  3. Если очередь пуста – все узлы были просмотрены.

  4. Вернуться к п.2

Топологическая сортировка.

Дан ориентированный граф с   вершинами и   рёбрами. Требуется перенумеровать его вершины таким образом, чтобы каждое ребро вело из вершины с меньшим номером в вершину с большим.

Для решения можно воспользоваться обходом в глубину.

Предположим, что граф ацикличен и решение существует.

При запуске из какой-то вершины v алгоритм будет запускаться для каждой смежной с v вершины.

К моменту выхода из поиска из вершины v у нас будет образован некий список из вершин, которые были рекурсивно посещены ранее и добавив вершину v в начало нашего списка, будет получена топологическая сортировка.