Сведение задачи LCA к задаче RMQ — различия между версиями
Строка 16: | Строка 16: | ||
3) Построим дерево отрезков по полученному массиву. | 3) Построим дерево отрезков по полученному массиву. | ||
+ | === Запрос === | ||
+ | |||
+ | |||
+ | == Сложность == | ||
+ | === Препроцессинг === | ||
+ | Длина массива глубин будет равна <tex>(2 * n - 1),</tex> т.е. дерево отрезков будет построено за <tex>O(n).</tex> Таким образом, препроцессинг работает за <tex>O(n).</tex> | ||
+ | === Запрос === | ||
+ | Время выполнения запроса равно времени запроса минимального элемента на отрезке в дереве отрезков, т.е. <tex>O(log n).</tex> | ||
== См.также == | == См.также == |
Версия 07:41, 25 марта 2011
Содержание
Постановка задачи LCA
Определение: |
Наименьший общий предок (least common ancestor) двух узлов | в корневом дереве - это такой узел который среди всех узлов, являющихся предками как узла так и имеет наибольшую глубину.
Пусть дано корневое дерево
На вход подаются запросы вида для каждого запроса требуется найти их наименьшего общего предка.Алгоритм
Препроцессинг
1) В каждом узле будет храниться глубина узла в корневом дереве
2) Ориентируем каждое ребро в дереве
и добавим обратное к этому ребру. Получим эйлеров граф . Найдем в графе эйлеров цикл, записывая в массив глубину посещенных узлов.3) Построим дерево отрезков по полученному массиву.
Запрос
Сложность
Препроцессинг
Длина массива глубин будет равна
т.е. дерево отрезков будет построено за Таким образом, препроцессинг работает заЗапрос
Время выполнения запроса равно времени запроса минимального элемента на отрезке в дереве отрезков, т.е.