当前位置: 首页 > news >正文

最近公共祖先 LCA

一 点睛 

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

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)。

相关文章:

  • Deterministic Policy Gradient Algorithms
  • Java8时间日期库DateTime API及示例
  • np.random.seed(), torch.manual_seed(args.seed)
  • 真真正正的九面阿里才定级 P6+ 支持背调,还不来看?(建议收藏)
  • Fedora 24 Beta 版发布下载!
  • k-NN分类算法详解与分析(k近邻分类算法)
  • 03-数据链路层
  • Maven进阶实战
  • C++引用用法学习笔记
  • linux下的动态静态库
  • [GXYCTF2019]禁止套娃
  • STM32CubeIDE实现基于STM32的LoRa通信程序移植(SPI接口)
  • JQuery系列之元素操作
  • BLEMotion-Kit 支蓝牙运动传感评估套件
  • 网课查题公众号平台及平台系统如何使用
  • 自己简单写的 事件订阅机制
  • 【面试系列】之二:关于js原型
  • CEF与代理
  • Centos6.8 使用rpm安装mysql5.7
  • Cookie 在前端中的实践
  • css系列之关于字体的事
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • node-glob通配符
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vue 配置sass、scss全局变量
  • Vue官网教程学习过程中值得记录的一些事情
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 对超线程几个不同角度的解释
  • MPAndroidChart 教程:Y轴 YAxis
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (14)Hive调优——合并小文件
  • (16)Reactor的测试——响应式Spring的道法术器
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (三)elasticsearch 源码之启动流程分析
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)可以带来幸福的一本书
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [acm算法学习] 后缀数组SA
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [c++] 自写 MyString 类
  • [codevs] 1029 遍历问题
  • [EMWIN]FRAMEWIN 与 WINDOW 的使用注意
  • [Godot] 3D拾取