
LCA 在线离线算法 笔记
任选根节点,设为树根,便于遍历。 从根节点开始DFS遍历,每个节点首先处理其子节点。 若子节点尚未被访问,继续递归DFS,直到叶子节点。 将子节点合并至父节点,利用并查集实现。 在返回时,处理与当前节点有询问关系的节点,确定LCA。
发布日期:2025-04-04 10:51:27
浏览次数:12
分类:精选文章
本文共 1970 字,大约阅读时间需要 6 分钟。
Tarjan算法与RMQ的结合应用
离线算法为解决多次查询问题提供了一种高效的方案。Tarjan算法是一种经典的离线最近公共祖先(LCA)算法,通过一次遍历就能解决所有查询,这在处理大规模数据时尤为重要。结合Segment Tree(ST算法)实现区间最值查询,可以提升LCA问题的处理效率。
Tarjan算法的基本原理
Tarjan算法的核心思想是在一次DFS遍历中解决所有查询问题,时间复杂度为O(n + q)。其优点在于实现复杂度合理,逻辑清晰。算法步骤如下:
算法代码示例
Tarjan(u) { for all child v of u { Tarjan(v); merge(u, v); mark v as visited; } for all query相关e { if e已访问过 { LCA(u, e)的查询通过find(e)找到 offending node; } }}
RMQ与ST算法结合应用
区间最值查询(RMQ)算法中,Segment Tree(ST算法)是一种经典方法。其预处理时间为O(n log n),查询时间为O(1)。
ST算法的实现步骤
预处理阶段:
- 初始化前缀数组
F[i][j]
,记录区间[ i, i + 2^j -1 ]的最小值。 - 使用状态转移公式:F[i][j] = min(F[i][j-1], F[i + 2^{j-1}][j-1])。
查询阶段:
- 对于区间[m, n],找到最大的k使得2^k ≤ n - m + 1。
- 将查询分解为两个子区间:[m, m + 2^k -1] 和 [n - 2^k + 1, n]。
- 计算两个子区间的最小值,取最小者即为原区间的最小值。
代码实现示例
void ST(int len) { for (int i = 1; i <= len; ++i) { f[i][0] = i; } for (j = 1; j <= log(len); ++j) { for (i = 1; i <= len - 2(j-1); ++i) { f[i][j] = min(f[i][j-1], f[i + 2^{j-1}][j-1]); } }}int rmq(int l, int r) { k = 0; while (1 << (k + 1)) ≤ r - l + 1; a = f[l][k]; b = f[r - 2^k + 1][k]; return min(a, b);}int lca(u, v) { x = first[u], y = first[v]; if (x > y) swap(x, y); res = rmq(x, y); return F[res];}
实现细节
树的构建与DFS遍历
树的构建使用邻接表存储,便于节点遍历。通过DFS从根节点开始,记录每个节点的首次出现位置first[u]
,以及深度depth[u]
。这一步与LCA的计算密切相关。
优化与实现
合并操作采用并查集,确保路径压缩以保证效率。查询处理阶段利用RMQ快速找到LCA。
示例验证
根据示例,查询LCA(4,7):
- 首次出现位置:first[4]=9,first[7]=6。
- 在深度序列中区间[6,9]的最小深度为2。经过深度映射,原节点为3。
这种方法将LCA查询转化为区间最小值问题,大大提升效率。
具体实现步骤
树的输入处理:
- 读取n, q, root。
- 构建邻接表,存储每个节点的子节点。
DFS遍历:
- 标记节点是否访问过。
- 记录每个节点的首次出现位置和深度。
ST算法预处理:
- 初始化数组
f
。 - 逐级构建区间最小值表。
处理查询:
- 对每个查询(a, b),调用LCA函数。
- LCA通过比较首次出现位置,结合RMQ找到最小深度节点。
- 输出结果。
结论
Tarjan算法结合RMQ通过Segment Tree实现,提出了一种高效的离线LCA查询方案。其时间复杂度为O(n log n + q log n),适用于大规模多叉树的分析任务。
通过以上实现,可以快速解答多个LCA查询问题,充分发挥算法的优势。这个方案在实际应用中表现出色,尤其是在数据量大或查询频繁的场景中。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年05月08日 11时53分05秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
leaflet加载接入天地图(leaflet篇.1)
2025-04-04
leaflet加载接入百度地图(leaflet篇.2)
2025-04-04
leaflet加载接入腾讯矢量、腾讯影像地图(leaflet篇.4)
2025-04-04
leaflet动态热力图分析(leaflet篇.16)
2025-04-04
leaflet动态热力图(大数据版)(leaflet篇.17)
2025-04-04
leaflet动态画线(leaflet篇.59)
2025-04-04
leaflet区域聚合点(点击后散开并进行合理定位)(leaflet篇.22)
2025-04-04
leaflet叠加geojson图层并居中到屏幕三分之一的位置(leaflet篇.67)
2025-04-04
leaflet叠加geojson图层(leaflet篇.38)
2025-04-04
leaflet叠加geojson图层(挖洞)(leaflet篇.43)
2025-04-04
leaflet叠加多个面(面的数据结构)(leaflet篇.62)
2025-04-04
leaflet图标跳动(leaflet篇.45)
2025-04-04
leaflet图标闪烁(leaflet篇.20)
2025-04-04
leaflet圆采集与圆编辑(leaflet篇.8)
2025-04-04
leaflet地图无级别缩放(移动端)(leaflet篇.76)
2025-04-04
leaflet实现wms服务面要素可点击(leaflet篇.30)
2025-04-04
leaflet实现四色预警(仿echarts气泡图)(leaflet篇.41)
2025-04-04