Centroid decomposition — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Введение)
(Введение)
Строка 3: Строка 3:
 
== Введение ==
 
== Введение ==
 
Рассмотрим 2 задачи на обычном массиве (в дальнейшем мы будем их обобщать на случай дерева):
 
Рассмотрим 2 задачи на обычном массиве (в дальнейшем мы будем их обобщать на случай дерева):
 
+
Задача 1 :
 
{{Задача
 
{{Задача
|definition = Есть прямая дорога, на которой расположены <tex>n</tex> городов. В некоторых городах есть госпитали, которые могут принимать больных. Поступают запросы вида : дан город <tex>v</tex>, в котором находится больной и требуется найти такой город <tex>u</tex>, что <tex>abs{u - v}</tex> минимально возможное.
+
|definition = Есть прямая дорога, на которой расположены <tex>n</tex> городов. В некоторых городах есть госпитали, которые могут принимать больных. Поступают запросы вида :
 +
1) дан город <tex>v</tex>, в котором находится больной и требуется найти такой город <tex>u</tex>, что <tex>abs{u - v}</tex> минимально возможное.
 +
2) дан город <tex>v</tex> и сказано, что больше он не будет принимать больных
 +
3) дан город <tex>v</tex> и сказано, что теперь он может принимать больных
 
}}
 
}}
 
+
Задача 2:
 
 
 
{{Задача
 
{{Задача
|definition = Есть массив <tex>a[]</tex> из <tex>n</tex> элементов и числа <tex>W</tex> и <tex>l</tex> . Требуется найти количество пар <tex>(i, j)</tex> индексов массива, таких что <tex>|j - i| <= l </tex> и <tex>\sum_{i=0}^{n - 1} [a[i]] <= W</tex>.
+
|definition = Есть массив <tex>a[]</tex> положительных целых чисел из <tex>n</tex> элементов и числа <tex>W >= 0</tex> и <tex>l</tex> . Требуется найти количество пар <tex>(i, j)</tex> индексов массива, таких что <tex>|j - i| <= l </tex> и <tex>\sum_{i=0}^{n - 1} [a[i]] <= W</tex>.
 
}}
 
}}
 +
Для начала решим обе задачи. Вторая задача решается методом [[Сортировка_слиянием|qevide&conqure (рус. разделяй и властвуй)]] - давайте разделим массив <tex>a[0...n-1]</tex> на 2 массива <tex>a[0...\frac{n}{2} - 1]</tex> и <tex>a[\frac{n}{2}...n-1]</tex> и рекурсивно решим задачу для каждого из них. Осталось научиться находить количество искомых пар <tex>(i, j)</tex>, таких что <tex>i < \frac{n}{2}, j >= \frac{n}{2}</tex>. Для этого воспользуемся другой известной техникой - методом двух указателей. Посчитаем массив префиксных сумм для правой половины <tex>pref[i] = \sum_{j=n/2}^{i} [a[j]]</tex> и суффиксных (<tex>suf[i] = \sum_{j=i}^{n/2 + 1} [a[i]]</tex>) - для левой. Заведем два указателя (<tex>p1</tex> и <tex>p2</tex>). Изначально установим <tex>p1 = \frac{n}{2} - l + 1, p2 = \frac{n}{2}</tex>. Пока <tex>p2 > \frac{n}{2}</tex> и <tex>p2 > </tex>.
  
 
== Статическая центроидная декомпозиция ==
 
== Статическая центроидная декомпозиция ==

Версия 23:49, 13 июня 2017

Centroid decomposition (рус. центроидная декомпозиция) - это структура данных, позволяющая отвечать на запросы на дереве. Чаще всего это запросы, связанные с нахождением функции на вершинах, связанных неравенством на расстояние между ними в дереве. Также иногда применяется для запросов на путях в дереве.

Введение

Рассмотрим 2 задачи на обычном массиве (в дальнейшем мы будем их обобщать на случай дерева): Задача 1 :

Задача:
Есть прямая дорога, на которой расположены [math]n[/math] городов. В некоторых городах есть госпитали, которые могут принимать больных. Поступают запросы вида :

1) дан город [math]v[/math], в котором находится больной и требуется найти такой город [math]u[/math], что [math]abs{u - v}[/math] минимально возможное. 2) дан город [math]v[/math] и сказано, что больше он не будет принимать больных

3) дан город [math]v[/math] и сказано, что теперь он может принимать больных

Задача 2:

Задача:
Есть массив [math]a[][/math] положительных целых чисел из [math]n[/math] элементов и числа [math]W \gt = 0[/math] и [math]l[/math] . Требуется найти количество пар [math](i, j)[/math] индексов массива, таких что [math]|j - i| \lt = l [/math] и [math]\sum_{i=0}^{n - 1} [a[i]] \lt = W[/math].

Для начала решим обе задачи. Вторая задача решается методом qevide&conqure (рус. разделяй и властвуй) - давайте разделим массив [math]a[0...n-1][/math] на 2 массива [math]a[0...\frac{n}{2} - 1][/math] и [math]a[\frac{n}{2}...n-1][/math] и рекурсивно решим задачу для каждого из них. Осталось научиться находить количество искомых пар [math](i, j)[/math], таких что [math]i \lt \frac{n}{2}, j \gt = \frac{n}{2}[/math]. Для этого воспользуемся другой известной техникой - методом двух указателей. Посчитаем массив префиксных сумм для правой половины [math]pref[i] = \sum_{j=n/2}^{i} [a[j]][/math] и суффиксных ([math]suf[i] = \sum_{j=i}^{n/2 + 1} [a[i]][/math]) - для левой. Заведем два указателя ([math]p1[/math] и [math]p2[/math]). Изначально установим [math]p1 = \frac{n}{2} - l + 1, p2 = \frac{n}{2}[/math]. Пока [math]p2 \gt \frac{n}{2}[/math] и [math]p2 \gt [/math].

Статическая центроидная декомпозиция

Динамическая центроидная декомпозиция (дерево центроидной декомпозиции)

Варианты реализации

См. также

Примечания