我有一个需要用于分析的节点层次结构。有点像这样
我正在尝试找到一种算法,使我能够找到两个节点之间最近的共同祖先。我知道有一些算法可以找到最低的共同祖先,但我还没有找到一个可以让我们找到最近的几个的算法。
例如,在我上面链接的图片中,如果我给它两个节点:0 和 1,它应该返回 2 和 5。即它应该返回没有后代的节点的所有共同祖先也是共同祖先。一种天真的方法是获取 0 和 1 的所有共同祖先:{7, 5, 6, 3, 2},然后消除 7,因为它在集合中有后代。然后它也会消除 6 和 3。所以它会返回 SLCA = {5,2}。目前,我已将每个节点的所有祖先存储在一个列表中。所以这种天真的方法是可能的。但是,我想做一个更有效的方法,即使是非常大的图也可以扩展。最终,对于给定的图,我希望能够计算每对节点的成对 SLCA。我认为这种蛮力方法对于非常大的图表会很慢。
有人知道这样的算法吗?我一直在阅读这些论文,但它们非常密集,我一直在努力理解它们。
https://www.dcs.warwick.ac.uk/~czumaj/PUBLICATIONS/DRAFTS/LCA-Max-witness.pdf
http://www.ccs.neu.edu/home/dherman/browse/projects/mini-javac/papers/bender01finding.pdf
https://algo2.iti.kit.edu/download/fischer10new.pdf
https://algo2.iti.kit.edu/download/fischer10new.pdf
我很感激帮助