Rake-Compress деревья — различия между версиями
Shersh (обсуждение | вклад) м (переименовал Rake-Compress Tree в Rake-Compress деревья: хочу русское название) |
(→Построение) |
||
Строка 39: | Строка 39: | ||
==Построение== | ==Построение== | ||
+ | Для того, чтобы отвечать на запросы относительно структуры леса необходимо сохранить информацию о том, как происходил процесс сжатия леса. Для этого будем хранить таблицу, в каждой строке которой записана информация о структуре леса после выполнения операций. Каждая клетка таблицы будет хранить информацию о вершине после выполнения операций <tex>\mathrm{Rake}</tex> и <tex>\mathrm{Compress}</tex>. Из информации будем сохранять родителя вершины, множество детей и метку, сжата ли вершина.<br> | ||
+ | Пример таблицы для следующей последовательности операций: | ||
+ | [[Файл:RC_tree_example.png|x200px|thumb|Пример выполнения операций.]] | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! Шаг | ||
+ | ! align="center" | Операция | ||
+ | ! <tex>1</tex> | ||
+ | ! <tex>2</tex> | ||
+ | ! <tex>3</tex> | ||
+ | ! <tex>4</tex> | ||
+ | |- | ||
+ | | align="center" | 4 | ||
+ | | align="center" | <tex>\mathrm{Rake}</tex> | ||
+ | | Родитель: {{---}}<br>Дети: <tex>\emptyset</tex> | ||
+ | | align="center" | {{---}} | ||
+ | | align="center" | {{---}} | ||
+ | | align="center" | {{---}} | ||
+ | |- | ||
+ | | align="center" | 3 | ||
+ | | align="center" | <tex>\mathrm{Compress}</tex> | ||
+ | | Родитель: {{---}}<br>Дети: <tex>\{3\}</tex> | ||
+ | | align="center" | {{---}} | ||
+ | | Родитель: <tex>1</tex><br>Дети: <tex>\emptyset</tex> | ||
+ | | align="center" | {{---}} | ||
+ | |- | ||
+ | | align="center" | 2 | ||
+ | | align="center" | <tex>\mathrm{Rake}</tex> | ||
+ | | Родитель: {{---}}<br>Дети: <tex>\{2\}</tex> | ||
+ | | Родитель: <tex>1</tex><br>Дети: <tex>\{3\}</tex> | ||
+ | | Родитель: <tex>2</tex><br>Дети: <tex>\emptyset</tex> | ||
+ | | align="center" | {{---}} | ||
+ | |- | ||
+ | | align="center" | 1 | ||
+ | | | ||
+ | | Родитель: {{---}}<br>Дети: <tex>\{2\}</tex> | ||
+ | | Родитель: <tex>1</tex><br>Дети: <tex>\{3\}</tex> | ||
+ | | Родитель: <tex>2</tex><br>Дети: <tex>\{4\}</tex> | ||
+ | | Родитель: <tex>3</tex><br>Дети: <tex>\emptyset</tex> | ||
+ | |} | ||
==Возможность параллельного построения== | ==Возможность параллельного построения== |
Версия 16:31, 24 апреля 2016
Задача, которая решается с помощью динамических деревьев (англ. dynamic tree), формулируется следующим образом. Необходимо поддерживать лес деревьев и выполнять на нем следующие операции:
- добавить ребро . Вершина должна быть корнем некоторого дерева. Вершины и должны находиться в разных деревьях,
- удалить ребро . Ребро должно присутствовать в графе,
- некоторый запрос относительно структуры дерева.
Примером последней операции может быть запрос "достижима ли вершина
из ?", "сколько ребер на кратчайшем пути из в ?" или "какова сумма номеров вершин, которые находятся в поддереве вершины ?". Можно легко реализовать структуру данных, которая будет выполнять данные операции за время , где — количество вершин в графе. Динамические деревья нужны для того, чтобы обрабатывать запросы более эффективно. В частности, все предложенные операции возможно выполнять за время .Содержание
Описание
Rake-Compress Tree — структура данных, которая хранит лес деревьев и поддерживает следующие операции:
- — все листья дерева сжимаются к своим родителям,
- — выбирается и объединяется некоторое множество несмежных друг с другом вершин, имеющих ровно одного сына.
Входными данными для алгоритма Rake-Compress является лес корневых деревьев. К нему поочередно применяются операции
Во время каждой из этих операций выбирается некоторое множество попарно несмежных вершин, которое сжимается к своим родителям. После каждой операции лес сохраняется в специальном виде, что в дальнейшем дает возможность отвечать на запросы о структуре леса.
Современная реализация Rake-Compress деревьев была предложена Р. А. Тарьяном и Р. Ф. Вернеком.
Рассмотрим, как изменяется количество вершин в дереве после применения к нему операций
и . Разобьём все вершины дерева на три группы: входящая степень которых равна нулю, одному и больше одного. Обозначим их количество за и соответственно.Лемма (1): |
. |
Доказательство: |
Докажем по индукции по высоте дерева. |
Лемма (2): |
После применения операций и к лесу, математическое ожидание количества вершин в нём не превосходит от их исходного числа. |
Доказательство: |
Математическое ожидание количества удаленных вершин |
Теорема: |
Математическое ожидание количества операций и , которые будут выполнены до полного сжатия дерева, равно , где — общее количество вершин. |
Доказательство: |
Из леммы 2 известно, что после каждой итерации применения операций | и число вершин в среднем уменьшается в константное число раз. Значит, количество итераций в среднем ограничено .
Построение
Для того, чтобы отвечать на запросы относительно структуры леса необходимо сохранить информацию о том, как происходил процесс сжатия леса. Для этого будем хранить таблицу, в каждой строке которой записана информация о структуре леса после выполнения операций. Каждая клетка таблицы будет хранить информацию о вершине после выполнения операций
Пример таблицы для следующей последовательности операций:
Шаг | Операция | ||||
---|---|---|---|---|---|
4 | Родитель: — Дети: |
— | — | — | |
3 | Родитель: — Дети: |
— | Родитель: Дети: |
— | |
2 | Родитель: — Дети: |
Родитель: Дети: |
Родитель: Дети: |
— | |
1 | Родитель: — Дети: |
Родитель: Дети: |
Родитель: Дети: |
Родитель: Дети: |
Возможность параллельного построения
Операции
и можно выполнять параллельно для всех вершин. Если предположить, что множество детей можно пересчитывать за , то Rake-Compress дерево можно построить за в модели PRAM в случае наличия процессоров.Пример выполнения операций
Применения
- Задача MST online: дан граф из вершин, в который добавляются новые рёбра. Необходимо поддерживать минимальный остовный лес для данного графа,
- Задача о максимальном потоке: в помощью динамических деревьев можно улучшить ассимптотику алгоритма Диница с до .
См. также
Источники информации
- Wikipedia — Parallel Tree Contraction
- Б. Ю. Минаев — Реализация динамических Rake-Compress деревьев в случае отсутствия ограничения на степени вершин
- G. L. Miller, J. H. Reif — Parallel Tree Contraction
- R. Werneck — Design and Analysis of Data Structures for Dynamic Trees