Centroid decomposition — различия между версиями
м (→Динамическая центроидная декомпозиция (дерево центроидной декомпозиции)) |
(→Динамическая центроидная декомпозиция (дерево центроидной декомпозиции)) |
||
Строка 59: | Строка 59: | ||
* Пусть при удалении вершины <math>c</math> из дерева <math>t</math> оно распалось на поддеревья <tex>t_1, t_2,..., t_k</tex >, а центроиды этих поддеревьев - вершины < tex>c_1, c_2, ..., c_k</tex> исходного дерева, соответственно. Проведем ребра из вершины <math>c</math> в дереве <math>T</math> ребра во все вершины < tex >c_1, c_2,..., c_k</tex>. | * Пусть при удалении вершины <math>c</math> из дерева <math>t</math> оно распалось на поддеревья <tex>t_1, t_2,..., t_k</tex >, а центроиды этих поддеревьев - вершины < tex>c_1, c_2, ..., c_k</tex> исходного дерева, соответственно. Проведем ребра из вершины <math>c</math> в дереве <math>T</math> ребра во все вершины < tex >c_1, c_2,..., c_k</tex>. | ||
* Рекурсивно перейдем к построению для поддеревьев <tex>t_1, t_2,..., t_k</tex>. | * Рекурсивно перейдем к построению для поддеревьев <tex>t_1, t_2,..., t_k</tex>. | ||
+ | }} | ||
+ | {{Лемма | ||
+ | |statement= | ||
+ | Свойства центроидной декомпозиции : | ||
+ | * Глубина дерева центроидов не превосходит <tex>log(n)</tex>. | ||
+ | * Каждая вершина <math>v</math> дерева <math>t</math> является центроидом одного из поддеревьев дерева <math>T</math> | ||
+ | * Каждая вершина дерева <math>t</math> принадлежит <math>O(log(n))</math> поддеревьям дерева <math>T</math> (еще говорят, что вершина принадлежит <math>O(log(n))</math> центроидам дерева <math>t</math>) | ||
+ | |proof= | ||
+ | Действительно, т.к. размер поддерева <math>s</math> каждой вершины <math>c</math> дереве <math>T</math> не превосходит <tex>\frac{|subtree(c)|}{2}</tex>, то при спуске в каждую следующую вершину на пути к любому листу в дереве <math>T</math> размер поддерева вершины, в которой мы сейчас находимся, уменьшается как минимум на <math>2</math>. Значит длина всего пути до листа не превосходит <math>log(n)</math>, ч.т.д. | ||
+ | Второе свойство очевидно из построения дерева <math>T</math>, т.к. если вершина принадлежит дереву центроидов <math>T</math>, то она является центроидом, а из построения <math>T</math> мы знаем, что каждая вершина исходного дерева принадлежит и дереву <math>T</math>. | ||
+ | Третье свойство - прямое следствие первых двух, т.к. вершина принадлежит любому центроиду <math>c</math> т.и т.т., когда c - отец вершины <math>v</math> в дереве центроидов. Т.к. вершина <math>v</math> точно принадлежит дереву <math>T</math> (свойство 2), то она лежит на каком-то пути в дереве <math>T</math>, причем все ее родители (центроиды) ее содержат. А по свойству 1 длина любого вертикального (и даже простого) пути есть <math>O(log(n))</math>, ч.т.д. | ||
}} | }} | ||
Версия 02:08, 14 июня 2017
Centroid decomposition (рус. центроидная декомпозиция) - это структура данных, позволяющая отвечать на запросы на дереве. Чаще всего это запросы, связанные с нахождением функции на вершинах, связанных неравенством на расстояние между ними в дереве. Также иногда применяется для запросов на путях в дереве.
Содержание
Введение
Рассмотрим 2 задачи на обычном массиве (в дальнейшем мы будем их обобщать на случай дерева): Задача 1
Задача: |
Есть массив | положительных целых чисел из элементов и числа и . Требуется найти количество пар индексов массива, таких что и .
Задача 2:
Задача: |
Есть прямая дорога, на которой расположены 1) дан город 3) дан город , в котором находится больной и требуется найти такой город , что минимально возможное. 2) дан город и сказано, что больше он не будет принимать больных и сказано, что теперь он может принимать больных | городов. В некоторых городах есть госпитали, которые могут принимать больных. Поступают запросы вида :
Для начала решим обе задачи. Первая задача решается методом qevide&conqure (рус. разделяй и властвуй) - давайте разделим массив на 2 массива и и рекурсивно решим задачу для каждого из них. Осталось научиться находить количество искомых пар , таких что . Для этого воспользуемся другой известной техникой - методом двух указателей. Посчитаем массив префиксных сумм для правой половины и суффиксных ( ) - для левой. Заведем два указателя ( и ). Изначально установим . Пока и
будем уменьшать на . Если после этого , то к ответу прибавим , посго, увеличим на <math/math>. Так будем делать, пока . В конце сложим текущий ответ и ответы для половин массива - получим ответ на задачу.
Вторая задача имеет запросы на изменение и поэтому надо применить динамическую версию qevide&conqure - дерево отрезков. Построим дерево отрезков, поддерживающее 2 вида запросов : присвоение в точке и минимум на отрезке. Изначально сделаем так, чтобы дереву отрезков соответствовал массив , такой что , если в i-м городе принимает госпиталь и иначе. Когда в каком-то городе открывается/закрывается госпиталь - делаем запрос на изменение в дереве отрезков. Когда требуется узнать ближайщий госпиталь к -му городу, можно воспользоваться одной из следующих идей : а) ( ) Бинарным поиском ищем ближайший слева и ближайший справа к i-му городу госпиталь (такой город , что ). Для этого внутри бинарного поиска каждый раз делаем запрос на поиск минимума в дереве отрезков. б) ( ) Будем одним спуском/подъемом по дереву определять, куда нам нужно идти (в левое или правое поддерево), тем самым делая одновоременно и бинарный поиск, и спуск/подъем по дереву.
Статическая центроидная декомпозиция
Перейдем к обобщению поставленных задач на случай дерево. Начнем, как и полагается, с первой:
Задача: |
Есть взвешенное дерево | из вершин, в каждой вершине которого написаны положительные целые числа. Также по-прежнему даны числа и . Требуется найти количество пар вершин дерева, таких что расстояние между ними не превосходит по числу ребер и не превосходит по сумме весов.
Для решения новой задачи применим ту же идею, что и была до этого - разделяй и властвуй. Для этого нам потребуется следующий объект :
Определение: |
Центроидом дерева (англ. centroid) называется такая вершина | дерева , после удаления которой дерево разбивается на несколько ( ) поддеревьев , таких что для каждого : , т.е. размер каждого поддерева не превосходит половины размера исходного дерева.
Итак, в случае дерева идея разделяй-и-властвуй из предыдущего пункта будет формулироваться так : найдем центроид (доказательство её существования и алгоритм нахождение см. далее). Предположим, что мы сумели найти центроид за 2d-дерева отрезков, либо за с помощью техники поиска точек в d-мерном пространстве. Также читателю предлагается придумать и более эффективные и простые способы решить эту подзадачу.
, где - размер дерева. Тогда, как и в упрощенной версии задачи - рекурсивно найдем ответ для всех поддеревьев , после чего попытаемся найти недостающие пары вершин, находящиехя в разных поддеревьях и удовлетворяющих вопросу задачи. Для этого будем отвечать на следующие запросы : пусть мы сейчас считаем все пары, где первая из вершин находится в поддереве и мы в некоторой структуре данных храним все вершины остальных деревьев (каждую вершину задаем парой - глубина вершины и длина пути до нее из корня поддерева), расстояние до которых от корня их поддерева не превышает . Тогда просто пройдемся по всем вершинам поддерева и прибавим к ответу число вершин в структуре , таких, что и . Это двумерные запросы, на которые можно отвечать за с помощьюОценим итоговую асимптотику :
. Решая это рекурентное соотношение, получим .Теперь, как и было обещено, докажем лемму о существовании центроида и опишем алгоритм его эффективного поиска.
Лемма о существовании центроида и алгоритм его нахождения.
Лемма: |
В любом дереве t существует центроид. |
Доказательство: |
Рассмотрим корень дерева Итак, мы конструктивно доказали существование центроида и привели линейный относительно размера дерева алгоритм его нахождения. . Положим изначально . Изначально . Среди всех детей выберем вершину с максимальным размером поддерева. Если - не центроид, то положим и продолжим выбор нового u, иначе - остановимся. Докажем, что мы в какой-то момент остановимся. Пусть в призвольный момент времени - не центроид и размер её наддерева меньше , значит максимальное поддерево имеет размер больше чем , т.е. , а значит размер "наддерева" вершины равен . При этом теперь размер любого поддерева, на которое распадется дерево t при удалении вершины не превосходит , т.к. наддерево имеет размер меньше, чем поддерево , а любое поддерево вершины имеет хотя бы на вершину меньше (сама вершина ). По индукции получаем, что в любой момент времени размер наддерева вершины v меньше , значит мы будем спускаться только вниз по дереву , и при переходе к вершине - сыну размер максимального поддерева уменьшится как минимум на . Значит не более чем за шагов наши действия прекратятся и мы окажемся в центроиде дерева , ч.т.д. |
Динамическая центроидная декомпозиция (дерево центроидной декомпозиции)
Теперь вернемся ко второй задаче введения. Для ее решения мы пользовались динамичекой версией devide&conqure - деревом отрезков. В предыдущем пункте мы определили статический оналог devide&conqure для дерева. Теперь обобщим этот метод для динамических задач.
Определение: |
"Деревом центроидов (или центроидной декомпозицией)" дерева
| называют дерево , построенное на вершинах дерева следующим образом :
Лемма: |
Свойства центроидной декомпозиции :
|
Доказательство: |
Действительно, т.к. размер поддерева Третье свойство - прямое следствие первых двух, т.к. вершина принадлежит любому центроиду каждой вершины дереве не превосходит , то при спуске в каждую следующую вершину на пути к любому листу в дереве размер поддерева вершины, в которой мы сейчас находимся, уменьшается как минимум на . Значит длина всего пути до листа не превосходит , ч.т.д. Второе свойство очевидно из построения дерева , т.к. если вершина принадлежит дереву центроидов , то она является центроидом, а из построения мы знаем, что каждая вершина исходного дерева принадлежит и дереву . т.и т.т., когда c - отец вершины в дереве центроидов. Т.к. вершина точно принадлежит дереву (свойство 2), то она лежит на каком-то пути в дереве , причем все ее родители (центроиды) ее содержат. А по свойству 1 длина любого вертикального (и даже простого) пути есть , ч.т.д. |