Изменения

Перейти к: навигация, поиск

Level Ancestor problem

138 байт добавлено, 16:15, 15 мая 2019
Нет описания правки
После этого посчитаем двоичные подъемы для каждой вершины за <tex>O(\log n)</tex>, что соответственно не ухудшит асимптотику.
 
=== Псевдокод ===
Пусть после этого нам пришел запрос <tex>LA(v, k)</tex>.
Рассмотрим путь, на котором лежит вершина <tex>v</tex> до удвоения. Он длины хотя бы <tex>2^i</tex>, так как мы точно знаем, что существует вершина потомок <tex>v</tex>, расстояние до которого ровно <tex>2^i</tex> (это вершина, из которой мы только что пришли). Значит, после удвоения этот путь стал длины хотя бы <tex>2^{i + 1}</tex>, причем хотя бы <tex>2^i</tex> вершин в нем - предки <tex>v</tex>. Это означает, что вершина, которую мы ищем, находится на этом пути (иначе бы мы могли до этого прыгнуть еще на <tex>2^i</tex> вверх). Так как мы знаем позицию <tex>v</tex> в этом пути, то нужную вершину мы можем найти за <tex>O(1)</tex>.
Таким образом, наш алгоритм работает за < <tex>O(n\log n), O(1)</tex> >времени и за <tex>O(n\log n)</tex> памяти. Методом четырех русских данный метод можно улучшить до < <tex>O(n), O(1)</tex> > с помощью оптимизации предподсчета.
== The Macro-Micro-Tree Algorithm ==
В данном разделе мы докажем, что предподсчет предыдущего алгоритма можно улучшить до <tex>O(n)</tex>.
*Забудем на время про удаленные поддеревья, для оставшегося дерева наш алгоритм работает за < <tex>O(\dfrac{n}{S(n)} \log n + n), O(1)</tex> >. Получаем алгоритм < <tex>O(n), O(1) </tex> >. Для удаленных поддеревьев же выполним полный предподсчет: таких деревьев не более чем <tex>2^{2S(n)}</tex>, что дает асимптотику предподсчета <tex>O(\sqrt{n} \log^2{n}) = o(n) = O(n)</tex>.
В итоге полученный алгоритм действительно работает за < <tex>O(n), O(1)</tex> >времени и за <tex>O(n)</tex> памяти.
== Источники информации ==
Анонимный участник

Навигация