Деревья Эйлерова обхода — различия между версиями
Sokolova (обсуждение | вклад) (→Задача о динамической связности) |
Sokolova (обсуждение | вклад) (→Изменение корня дерева (переподвешивание)) |
||
Строка 39: | Строка 39: | ||
Дано дерево с корнем в вершине <tex>a</tex>. Требуется переподвесить его к вершине <tex>h</tex>. | Дано дерево с корнем в вершине <tex>a</tex>. Требуется переподвесить его к вершине <tex>h</tex>. | ||
− | [[Файл: | + | [[Файл:Tour14.png |thumb|320px|center]] |
Для переподвешивания (англ. ''rerooting'') необходимо: | Для переподвешивания (англ. ''rerooting'') необходимо: | ||
Строка 46: | Строка 46: | ||
*Соединить в следующем порядке: <tex>H</tex>, <tex>S2 </tex>, <tex>S1 </tex>. | *Соединить в следующем порядке: <tex>H</tex>, <tex>S2 </tex>, <tex>S1 </tex>. | ||
*Добавить <tex>\{h\}</tex> в конец последовательности. | *Добавить <tex>\{h\}</tex> в конец последовательности. | ||
+ | |||
+ | [[Файл:Tour13.png |thumb|320px|center]] | ||
В результате получим: | В результате получим: |
Версия 12:44, 11 декабря 2016
Содержание
Задача о динамической связности
Задача: |
Для динамически изменяющегося дерева выполнить следующие запросы:
|
Определение: |
Дерево эйлерова обхода (англ.Euler tour tree) — способ представления динамического дерева, позволяющий выполнять указанные запросы за | .
Представление деревьев в виде эйлерова графа
Для представления дерева в виде эйлерового графа заменим каждое ребро дерева на два ребра и .
Получившийся ориентированный граф будет эйлеровым согласно критерию.
Свойство эйлерова обхода
Представим дерево в виде последовательности вершин, посещеннных в порядке эйлерова обхода с корнем в вершине
.При этом последовательность вершин между первым и последним вхождением вершины
дает эйлеров обход поддерева с корнем .Операции
Изменение корня дерева (переподвешивание)
Дано дерево с корнем в вершине
. Требуется переподвесить его к вершине .Для переподвешивания (англ. rerooting) необходимо:
- Разбить эйлеров обход на три части , , и , где состоит из вершин между первым и последним вхождением нового корня .
- Удалить первую вершину в .
- Соединить в следующем порядке: , , .
- Добавить в конец последовательности.
В результате получим:
Добавление ребра
Для связывания деревьев
и , где , а добавлением ребра необходимо:- Переподвесить дерево к вершине .
- Переподвесить дерево к вершине .
- Соединить получившиеся эйлеровы обходы.
- Добавить в конец последовательности.
В результате получим:
Разрезание ребра
Для разбиения дерева на два поддерева путем разрезания ребра
необходимо:- Переподвесить дерево к вершине .
- Разделить дерево на части , где отрезок между первым и последним вхождением вершины .
- Эйлеров обход первого поддерева образуется соединением и , с удалением повторного в месте их соединения.
- Эйлеров обход второго поддерева образует .
В результате получим:
Реализация структуры
Задача: |
Определить структуру данных для хранения эйлеровых обходов деревьев для наиболее эффективного выполнения указанных операций. |
При представлении деревьев в виде их эйлерова обхода выполнение каждой операции и сводится к соединений и разбиений отрезков в последовательности вершин эйлерова обхода.
Рассмотрим следующие структуры данных для определения времени выполнения разбиения и соединения последовательностей, а также определение принадлежности вершин одной компоненте связности.
Связные списки
Каждое разбиение и соединение последовательностей требует .
Для каждой вершины будем хранить указатели на первое и последнее вхождение вершины в последовательность. Тогда возможно определять первое и последнее вхождение вершины за
.Однако,используя двусвязные списки определение принадлежности вершин одной компоненте связности занимает в худшем случае.
Balanced Trees
Представим последовательность вершин эйлерова обхода в виде сбалансированного двоичного дерева. Будем использовать красно-черное дерево.
Объединение и разделение красно-черных деревьев выполняется за
.Для каждой вершины храним указатели на её первое и последнее вхождение в последовательность. Значит, имеем доступ к ним за
.Запрос о принадлежности вершин к одной компоненте связности выполняется за
проверкой лежат ли эти вершины в одном дереве.