
- •Алгоритмическая сложность. Понятие алгоритма. Формы записи. Асимптотический анализ.
- •Линейные структуры данных. Списки. Динамический массив.
- •Линейные структуры данных. Списки. Связный и двусвязный списки.
- •Линейные структуры данных. Очереди. Кольцевые очереди. Стеки. Деки. Алгоритм сортировочной станции.
- •Алгоритм[править | править код]
- •Деревья. Дерево поиска и бинарное дерево поиска. Основные понятия.
- •Сбалансированные деревья. Авл-деревья. Алгоритм добавления нового узла.
- •Сбалансированные деревья. Авл-деревья. Алгоритм удаления существующего узла.
- •21. Сортировка вставками (insertion)
- •25. Сортировка с использованием деревьев. Пирамидальная сортировка (heap-sort).
- •26. Поразрядные, блочные сортировки и сортировка подсчётом.
- •29. Графы. Построение минимального остовного дерева. Алгоритм Прима.
- •28. Графы. Построение минимального остовного дерева. Алгоритм Краскала.
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 – очередь.
Алгоритм поиска в глубину:
Идея поиска заключается в том, что мы двигаемся от начальной вершины до тех пор пока не достигнем конца пути либо же нужной нам вершины. Если мы не достигли нужной нам вершины, то мы возвращаемся назад и идем по другому маршруту.
Выбираем начальную вершину из еще не пройденных. (u)
Запускаем поиск в глубину(u):
Помечаем вершину u как пройденную
Для каждой не пройденной смежной c u вершины запускаем поиск в глубину (v)
Повторяем 1 и 2, пока не пройденных вершин не останется.
Для реализации используется рекурсия и стек.
Общая идея алгоритма состоит в следующем: для каждой не пройденной вершины необходимо найти все не пройденные смежные вершины и повторить поиск для них.
Алгоритм поиска в ширину:
Идея – вместо того, чтобы идти до конца какого-то пути, мы посещаем одного соседа за раз. Затем посещаем соседа соседей и так далее.
Для реализации используется очередь, мы помещаем туда ближайшую вершину, затем ее соседей, которых мы не посещали и продолжаем пока очередь не опустеет.
поиск кратч пути это просто обход в ширину, в котором мы еще запоминаем, из какой вершины мы приходим как только дошли до нужной вершины - кратчайший путь найден
Алгоритм:
Поместить первый узел в пустую очередь.
Добавить всех преемников узла и извлечь узел из начала очереди, пометив его как просмотренный.
Если очередь пуста – все узлы были просмотрены.
Вернуться к п.2
Топологическая сортировка.
Дан
ориентированный граф с
вершинами
и
рёбрами.
Требуется перенумеровать его
вершины таким образом, чтобы каждое
ребро вело из вершины с меньшим номером
в вершину с большим.
Для решения можно воспользоваться обходом в глубину.
Предположим, что граф ацикличен и решение существует.
При запуске из какой-то вершины v алгоритм будет запускаться для каждой смежной с v вершины.
К моменту выхода из поиска из вершины v у нас будет образован некий список из вершин, которые были рекурсивно посещены ранее и добавив вершину v в начало нашего списка, будет получена топологическая сортировка.