Level Ancestor problem
Задача о уровне предка (англ. "Level Ancestor problem") является задачей о превращении данного корневого дерева T в структуру данных, которая сможет определить предка любого узла на заданном расстоянии от корня дерева.
Задача: |
Дано корневое дерево | c вершинами. Поступают запросы вида , для каждого из которых необходимо найти предка вершины , который находится на расстоянии от корня дерева .
Наивная реализациb и двоичные подъемы
Используя обход в глубину посчитаем глубину каждой вершины дерева (это можно сделать за предподсчета двоичных подъемов , но тогда и время предподсчета в наивной реализации (посчитать подъемы для всех вершин) ухудшится до . Альтернативой данным двум алгоритмам является полный предподсчет всех возможных запросов, что соответственно дает нам алгоритм . В данном примере поступает запрос , на который алгоритм должен дать ответ h.
), после чего можем из вершины подняться до необходимой глубины вершины , что так же в худшем случае работает за . Получили алгоритм за , где время ответа на запрос можно улучшить до c помощьюИспользование Heavy-light декомпозиции
Этот алгоритм базируется на различных способах декомпозиции дерева (выберем heavy-light декомпозицию), из свойств этого разбиения следует, что подняться на любую высоту из вершины мы можем за . Данное разбиение можно строить за , что дает нам алгоритм за .