Algorithm 从最低共同祖先重建树的算法名称?
我想写一个工具来处理一些树结构的数据。(事实上,它将在git修订版DAG的树状子集上工作,但这对于这个问题并不重要)。特别是我想要一个算法,重建一个由给定输入集的所有“连接点”组成的树的子集 具体来说,我想我想要的是Algorithm 从最低共同祖先重建树的算法名称?,algorithm,tree,lowest-common-ancestor,Algorithm,Tree,Lowest Common Ancestor,我想写一个工具来处理一些树结构的数据。(事实上,它将在git修订版DAG的树状子集上工作,但这对于这个问题并不重要)。特别是我想要一个算法,重建一个由给定输入集的所有“连接点”组成的树的子集 具体来说,我想我想要的是 我们有一些类型H,它有一个“最低共同祖先”函数,lca。这给了H一个树状结构 该算法以H的子集S作为输入 输出应该是一个多向树t,节点的标签值为H t应满足以下属性 s中的所有s标记t t的叶子只能由S h的任何元素h标记的t 如果h1标签n1和h2标签n2则lca(h1,h2
- 我们有一些类型
,它有一个“最低共同祖先”函数,H
。这给了lca
一个树状结构H
- 该算法以
的子集H
作为输入S
- 输出应该是一个多向树
,节点的标签值为t
H
应满足以下属性t
s中的所有
标记s
t
的叶子只能由t
S
的任何元素h
标记的h
t
- 如果
标签h1
和n1
标签h2
则n2
标签lca(h1,h2)
中的t
和n1
的最低共同祖先n2
我的问题是:“这是已知算法的已知问题吗?”。我想是的。它似乎非常类似于拓扑排序。我有一个基于合并排序的算法的想法,但是如果已知的算法已经存在,就没有理由提出我自己的算法。我不知道你叫它什么,但我会首先比较所有元素对来构造树的偏序,然后进行拓扑排序,然后从中构造树。(排序的要点是,现在您知道第一个元素是根,每个元素依次是叶。)
这个主题让我想起了分支学算法。然而,这既容易又难。更容易,因为在检查时很容易辨别哪些表格与另一个表格接近。更难,因为挑战在于你不了解生命周期评价。因此,这可能是一个有趣的旁道,但可能不是很有帮助。就最不常见的祖先而言,树的根会是其所有非根节点的祖先吗?我相信你所描述的结构也被称为a。我认为期望的输出将被称为输入的半格外壳。是的,结构是一个半格。“半格壳”是一个很好的命名法!如果你能告诉我半格是否是一个实际的单词,你真的可以帮我省下一天的时间。这是一个很好的简单算法。我原本希望有一个O(n logn)算法,但我怀疑你无法确定在少于O(n^2)的操作中,图形是否完全断开连接;请澄清。@Codor
a
ifflca(a,b)=a
定义了偏序。这就是拓扑排序所需的全部内容。