СНМ с операцией удаления за О(1) — различия между версиями
(→Расширение структуры данных) |
|||
Строка 1: | Строка 1: | ||
Реализация системы непересекающихся множеств с помощью [[СНМ_(реализация_с_помощью_леса_корневых_деревьев)|леса корневых деревьев]] не поддерживает операцию удаления элемента из множества. Приведенная ниже модификация этой структуры данных вводит поддержку операции удаления за О(1) в худшем случае, сохраняя асимптотику для операций Union и Find и потребление памяти O(n). | Реализация системы непересекающихся множеств с помощью [[СНМ_(реализация_с_помощью_леса_корневых_деревьев)|леса корневых деревьев]] не поддерживает операцию удаления элемента из множества. Приведенная ниже модификация этой структуры данных вводит поддержку операции удаления за О(1) в худшем случае, сохраняя асимптотику для операций Union и Find и потребление памяти O(n). | ||
+ | |||
+ | == Введение == | ||
+ | |||
+ | Наша структура данных должна поддерживать следующие операции: | ||
+ | |||
+ | * <tex>makeset(x)</tex> - создать новое множество из 1 элемента <tex>x </tex>. Время: <tex>O(1)</tex> | ||
+ | * <tex>union(A, B)</tex> - объединить множества A и B в одно. Время: <tex> O(1) </tex>, без учета времени на операцию <tex>find()</tex>, которая используется, если множества A и B заданы своими произвольными представителями. | ||
+ | * <tex>find(x)</tex> - найти множество, в котором содержится элемент <tex> x </tex>. Время; <tex>O(log n)</tex> в худшем случае, <tex>O(\alpha(n))</tex> - в среднем (<tex>\alpha(n)</tex> - обратная функция Аккермана), где n - размер множества. | ||
+ | * <tex>delete(x)</tex> - удалить элемент x из содержащего его множества. Время: O(1) | ||
+ | |||
+ | В дальнейшем мы будем использовать следующие понятия и обозначения: | ||
+ | |||
+ | * <tex>size(A)</tex> - размер множества A (количество элементов в нем). | ||
+ | * <tex>root(T_A)</tex> - корень дерева <tex>T_A</tex> | ||
+ | * <tex>h(v)</tex> - высота вершины <tex>v</tex>: если <tex>v</tex> является листом, то <tex>h(v) = 0</tex>, иначе <tex>h(v) = max { h(w) | w - ребенок v } </tex>. | ||
+ | * <tex>p(v)</tex> - родитель вершины <tex>v</tex>. Если <tex>v</tex> - корень, то считаем, что <tex>p(v) = v</tex> | ||
+ | * <tex>rank(v)</tex> - ранг вершины, некоторая верхняя оценка на ее высоту. Как и в [[СНМ_(реализация_с_помощью_леса_корневых_деревьев)|обычной реализации]], выполнено следующее: '''ранг родителя вершин | ||
+ | |||
== Реализация == | == Реализация == | ||
=== Расширение структуры данных === | === Расширение структуры данных === |
Версия 20:18, 31 мая 2014
Реализация системы непересекающихся множеств с помощью леса корневых деревьев не поддерживает операцию удаления элемента из множества. Приведенная ниже модификация этой структуры данных вводит поддержку операции удаления за О(1) в худшем случае, сохраняя асимптотику для операций Union и Find и потребление памяти O(n).
Введение
Наша структура данных должна поддерживать следующие операции:
- - создать новое множество из 1 элемента . Время:
- - объединить множества A и B в одно. Время: , без учета времени на операцию , которая используется, если множества A и B заданы своими произвольными представителями.
- - найти множество, в котором содержится элемент . Время; в худшем случае, - в среднем ( - обратная функция Аккермана), где n - размер множества.
- - удалить элемент x из содержащего его множества. Время: O(1)
В дальнейшем мы будем использовать следующие понятия и обозначения:
- - размер множества A (количество элементов в нем).
- - корень дерева
- - высота вершины : если является листом, то , иначе .
- - родитель вершины . Если - корень, то считаем, что
- обычной реализации, выполнено следующее: ранг родителя вершин - ранг вершины, некоторая верхняя оценка на ее высоту. Как и в
Реализация
Расширение структуры данных
Расширим лес корневых деревьев следующим образом:
- Для каждой вершины дерева, не являющейся листом, будем хранить двусвязный список ее детей. Будем считать, что дети упорядочены по направлению списка слева направо.
- Для корня каждого дерева храним двусвязный список его детей, не являющихся листьями.
- Для каждого дерева (включая поддеревья) храним циклический двусвязный список его вершин, располагаемых в порядке обхода в глубину, начиная с левой вершины.
- Разделим понятия вершина дерева и элемент множества:
- вершиной дерева назовем объект, содержащий ссылки , и (где необходимо) для каждого из вышеперечисленных списков, а так же ссылку на соответствующий вершине элемент множества;
- элемент множества - объект, содержащий значение элемента и ссылку на соотв. вершину дерева.
Введем также следующие определения:
Определение: |
Дерево, либо состоящее ровно из одной вершины, либо же из 1 вершины ранга 1 и листьев ранга 0, называется сокращенным (reduced) |
Определение: |
Дерево называется полным, если каждый из его узлов либо является листом с рангом 0, либо имеет не менее 3 детей. |
В нашей структуре данных будет поддерживаться следующий инвариант: дерево является либо только полным, либо только сокращенным.
Этот инвариант влечет за собой очевидные следствия:
- Все деревья (и поддеревья) размера < 4 - сокращенные, а >= 4 - полные
- Каждая вершина, среди детей которой есть хотя бы 1 нелистовая вершина, имеет не менее 3 детей (это не позволяет дереву вытягиваться в бамбук, например)