Algorithm 从最低共同祖先重建树的算法名称?

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

我想写一个工具来处理一些树结构的数据。(事实上,它将在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)
      标签
      t
      中的
      n1
      n2
      的最低共同祖先


我的问题是:“这是已知算法的已知问题吗?”。我想是的。它似乎非常类似于拓扑排序。我有一个基于合并排序的算法的想法,但是如果已知的算法已经存在,就没有理由提出我自己的算法。

我不知道你叫它什么,但我会首先比较所有元素对来构造树的偏序,然后进行拓扑排序,然后从中构造树。(排序的要点是,现在您知道第一个元素是根,每个元素依次是叶。)


这个主题让我想起了分支学算法。然而,这既容易又难。更容易,因为在检查时很容易辨别哪些表格与另一个表格接近。更难,因为挑战在于你不了解生命周期评价。因此,这可能是一个有趣的旁道,但可能不是很有帮助。

就最不常见的祖先而言,树的根会是其所有非根节点的祖先吗?我相信你所描述的结构也被称为a。我认为期望的输出将被称为输入的半格外壳。是的,结构是一个半格。“半格壳”是一个很好的命名法!如果你能告诉我半格是否是一个实际的单词,你真的可以帮我省下一天的时间。这是一个很好的简单算法。我原本希望有一个O(n logn)算法,但我怀疑你无法确定在少于O(n^2)的操作中,图形是否完全断开连接;请澄清。@Codor
a
iff
lca(a,b)=a
定义了偏序。这就是拓扑排序所需的全部内容。