- •1. Алгоритмическая сложность. Понятие алгоритма. Формы записи. Асимптотический анализ.
- •2. Алгоритмы поиска. Линейный и бинарный поиск
- •3. Поиск подстроки в строке: основные понятия (постановка задачи, алфавит, цепочки). Простой поиск.
- •4. Поиск подстроки в строке: основные понятия (постановка задачи, алфавит, цепочки). Алгоритм Рабина-Карпа.
- •5. Поиск подстроки в строке. Алгоритм Кнута-Мориса-Пратта
- •8. Линейные структуры данных. Списки. Связный и двусвязный списки.
- •9. Линейные структуры данных. Очереди. Кольцевые очереди. Стеки. Деки. Алгоритм сортировочной станции.
- •10. Ассоциативные массивы и хэш-таблицы.
- •11. Деревья. Дерево поиска и бинарное дерево поиска. Основные понятия
- •12. Сбалансированные деревья. Основные понятия. Малый и большой повороты дерева. Обходы дерева
- •13. Сбалансированные деревья. Авл-деревья. Алгоритм добавления нового узла
- •14. Сбалансированные деревья. Авл-деревья. Алгоритм удаления существующего узла
- •15. Сбалансированные деревья. Красно-чёрные деревья. Алгоритм добавления нового узла
- •Вставка
- •16. Сбалансированные деревья. Красно-чёрные деревья. Алгоритм удаления существующего узла
- •17. Сбалансированные деревья. B-деревья. 2-3-4 деревья. Основные понятия
- •Свойства
- •18. Сбалансированные деревья. 2-3-4 деревья. Алгоритм добавления нового ключа
- •19. Сбалансированные деревья. 2-3-4 деревья. Алгоритм удаления существующего узла
- •20. Сортировка сравнениями. Пузырьковая сортировка (bubble)
- •21. Сортировка сравнениями. Сортировка вставками (insertion)
- •22. Сортировка сравнениями. Селекционная сортировка (selection)
- •23. Сортировка «разделяй и властвуй». Сортировка слияниями (merge-sort)
- •24. Сортировка «разделяй и властвуй». Быстрая сортировка (quick-sort)
- •25. Сортировка с использованием деревьев. Пирамидальная сортировка (heap-sort)
- •26. Поразрядные, блочные сортировки и сортировка подсчётом.
- •28. Графы. Построение минимального остовного дерева. Алгоритм Прима
- •29. Графы. Построение минимального остовного дерева. Алгоритм Крускала
23. Сортировка «разделяй и властвуй». Сортировка слияниями (merge-sort)
Принцип «разделяй и властвуй» (divide and conquer) – парадигма разработки алгоритмов, заключающаяся в рекурсивном разбиении решаемой задачи на две или более подзадачи того же типа, но меньшего размера, и комбинировании их решений для получения ответа к исходной задаче; разбиения выполняются до тех пор, пока все подзадачи не окажутся элементарными.
Алгоритм сортировки слиянием это типичный пример принципа «разделяй и властвуй». Чтобы отсортировать массив чисел по возрастанию, он разбивается на две равные части, каждая сортируется, затем отсортированные части сливаются в одну. Эта процедура применяется к каждой из частей до тех пор, пока сортируемая часть массива содержит хотя бы два элемента (чтобы можно было её разбить на две части). Время работы этого алгоритма составляет операций, тогда как более простые алгоритмы требуют времени, где — размер исходного массива.
24. Сортировка «разделяй и властвуй». Быстрая сортировка (quick-sort)
Принцип «разделяй и властвуй» (divide and conquer) – парадигма разработки алгоритмов, заключающаяся в рекурсивном разбиении решаемой задачи на две или более подзадачи того же типа, но меньшего размера, и комбинировании их решений для получения ответа к исходной задаче; разбиения выполняются до тех пор, пока все подзадачи не окажутся элементарными.
QuickSort является существенно улучшенным вариантом алгоритма сортировки с помощью прямого обмена («Пузырьковая сортировка»). В первую очередь производятся перестановки на наибольшем возможном расстоянии и после каждого прохода элементы делятся на две независимые группы.
Общая идея алгоритма состоит в следующем:
Выбрать из массива элемент, называемый опорным. Это может быть любой из элементов массива. От выбора опорного элемента не зависит корректность алгоритма, но в отдельных случаях может сильно зависеть его эффективность.
Сравнить все остальные элементы с опорным и переставить их в массиве так, чтобы разбить массив на два непрерывных отрезка, следующих друг за другом: «элементы меньшие опорного» и «равные или большие».
Для обоих отрезков значений выполнить рекурсивно ту же последовательность операций, если длина отрезка больше единицы.
25. Сортировка с использованием деревьев. Пирамидальная сортировка (heap-sort)
Двоичная куча, пирамида, или сортирующее дерево — такое двоичное дерево, для которого выполнены три условия:
Значение в любой вершине не меньше, чем значения её потомков.
Глубина всех листьев (расстояние до корня) отличается не более чем на 1 слой
Последний слой заполняется слева направо без «дырок».
+Высота кучи определяется как высота двоичного дерева. То есть она равна количеству рёбер в самом длинном простом пути, соединяющем корень кучи с одним из её листьев. Высота кучи есть , где — количество узлов дерева.
Алгоритм:
Необходимо отсортировать массив AA, размером nn. Построим на базе этого массива за O(n)O(n) кучу для максимума. Так как максимальный элемент находится в корне, то если поменять его местами с A[n−1]A[n−1], он встанет на своё место. Далее вызовем процедуру siftDown(0)siftDown(0), предварительно уменьшив heapSizeheapSize на 11. Она за O(logn)O(logn) просеет A[0]A[0] на нужное место и сформирует новую кучу (так как мы уменьшили её размер, то куча располагается с A[0]A[0] по A[n−2]A[n−2], а элемент A[n−1]A[n−1] находится на своём месте). Повторим эту процедуру для новой кучи, только корень будет менять местами не с A[n−1]A[n−1], а с A[n−2]A[n−2]. Делая аналогичные действия, пока heapSizeheapSize не станет равен 11, мы будем ставить наибольшее из оставшихся чисел в конец не отсортированной части. Очевидно, что таким образом, мы получим отсортированный массив.
