在具有父 ID 的通用树中找到最低共同祖先

Posted

技术标签:

【中文标题】在具有父 ID 的通用树中找到最低共同祖先【英文标题】:finding the Lowest Common Ancestor in a general tree having the parent Ids 【发布时间】:2014-12-02 15:11:52 【问题描述】:

我的问题是找到一个通用树的 LCA,该树将从 txt 文件中的列表创建。我正在寻找最有效的实施。数据格式如下: ID、信息、ParentId

数据未以任何方式排序。我正在考虑创建一棵树,但这至少需要 O (nlogn)。虽然日志基数不是 2。这取决于我想的平均孩子数。

相反,如果我将节点存储在哈希表中,那么找到 LCA 会比 O (nlogn) 更好。对?对于目标节点的每个父节点,我必须检查它是否已被源节点访问(假设我们从源节点开始到根节点并将途中的所有父节点标记为已访问),这需要 O (登录)。因为,我们只检查父母,它会比 O(nlogn) 更好。

有更好的主意吗?

【问题讨论】:

绝对不是 O(logn)。如果你的“树”是一个链表,我问的是头尾的 LCA 怎么办?算法本身似乎很合理。 这是最坏的情况。但在 avg is o (logn)... 中,制作树并不是一个更好的解决方案。对吗? 通常 LCA 的复杂度写成 O(h),其中 h 是树的高度。因此,链表为 O(n),k-ary 树为 O(logn)。 如果你愿意做一个 O(n) 的预处理步骤(你是通过读取文件),有恒定时间算法。结果发现an O(logh) algorithm 没有经过预处理。 链接很棒!是的。我可以上去从最短的高度把它们剪掉 【参考方案1】:

假设你的树在某种程度上是平衡的,即O(logn) 高度,你的哈希表数据结构应该给出一个 O(n) 算法。

从源和目标到根的第一个跟踪。您将有两条长度为 O(logn) 的路径。例如。 SXYZR 和 DWYZR。 S 和 D 是源和目的地。 R是根。这需要 O(logn) 时间。

然后你可以找到最长的后缀是YZR。 Y 将是 LCA。这需要 O(logn) 时间。

请记住,您需要 O(n) 时间来读取输入并构建哈希表。

【讨论】:

没错。创建 2 个列表直到根目录似乎是最好的方法

以上是关于在具有父 ID 的通用树中找到最低共同祖先的主要内容,如果未能解决你的问题,请参考以下文章

在有向无环图中找到最低共同祖先的算法?

如何在任何二叉树中找到两个节点的最低共同祖先?

如何获取通用java树中所有祖先的列表

寻找二叉树中的最低公共祖先结点----LCA(Lowest Common Ancestor )问题(递归)

如果不是树中的所有这些节点,Python会在二叉树中找到两个节点的最低共同祖先

二叉树中找两个结点的最近公共祖先结点