【发布时间】: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 没有经过预处理。
-
链接很棒!是的。我可以上去从最短的高度把它们剪掉
标签: c++ tree big-o lowest-common-ancestor