Деревья Эйлерова обхода — различия между версиями
Sokolova (обсуждение | вклад) (→Представление деревьев в виде эйлерова графа) |
Sokolova (обсуждение | вклад) (→Добавление ребра) |
||
| Строка 63: | Строка 63: | ||
Для связывания деревьев <tex>T1 </tex> и <tex>T2</tex>, где <tex>c\in T1\ </tex>, а <tex>g\in T2\</tex> добавлением ребра <tex>\{c, g\} \</tex> необходимо: | Для связывания деревьев <tex>T1 </tex> и <tex>T2</tex>, где <tex>c\in T1\ </tex>, а <tex>g\in T2\</tex> добавлением ребра <tex>\{c, g\} \</tex> необходимо: | ||
| − | *Переподвесить дерево <tex>T1</tex> к вершине <tex>c</tex>. | + | *Переподвесить дерево <tex>T1</tex> к вершине <tex>c</tex>, если корнем дерева была другая вершина. |
| − | *Переподвесить дерево <tex>T2</tex> к вершине <tex>g</tex>. | + | *Переподвесить дерево <tex>T2</tex> к вершине <tex>g</tex>, если корнем дерева была другая вершина. |
*Соединить получившиеся эйлеровы обходы. | *Соединить получившиеся эйлеровы обходы. | ||
*Добавить <tex>\{c\}</tex> в конец последовательности. | *Добавить <tex>\{c\}</tex> в конец последовательности. | ||
| Строка 70: | Строка 70: | ||
[[Файл:Link2.png|thumb|400px |center]] | [[Файл:Link2.png|thumb|400px |center]] | ||
| − | В результате получим: | + | В результате получим эйлеров обход дерева с корнем в вершине <tex>c</tex>: |
[[Файл:Link3.png|center]] | [[Файл:Link3.png|center]] | ||
Версия 21:39, 18 декабря 2016
Содержание
Задача о динамической связности
| Задача: |
Для динамически изменяющегося дерева выполнить следующие запросы:
|
Для решения поставленной задачи будем представлять дерево в виде его эйлерова графа, а затем будем работать с эйлеровым обходом (англ.Euler tour tree) этого графа. Это позволит выполнять указанные запросы за .
Представление деревьев в виде эйлерова графа
Для представления дерева в виде эйлерового графа заменим каждое ребро дерева на два ребра и .
Получившийся ориентированный граф будет эйлеровым согласно критерию.
Представим дерево с корнем в вершине в виде последовательности вершин, посещеннных в порядке эйлерова обхода.
| Утверждение: |
Последовательность вершин между первым и последним вхождениями вершины в эйлеров обход дерева, представляет эйлеров обход поддерва с корнем в . |
|
Действительно, при обходе дерева последний раз выйдем из вершины, только после посещения всех вершин ее поддерева. |
Операции c эйлеровыми обходами
Представление деревьев в виде их эйлеровых обходов позволяет свести задачу о динамической связности к следующим операциям с последовательностями вершин:
Изменение корня дерева (переподвешивание)
Дано дерево с корнем в вершине . Требуется переподвесить его к вершине .
Для переподвешивания (англ. rerooting) необходимо:
- Разбить эйлеров обход на три части:
- - вершины, посещенные эйлеровым обходом до захода в .
- - вершины между первым и последним вхождением нового корня .
- - вершины, посещенные эйлеровым обходом после выхода из .
- Удалить первую вершину в .
- Соединить в следующем порядке: , , .
- Добавить в конец последовательности.
В результате получим:
Добавление ребра
Для связывания деревьев и , где , а добавлением ребра необходимо:
- Переподвесить дерево к вершине , если корнем дерева была другая вершина.
- Переподвесить дерево к вершине , если корнем дерева была другая вершина.
- Соединить получившиеся эйлеровы обходы.
- Добавить в конец последовательности.
В результате получим эйлеров обход дерева с корнем в вершине :
Разрезание ребра
Для разбиения дерева на два поддерева путем разрезания ребра необходимо:
- Переподвесить дерево к вершине .
- Разделить дерево на части , где отрезок между первым и последним вхождением вершины .
- Эйлеров обход первого поддерева образуется соединением и , с удалением повторного в месте их соединения.
- Эйлеров обход второго поддерева образует .
В результате получим:
Реализация структуры
| Задача: |
| Определить структуру данных для хранения эйлеровых обходов деревьев для наиболее эффективного выполнения указанных операций. |
При представлении деревьев в виде их эйлерова обхода выполнение каждой операции и сводится к соединений и разбиений отрезков в последовательности вершин эйлерова обхода.
Рассмотрим следующие структуры данных для определения времени выполнения разбиения и соединения последовательностей, а также определение принадлежности вершин одной компоненте связности.
Связные списки
Каждое разбиение и соединение последовательностей требует .
Для каждой вершины будем хранить указатели на первое и последнее вхождение вершины в последовательность. Тогда возможно определять первое и последнее вхождение вершины за .
Однако,используя двусвязные списки определение принадлежности вершин одной компоненте связности занимает в худшем случае.
Balanced Trees
Представим последовательность вершин эйлерова обхода в виде сбалансированного двоичного дерева. Будем использовать красно-черное дерево.
Объединение и разделение красно-черных деревьев выполняется за .
Для каждой вершины храним указатели на её первое и последнее вхождение в последовательность. Значит, имеем доступ к ним за .
Запрос о принадлежности вершин к одной компоненте связности выполняется за проверкой лежат ли эти вершины в одном дереве.













