
- •Билет 1. Типы и структуры данных
- •Диапазонные
- •Статические
- •Динамические
- •Перечислимые
- •Предопределенные
- •Билет 2. Простые типы. Операции. Типизация.
- •Билет 3. Массивы
- •Билет 4. Записи
- •Билет 5. Объединения
- •Билет 6. Множества
- •Билет 7. Последовательности
- •Билет 9. Стеки
- •Билет 10.Очереди
- •Линейный список, сложность операции o(1)
- •Билет 11. Динамические структуры данных.
- •Билет 12. Деревья. Общие определения
- •Билет 13. Двоичные деревья
- •Билет 14. Деревья поиска
- •Билет 15. Авл-сбалансированные деревья
- •Билет 16. Б-деревья
- •Билет 17. Дб- и сдб-деревья.
- •Билет 18. Характеристики сбалансированных деревьев.
- •Билет 19. Дерево оптимального поиска.
- •Билет 20. Splay-дерево
- •Splay (расширение)
Билет 20. Splay-дерево
Расширяющееся дерево является двоичным деревом поиска, в котором поддерживается свойство сбалансированности. Это дерево принадлежит классу «саморегулирующихся деревьев», которые поддерживают необходимый баланс ветвления дерева, чтобы обеспечить выполнение операций поиска, добавления и удаления за логарифмическое время от числа хранимых элементов. Это реализуется без использования каких-либо дополнительных полей в узлах дерева (как, например, в Красно-чёрных деревьях или АВЛ-деревьях, где в вершинах хранится, соответственно, цвет вершины и глубина поддерева). Вместо этого «расширяющие операции» (splay operation), частью которых являются вращения, выполняются при каждом обращении к дереву. Учётная стоимость в расчёте на одну операцию с деревом составляет O(logn). Идея: после обращения к вершине мы поднимаем ее к корню.
Операции:
Splay (расширение)
Основная операция дерева. Заключается в перемещении вершины в корень при помощи последовательного выполнения трёх операций: Zig, Zig-Zig и Zig-Zag. Обозначим вершину, которую хотим переместить в корень за x, её родителя - p, а родителя p (если существует) - g.
Zig: выполняется, когда p является корнем.
Zig-Zig: выполняется, когда и x, и p являются левыми (или правыми) сыновьями. Дерево поворачивается по ребру между g и p, а потом - по ребру между p и x.
Zig-Zag: выполняется, когда x является правым сыном, а p - левым (или наоборот). Дерево поворачивается по ребру между p и x, а затем - по ребру между x и g.
С одной стороны, О((m+n)log n + m) – сложность доступа, n – количество вершин. В данном случае дерево ведет себя как сбалансированное. С другой стороны, если к каждому элементу осуществлялся хотя бы 1 доступ, то дерево ведет себя как дерево оптимального поиска, О(m+sum(qi lg(m/qi))). Операции над Splay-деревьями:
Поиск элемента: Если ключ найден, то применяется splay к нему. Иначе применяется к последней вершине, к которой осуществлялся доступ.
Добавление элемента: Вставка -> Splay
Удаление элемента: Удаление -> Splay к родителю
Объединение двух деревьев:
t1 t2
Ищем максимальную вершину в t1, проводим с ней splay и ставим ее в корень нового дерева.
Split (разделение дерева на две части):
Поиск и splay вершины х, по которой будем делить -> Разделяем либо по одному, либо по второму ребру.