最近公共祖先 LCA

本文介绍了树中最近公共祖先(LCA)的概念及其在计算两点间距离中的应用。LCA求解方法包括暴力搜索法、树上倍增法等,在线和离线算法各有特点。暴力搜索法的时间复杂度在最坏情况下为O(n)。通过LCA可以计算u和v之间的距离,即dist[u] + dis[v] - 2 * dist[lca]。文章探讨了不同算法的实现和效率。
摘要由CSDN通过智能技术生成

一 点睛 

最近公共祖先指有根树中距离两个节点最近的公共祖先。祖先指从当前节点到树根路径上的所有节点。

u 和 v 的公共祖先指一个节点既是 u 的祖先又是 v 的祖先,u 和 v 的最近公共祖先指距离 u 和 v 最近的公共祖先。若 v 是 u 的祖先,则 u 和 v 的公共祖先是 v。

可以使用 LCA 求解树长任意两点之间的距离,求 u 和 v 之间的距离时,若 u 和 v 的最近公共祖先为  lca,则 u 和 v 之间的距离为 u 到树根的距离,加上 v 到树根的距离减去 2 倍的 lca 到树根的距离。

dist[u] + dis[v] - 2 * dist[lca]

求解 LCA 的方法有很多,包括暴力搜索法、树上倍增法、在线 RMQ 算法、离线 Tarjan 算法和树链剖分。

在线算法:以序列化方式一个一个的处理输入,也就是说,在开始时并不知道所有的输入,在解决一个问题后立即输出结果。

离线算法:在开始时,已知问题的所有输入数据,可以一次性回答所有问题。

二 暴力搜索法

暴力搜索法有两种:向上标记法和同步前进法。

1 向上标记法

从 u 向上一直到根节点标记所有经过的节点,若 v 已被标记,则 v 节点为 LCA(u,v) ,否则 v 也向上走一步。第 1 次遇到已标记节点时,该节点为 LCA(u,v)。

2 同步前进法

将 u、v 中较深的节点向上走到深度较浅的节点的同一深度,然后两个节点一起向上走,直到走到同一节点,该节点就是 u 和 v 的最近公共祖先。记作 LCA(u,v)。若较深的节点 u 到达 v 的同一深度时,那个节点正好是 v 则节点,则 v 节点为 LCA(u,v) 

3 算法分析

以暴力搜索法求解 LCA,两种方法的时间复杂度在最坏情况下均为 O(n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值