家谱创作的树木

时间:2012-09-28 21:04:57

标签: algorithm tree parent-child

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

如果我有一个孩子,我可以打电话给父母。所以,如果我有两个孩子,我需要打电话给每个孩子,直到他们有一个共同的祖先。到目前为止,我应该有两个列表,我可以将它们构建到树中。

什么样的算法对此有好处?

1 个答案:

答案 0 :(得分:0)

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

假设您的答案中没有可用的信息,有两种明显的方法:

一个。向上扫描两棵树(getParent,等等),为每个初始子建立祖先列表,同时检查每个新祖先是否发生在另一个孩子的祖先列表中。一般来说,没有理由认为共同的祖先与两个孩子的距离相近(“差不多”),所以你建立相应祖先名单的任何顺序同样都会给你共同的祖先。最少的步骤。

这种方法的一个缺点是你冒着必须在共同列表中多次搜索新候选者的风险。这可能很慢。

B中。另一种方法是简单地建立两个祖先列表中的每一个,直到筋疲力尽。这可能是相对较快的,因为你不必在每一步都中断,因为必须检查“另一个”列表的内容。

然后,当你完成两个列表时,你要么拥有共同的祖先,要么只是通过相互验证顶级项目。 如果不是,你就完成了(没有结果)。如果是,则同步向下走回列表并检查它们分开的位置,再次避免列表搜索。

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

作为最后一点:IF,毕竟,你确实有一个“命令”节点的属性“age”,那么你应该同时构建两个列表,因为你总是处理列表目前有一个顶级节点,它不可能是另一个列表的topnode的父节点。这允许您仅检查当前的顶部节点(而不是列表中的任何其他成员)。