倍增和LCA

倍增思想与树上倍增找LCA
本文介绍了倍增算法的基本思想,以及在树上寻找最近公共祖先(LCA)的应用。通过树上倍增,可以将深度较深的点移动到相同深度,然后一起向上移动找到LCA,复杂度为logN。提供了普通查找和倍增优化的代码模板,适合初学者入门。同时提到了next数组在处理大数据时的重要性。

倍增和LCA

现在终于可以写这篇文章了,拖了很久没有学的倍增在去NOIP2015打酱油之前终于初步学习完。再次特别声明十分感谢fye的帮助,生命中第一篇倍增和LCA就是以她的代码为模板的,并且应该会一直延续下去。。。= =
【倍增是什么】
顾名思义,倍增就是根据已经得到的信息,将考虑的范围扩大一倍,从而加速操作的一种思想。
【有关倍增的算法】
使用了倍增思想的算法有很多,包括归并排序、快速幂、基于ST表的RMQ算法和树上倍增找LCA等,还有FFT、后缀数组等高级算法(wok…),而我们只是初级入门,学习了树上倍增找LCA。
【树上倍增找LCA】
算法的基本思路是:求两个点的LCA,先把深度较深的点移到和另一个点相同的深度,然后一起向上移动,直到重合,就找到了LCA,倍增其实是加速区间操作的一种手段,因为相当于把每个数进行二进制分解,倍增的复杂度在logN级别。
在这里不做详细讲解,只给出普通查找和使用倍增优化的代码模板,详情可以百度“倍增算法 高天宇”,SLYZGTY学长为你详细讲解。= =
【普通查找LCA】

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n,
### 原理 倍增法求解最近公共祖先(LCA)的核心思想是利用二进制拆分的方法,通过预处理存储每个节点的 $2^j$ 个祖先信息,从而在查询时可以快速跳跃节点,减少查询的时间复杂度。 给定一棵树,首先要构建相关图(无向图或单向图均可),从根节点进行深度优先遍历,计算每个节点的深度,并初始化关键数组 $fa[i][j]$,它表示从 $i$ 节点往根节点出发的第 $2^j$ 个祖先节点,其中 $fa[i][0]$ 即 $i$ 节点的父节点。查询时,先将两个节点通过 $fa[i][j]$ 进行跳跃,使它们到达相同高度,这个跳跃是最大跳跃,每次通过 $fa[i][j]$ 实现 $2^j$ 次跳跃,相比一次跳跃一次要快得多。若两节点跳跃到同一深度时重合,那么该节点就是最近公共祖先;若未重合,则两个节点同时往上跳,直到找到最近公共祖先 [^3]。 两点集并的最近公共祖先为两点集分别的最近公共祖先的最近公共祖先,即 $LCA(A \cup B )=LCA( LCA(A),LCA(B) )$,利用这个性质,可以求解任意多节点之间的最近公共祖先 [^1]。 ### 实现 #### 预处理阶段 使用深度优先搜索(DFS)从根节点开始遍历整棵树,为每个节点计算其所有可能的祖先。利用二维数组 $parent[node][i]$ 来存储节点 $node$ 的第 $2^i$ 个祖先。对于每个节点 $node$,通过关系 $parent[node][i] = parent[parent[node][i - 1]][i - 1]$ 来计算更高层级的祖先 [^4]。 #### 核心代码(倍增算法) ```python # lcaMultiply 函数返回uv的最近公共祖先 def lcaMultiply(u, v, depth, fa): # 让u指向深度最大的节点 if depth[u] < depth[v]: u, v = v, u # 向上找u的祖先,使uv的深度相等 for i in range(19, -1, -1): if depth[fa[u][i]] >= depth[v]: u = fa[u][i] # 如果此时uv刚好相等,那一定是最近的公共祖先,直接返回 if u == v: return u # 两个一起往上找祖先 for i in range(19, -1, -1): if fa[u][i] != fa[v][i]: u = fa[u][i] v = fa[v][i] return fa[u][0] ``` ### 应用 - **树结构中的路径查询**:在树状结构的数据库、文件系统等场景中,快速找到两个节点的最近公共祖先,有助于分析节点之间的关系路径。 - **生物信息学**:在生物进化树中,寻找两个物种的最近共同祖先,有助于研究物种的进化关系。 - **社交网络分析**:在社交网络的树形结构中,确定两个用户的最近共同联系人,分析社交关系的紧密程度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值