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