Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graph 查找节点具有零、一或两个父节点的两个叶节点的最佳公共祖先_Graph_Ancestor_Least Common Ancestor - Fatal编程技术网

Graph 查找节点具有零、一或两个父节点的两个叶节点的最佳公共祖先

Graph 查找节点具有零、一或两个父节点的两个叶节点的最佳公共祖先,graph,ancestor,least-common-ancestor,Graph,Ancestor,Least Common Ancestor,目标: 我正在寻找一种算法来寻找一个图的最佳公共祖先,其中图中的节点可以有零个、一个或两个父节点。我不确定“最佳共同祖先”的术语:更好的术语可能是“最低共同祖先”或“最近共同祖先”,等等。如果有更好的术语,请提供描述此类术语的URL 该算法可以访问完整的图形数据结构 给定节点可能有零个、一个或两个父节点。这是关键,因为我在web上看到的算法假定给定节点有零个或一个父节点,但没有两个父节点(参见下面的参考文献)。例如,下图中的m1节点没有父节点,因为它是根节点(图可以有多个根)。d3有两个父母,一

目标

我正在寻找一种算法来寻找一个图的最佳公共祖先,其中图中的节点可以有零个、一个或两个父节点。我不确定“最佳共同祖先”的术语:更好的术语可能是“最低共同祖先”或“最近共同祖先”,等等。如果有更好的术语,请提供描述此类术语的URL

该算法可以访问完整的图形数据结构

给定节点可能有零个、一个或两个父节点。这是关键,因为我在web上看到的算法假定给定节点有零个或一个父节点,但没有两个父节点(参见下面的参考文献)。例如,下图中的m1节点没有父节点,因为它是根节点(图可以有多个根)。d3有两个父母,一个是d2,另一个是b2

节点有对双亲的引用(如果它们存在),也有对所有子节点的引用(如果它们存在),所以上下遍历树是公平的。节点可以有零个或多个子节点。更改数据结构不是一个选项

更靠近两个输入节点的节点比更远的节点(即,更靠近图的根)更可取

举例来说,下图显示了一个可能的图形。在这种情况下,算法的输入将是节点b5和d4。节点b5和d4的最佳共同祖先是b2。c2不会是,因为b3在通往b5的谱系中

该算法的可能答案最多只能是一个节点,如果两个输入节点没有共同的祖先,则空集是有效答案

参考资料

似乎意味着零个或一个双亲,因此如果这是解决方案,那么答案应该包括描述如何在该算法中考虑双亲。的wikipedia页面似乎也只考虑其节点有零个或一个父节点的数据结构,而不是两个:

在树数据结构中,每个 节点指向其父节点

图表


我运行了一个家谱网站,以前我用以下算法解决了这个问题

对于这两个节点,使用递归生成一个数组,该数组将节点名与生成链接起来。以你的例子来说,b4比b5高1代;b3为2代;等等:

$b5Tree = array('b4'=>1, 'b3'=>2, 'c3'=>2, 'b2'=>3, 'c2'=>3, ...);
$d4Tree = array('d3'=>1, 'b2'=>2, 'd2'=>2, 'b1'=>3, 'd1'=>3, ...);
基本情况是检查第一个节点是否出现在第二个节点的树中,反之亦然。如果它存在,那么你有你的答案

否则,遍历其中一棵树,查找公共节点ID,并跟踪最小生成

$minNodeID = null;
foreach ($b5Tree as $nID => $gen)
{
    if (($d4Tree[$nID] != 0) and (($d4Tree[$nID]  + $gen) < $minSummedGen))
    {
        $minSummedGen = $d4Tree[$nID] + $gen;
        $minNodeID = $nID;
    }
}
return $minNodeID;
$minNodeID=null;
foreach($nID=>$gen)
{
如果($d4Tree[$nID]!=0)和($d4Tree[$nID]+$gen)<$minSummedGen))
{
$minSummedGen=$d4Tree[$nID]+$gen;
$minNodeID=$nID;
}
}
返回$minNodeID;

在您的示例中,为什么b2不是答案?它是b5和d4的最低共同祖先。@Dan是的,你是对的。这就是我编辑图表而不是重新校对文本的结果。现在文本已更正。这应该可以实现,因为我可以轻松填充$b5Tree和$d4Tree结构,因为我必须从下至上遍历我的结构。标记为答案的。谢谢