LCA(最近公共祖先)算法详解
1. 什么是 LCALCALowest Common Ancestor即最近公共祖先是树结构中的一个经典概念。给定一棵有根树和树中的两个节点它们的最近公共祖先是指距离这两个节点最近的公共祖先节点且该节点同时是这两个节点的祖先。2. LCA 的应用场景树上的路径查询计算两个节点之间的最短路径长度。网络路由在树形网络拓扑中寻找两个节点的最近交汇点。版本控制系统Git 中寻找两个分支的最近共同提交。生物学在系统发育树中寻找两个物种的最近共同祖先。社交网络寻找两个人最近的共同上级或关联节点。3. 基础算法实现3.1 朴素算法暴力向上最直观的方法是分别记录两个节点到根节点的路径然后找到最后一个相同的节点。def lca_naive(parent, u, v): # parent 存储每个节点的父节点根节点的父节点为 -1 path_u [] while u ! -1: path_u.append(u) u parent[u] path_v [] while v ! -1: path_v.append(v) v parent[v] # 从根节点开始比较 i, j len(path_u)-1, len(path_v)-1 lca_node -1 while i 0 and j 0 and path_u[i] path_v[j]: lca_node path_u[i] i - 1 j - 1 return lca_node时间复杂度O(h)其中 h 是树的高度。在最坏情况下链状树为 O(n)。3.2 倍增算法Binary Lifting预处理每个节点向上 2^k 步的祖先查询时通过二进制跳跃快速找到 LCA。class LCA { private: int n, LOG; vectorvectorint adj, up; vectorint depth; void dfs(int u, int p) { up[u][0] p; for(int i 1; i LOG; i) { up[u][i] up[up[u][i-1]][i-1]; } for(int v : adj[u]) { if(v ! p) { depth[v] depth[u] 1; dfs(v, u); } } } public: LCA(int n, vectorvectorint tree, int root 0) { this-n n; LOG ceil(log2(n)); adj tree; up.assign(n, vectorint(LOG1)); depth.assign(n, 0); dfs(root, root); } int query(int u, int v) { if(depth[u] depth[v]) swap(u, v); // 将 u 提到与 v 同一深度 int diff depth[u] - depth[v]; for(int i 0; i LOG; i) { if(diff (1 i)) { u up[u][i]; } } if(u v) return u; // 同时向上跳跃 for(int i LOG; i 0; i--) { if(up[u][i] ! up[v][i]) { u up[u][i]; v up[v][i]; } } return up[u][0]; } };时间复杂度预处理 O(n log n)查询 O(log n)。4. 进阶算法Tarjan 离线算法Tarjan 算法可以在 O(n q) 的时间内处理所有查询但需要提前知道所有查询对。class TarjanLCA { ListInteger[] tree; ListPair[] queries; int[] parent, ancestor; boolean[] visited; int[] result; class Pair { int node, queryId; Pair(int node, int queryId) { this.node node; this.queryId queryId; } } void dfs(int u) { visited[u] true; ancestor[u] u; for(int v : tree[u]) { if(!visited[v]) { dfs(v); union(u, v); ancestor[find(u)] u; } } for(Pair q : queries[u]) { if(visited[q.node]) { result[q.queryId] ancestor[find(q.node)]; } } } // 并查集实现省略... }5. 实战应用示例5.1 计算树上两点距离def tree_distance(lca, depth, u, v): ancestor lca.query(u, v) return depth[u] depth[v] - 2 * depth[ancestor]5.2 判断节点是否在路径上def on_path(lca, depth, u, v, x): # 判断节点 x 是否在 u 到 v 的路径上 lca_uv lca.query(u, v) lca_ux lca.query(u, x) lca_vx lca.query(v, x) # x 在路径上当且仅当 # 1. lca(u, x) x 且 depth[x] depth[lca_uv] # 2. 或 lca(v, x) x 且 depth[x] depth[lca_uv] # 3. 或 lca(u, x) lca_uv 且 lca(v, x) x condition1 (lca_ux x and depth[x] depth[lca_uv]) condition2 (lca_vx x and depth[x] depth[lca_uv]) condition3 (lca_ux lca_uv and lca_vx x) return condition1 or condition2 or condition36. 算法比较与选择算法预处理时间查询时间空间适用场景朴素算法O(1)O(h)O(n)树高度小查询少倍增算法O(n log n)O(log n)O(n log n)通用在线查询Tarjan 离线O(n q)O(1) 均摊O(n q)查询已知需要高效处理大量查询RMQ Euler TourO(n)O(1)O(n log n)需要 O(1) 查询可接受较大空间7. 总结LCA 是树算法中的基础且重要的组件掌握其原理和不同实现方法对于解决树相关问题至关重要。在实际应用中对于一般竞赛和面试掌握倍增算法足够应对大多数情况。如果需要处理大量查询且查询已知Tarjan 离线算法是最优选择。在需要 O(1) 查询且内存充足时可以考虑 RMQ Euler Tour 方法。理解 LCA 不仅有助于解决具体问题还能加深对树结构、DFS 序、二进制思想等基础算法概念的理解。

