- •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. Графы. Построение минимального остовного дерева. Алгоритм Крускала
13. Сбалансированные деревья. Авл-деревья. Алгоритм добавления нового узла
Сбалансированное дерево – сбалансированное по высоте двоичное дерево поиска.
Для каждой его вершины высота её двух поддеревьев различается не более чем на 1 (в случае АВЛ), количество черных узлов совпадает (в случае КЧ дерева), в последнем уровне нет ''дырок'' (в случае 2-3-4… дерева).
АВЛ-дерево — сбалансированное по высоте двоичное дерево поиска: для каждой его вершины высота её двух поддеревьев различается не более чем на 1.
В каждом узле АВЛ-дерева, помимо ключа, данных и указателей на левое и правое поддеревья (левого и правого сыновей), хранится показатель баланса – разность высот правого и левого поддеревьев.
Алгоритм добавления нового узла.
Проходим по дереву поиска, пока не убедимся, что добавляемого ключа в дереве нет.
Включения новой вершины в дерево
Определения результирующих показателей балансировки.
«Отступления» назад по пути поиска и проверки в каждой вершине показателя сбалансированности.
Если необходимо — балансировка.
Балансировка:
Будем возвращать в качестве результата функции, уменьшилась высота дерева или нет. Предположим, что процесс из левой ветви возвращается к родителю (рекурсия идет назад), тогда возможны три случая: { hl — высота левого поддерева, hr — высота правого поддерева } Включение вершины в левое поддерево приведет к
+
hl < hr: выравняется hl = hr. Ничего делать не нужно.
hl = hr: теперь левое поддерево будет больше на единицу, но балансировка пока не требуется.
hl > hr: теперь | hl — hr | = 2, — требуется балансировка. В данной ситуации требуется определить балансировку левого поддерева. Если левое поддерево этой вершины выше правого , то требуется большое правое вращение, иначе хватит малого правого. Аналогичные (симметричные) рассуждения можно привести и для включение в правое поддерево.
14. Сбалансированные деревья. Авл-деревья. Алгоритм удаления существующего узла
Сбалансировзнное дерево – сбалансированнoe по высоте двоичное дерево поиска.
Для каждой его вершины высота её двух поддеревьев различается не более чем на 1 (в случае АВЛ), количество черных узлов совпадает (в случае КЧ дерева), в последнем уровне нет ''дырок'' (в случае 2-3-4… дерева).
АВЛ-дерево — сбалансированное по высоте двоичное дерево поиска: для каждой его вершины высота её двух поддеревьев различается не более чем на 1.
В каждом узле АВЛ-дерева, помимо ключа, данных и указателей на левое и правое поддеревья (левого и правого сыновей), хранит-ся показатель баланса – разность высот правого и левого поддере-вьев.
Рекурсивный алгоритм удаления.
Если вершина — лист, то удалим её и вызовем балансировку всех её предков в порядке от родителя к корню.
Иначе найдём самую близкую по значению вершину в поддереве наибольшей высоты (правом или левом) и переместим её на место удаляемой вершины, при этом вызвав процедуру её удаления.
Докажем, что данный алгоритм сохраняет балансировку. Для этого докажем по индукции по высоте дерева, что после удаления некоторой вершины из дерева и последующей балансировки высота дерева уменьшается не более, чем на 1. База индукции: Для листа очевидно верно. Шаг индукции: Либо условие балансированности в корне (после удаления корень может измениться) не нарушилось, тогда высота данного дерева не изменилась, либо уменьшилось строго меньшее из поддеревьев => высота до балансировки не изменилась => после уменьшится не более чем на 1.
В
результате указанных действий процедура
удаления вызывается не более 3 раз, так
как у вершины, удаляемой по второму
вызову, нет одного из поддеревьев. Но
поиск ближайшего каждый раз
требует
операций.
Становится очевидной возможность
оптимизации: поиск ближайшей в ершины
может быть выполнен по краю поддерева,
что сокращает сложность до
.
Нерекурсивное удаление из АВЛ-дерева сверху вниз:
Найдём вершину, удаление из которой не приведёт к изменению её высоты.
Существует два случая:
высота левого поддерева равна высоте правого поддерева (исключая случай, когда у листа нет поддеревьев)
высота дерева по направлению движения меньше противоположной(«брат» направления) и баланс «брата» равен 0 (разбор этого варианта довольно сложен, так что пока без доказательства)
Найденная удаляемая вершина заменяется значением из левой подветви.
+
ищем удаляемый элемент и попутно находим нашу замечательную вершину
производим изменение балансов, в случае необходимости делаем ребалансировку
удаляем наш элемент (в действительности не удаляем, а заменяем его ключ и значение, учёт перестановок вершин будет немного сложнее)
