Algorithm 用于创建族谱树的树

Algorithm 用于创建族谱树的树,algorithm,tree,parent-child,Algorithm,Tree,Parent Child,我正在寻找一个好的算法来计算两个人的最低共同祖先,而不需要初始的整体树 如果我有孩子,我可以打电话找父母。所以,如果我有两个孩子,我需要给每个孩子打电话,直到他们有一个共同的祖先。至此,我应该有两个列表,可以构建成一个树 什么样的算法适用于此 如果有一些基本信息可以确定一个特定节点是否“原则上”是另一个特定节点的父节点,那么它将允许您快速/高效地确定共同祖先(如果有的话)。这就是我关于“年龄”的问题——见评论——的内容。 年龄属性显然会为您提供此类信息 根据您的回答,假设没有此类信息,有两种明显

我正在寻找一个好的算法来计算两个人的最低共同祖先,而不需要初始的整体树

如果我有孩子,我可以打电话找父母。所以,如果我有两个孩子,我需要给每个孩子打电话,直到他们有一个共同的祖先。至此,我应该有两个列表,可以构建成一个树


什么样的算法适用于此

如果有一些基本信息可以确定一个特定节点是否“原则上”是另一个特定节点的父节点,那么它将允许您快速/高效地确定共同祖先(如果有的话)。这就是我关于“年龄”的问题——见评论——的内容。 年龄属性显然会为您提供此类信息

根据您的回答,假设没有此类信息,有两种明显的方法:

A.向上扫描两棵树(getParent,等等),为每个初始子代建立祖先列表,同时检查每个新祖先是否出现在其他子代的祖先列表中。一般来说,没有理由假设共同祖先与两个孩子之间的距离(“几乎”)相等,因此,构建各自祖先列表的任何顺序都类似于以尽可能少的步骤为您提供共同祖先

这种方法的一个缺点是,如果出现新的候选者,您可能需要在共同列表中进行大量搜索。这可能是缓慢的

B.另一种方法是简单地独立构建两个AntestorList中的每一个,直到耗尽。这可能相对较快,因为在每一步中,您都不会因为必须检查“另一个”列表的内容而被打断

然后,当您完成了这两个列表后,您要么有一个共同的祖先,要么没有共同的祖先,只需相互验证最上面的项目即可。 如果没有,则完成(没有结果)。如果是,则同步返回列表并检查它们分开的位置,再次避免列表搜索

从一般的角度来看,我更喜欢方法B。偶尔方法a当然会产生更快的结果,但在糟糕的情况下,它可能会变得乏味/缓慢,这在方法B中不会发生。当然,我假设任何ancestorlist都不能是循环的,即节点不能是自身的祖先


最后,请注意:如果您确实有一个属性在“年龄”的意义上对节点进行“排序”,那么您应该同时构建两个列表,即始终处理当前具有顶部节点的列表,该顶部节点不可能是另一个列表的顶部节点的父节点。这允许您只检查当前的topnodes(而不是列表中的任何其他成员)。

在最低的公共祖先上没有其他连接,因此“树”将只是两个列表,一个在左侧,一个在右侧,公共祖先作为根节点……有两个问题需要澄清(对我来说)你的情况:1。一个孩子有一个或两个父母(你说的是“人”…)?;2.这些物品(“人”)有“年龄”吗?@BertteVelde一个孩子有一个父母,而这些物品没有年龄。不幸的是,没有年龄的顺序。所有子节点最终都将报告给根节点,我的问题是找到最低的共同祖先。方法B看起来不错,谢谢你的帮助。