最近公共祖先 python_『图论』LCA最近公共祖先(示例代码)

lazy.gif

概述篇

LCA(Least Common Ancestors),即最近公共祖先,是指这样的一个问题:在一棵有根树中,找出某两个节点 u 和 v 最近的公共祖先。

LCA可分为在线算法与离线算法

在线算法:指程序可以以序列化的方式一个一个处理输入,也就是说在一开始并不需要知道所有的输入。

离线算法:指一开始就需要知道问题的所有输入数据,而在解决一个问题后立即输出结果。

算法篇

对于该问题,很容易想到的做法是从 u、v 分别回溯到根节点,然后这两条路径中的第一个交点即为 u、v 的最近公共祖先,在一棵平衡二叉树中,该算法的时间复杂度可以达到(O(logn)),但是对于某些退化为链状的树来说,算法的时间复杂度最坏为(O(n)),显然无法满足更高频率的查询。

本节将介绍几种比较高效的算法来解决这一问题,常见的算法有三种:在线DFS+ST算法、倍增算法、离线Tarjan算法。

接下来我们来一一解释这两种的算法。

在线 DFS + ST 算法

首先看到 ST 你会想到什么呢?(脑补许久都没有想到它会是哪个单词的缩写)LCA的在线算法是可以建立在RMQ问题的基础上的

我们设 LCA(T,u,v) 为在有根树 T 中节点 u、v 的最近公共祖先, RMQ(A,i,j) 为线性序列 A 中区间 [i,j] 上的最小(大)值。

如下图这棵有根树:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值