相关新闻

单片机编程利器:有限状态机(FSM)原理与Arduino实战

单片机编程利器:有限状态机(FSM)原理与Arduino实战

1. 从“状态”说起:为什么你的代码需要一台“交通信号灯”写单片机或者Arduion程序,尤其是处理一些带流程、有步骤的任务时,你有没有遇到过这样的场景:一个按键,短按是“开始”,长按是“停止”,…

2026/7/29 8:32:00 阅读更多 →
炉石传说游戏体验全面优化指南:HsMod插件50+功能深度解析

炉石传说游戏体验全面优化指南:HsMod插件50+功能深度解析

炉石传说游戏体验全面优化指南:HsMod插件50功能深度解析 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 你是否厌倦了炉石传说中重复繁琐的操作?开包要一个个点击&a…

2026/7/29 8:32:00 阅读更多 →
如何快速解锁加密音乐文件:Unlock Music Electron完整指南

如何快速解锁加密音乐文件:Unlock Music Electron完整指南

如何快速解锁加密音乐文件:Unlock Music Electron完整指南 【免费下载链接】unlock-music-electron Unlock Music Project - Electron Edition 在Electron构建的桌面应用中解锁各种加密的音乐文件 项目地址: https://gitcode.com/gh_mirrors/un/unlock-music-elec…

2026/7/29 8:32:00 阅读更多 →

最新新闻

FTP主动与被动模式详解:原理、区别与服务器配置实战

FTP主动与被动模式详解:原理、区别与服务器配置实战

1. 项目概述:FTP的两种连接模式如果你曾经搭建过FTP服务器,或者用过FileZilla、WinSCP这类工具连接过别人的服务器,大概率遇到过连接失败、列表目录超时或者能登录但传不了文件这种让人抓狂的情况。很多时候,问题的根源并不在于你…

2026/7/29 8:39:02 阅读更多 →
工业物联网安全连接:A5000与MK24FN256VDC12方案解析

工业物联网安全连接:A5000与MK24FN256VDC12方案解析

1. 项目背景与核心需求 在工业物联网和嵌入式系统领域,安全连接云端服务已成为刚需。A5000作为一款工业级无线通信模块,搭配MK24FN256VDC12微控制器(基于ARM Cortex-M4内核),能够为设备提供可靠的云连接能力。这个组合…

2026/7/29 8:39:02 阅读更多 →
EMC辐射发射测试:垂直与水平极化测试原理与实战指南

EMC辐射发射测试:垂直与水平极化测试原理与实战指南

1. 项目概述:从一次测试失败说起前几天,实验室的同事小张拿着一个智能家居控制器的辐射发射(RE)测试报告来找我,愁眉苦脸。报告显示,在某个频点,垂直极化的测试结果超标了6个dB,但水…

2026/7/29 8:39:02 阅读更多 →
[RPC/序列化/端云通信] Proto 文件的语法解读

[RPC/序列化/端云通信] Proto 文件的语法解读

[RPC/序列化/端云通信] Proto 文件的语法解读 一、为什么需要 Proto 文件?在分布式系统、微服务架构或端云通信中,不同服务或设备之间需要交换数据。但数据格式千差万别——Python 用字典,Java 用对象,C 用结构体。如何让这些语言…

2026/7/29 8:39:02 阅读更多 →
从5克微型机器人到480公里时速无人机:机器人技术的两个极端突破

从5克微型机器人到480公里时速无人机:机器人技术的两个极端突破

1. 从“玩具”到“工程奇迹”:微型机器人的技术分野最近,我身边不少朋友和同事都在讨论两个看似风马牛不相及的东西:一个是重量仅有5克、比一枚硬币还轻的超迷你机器人,另一个是时速能飙到480公里、堪比高铁的遥控四旋翼。乍一看&…

2026/7/29 8:39:02 阅读更多 →
2026年折叠门源头厂家怎么选?从选型到施工的完整指南

2026年折叠门源头厂家怎么选?从选型到施工的完整指南

2026年折叠门源头厂家怎么选?从选型到施工的完整指南对于工业厂房、物流园区、商业综合体和办公楼等项目的采购决策者而言,折叠门的采购不仅仅是一次简单的商品买卖,而是一个涵盖需求分析、方案设计、设备选型、安装施工和验收交付的全流程系…

2026/7/29 8:38:01 阅读更多 →

日新闻

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