【发布时间】:2021-12-20 14:03:57
【问题描述】:
我有兴趣以尽可能低的复杂性找到树中两个节点的距离。查找过程是在树上的一些查询和更新(添加和删除一个节点)。
这个问题可以使用 LCA 作为优化工具。但是,通过我发现的这些帖子,有一些可用的算法。
https://cp-algorithms.com/graph/lca.html https://cp-algorithms.com/graph/lca_binary_lifting.html
这里是总结,
- LCA + Sqrt 分解
预处理时间:O(N)
查询时间:O(√N)
允许更新树:是
- LCA + 段树
预处理时间:O(N)
查询时间:O(log N)
允许更新树:是
- LCA + 稀疏表
预处理时间:O(N log N)
查询时间:O(1)
允许更新树:否
- LCA + 二元提升
预处理时间:O(N log N)
查询时间:O(log N)
允许更新树:是
我的问题是,最好使用什么算法?
或者在什么条件下使用哪种算法最好?
每种算法是否还有其他没有在上面提到的优点或缺点?
【问题讨论】: