Название алгоритма восстановления дерева по наименьшему общему предку?
Я хотел бы написать инструмент, который работает с некоторыми древовидными данными. (На самом деле он будет работать с древовидным подмножеством GAG-версии DAG, но для этого вопроса это не важно). В частности, я хочу алгоритм, который восстанавливает подмножество дерева, состоящее из всех "точек соединения" данного входного набора.
В частности, я думаю, что хочу
У нас есть какой-то тип
H
которая имеет функцию "самого низкого общего предка",lca
в теме. Это даетH
древовидная структура.Алгоритм занимает некоторое подмножество
S
изH
в качестве ввода.На выходе должно быть многоходовое дерево
t
с узлами, помеченными значениямиH
,t
должен удовлетворять свойствамВсе
s
вS
пометить некоторый узелt
Листья
t
могут быть помечены только элементамиS
Любой элемент
h
заH
метки не более одного узлаt
Если
h1
этикеткиn1
а такжеh2
этикеткиn2
затемlca(h1, h2)
обозначает самого низкого общего предкаn1
а такжеn2
вt
,
Мой вопрос: "Это известная проблема с известными алгоритмами?". Я подозреваю, что это так. Это похоже на топологический вид. У меня есть идея для алгоритма, основанного на сортировке слиянием, но если известные алгоритмы уже существуют, нет никаких причин, чтобы придумать свой собственный.
1 ответ
Я не знаю, как вы это называете, но я сначала сравнил бы все пары элементов, чтобы построить частичный порядок для дерева, затем выполнил топологическую сортировку, а затем построил дерево из этого. (Смысл сортировки в том, что теперь вы знаете, что первый элемент - это корень, а каждый элемент в свою очередь будет листом.)
Субъект напомнил мне алгоритмы кладистики, http://bio.slu.edu/mayden/systematics/bsc420520lect12.html. Однако это и проще, и сложнее. Проще, потому что при осмотре легко определить, какие формы близки к другой. Сложнее, потому что проблема в том, что вы не знаете LCA. Таким образом, это может быть интересным побочным треком, но, вероятно, не очень полезно.