LCA,Lowest Common Ancestor,最近的公共祖先。在一棵树中对于两个节点u , v找出节点T,使得T同时为u,v的祖先。显然这样的T点肯定存在且有可能有多个,其中深度最大的那个点肯定为即为u,v两点的LCA。关于LCA的解法有很多种,暴力枚举,事先需要知道所有询问的离线的tarjan算法和基于RMQ的在线算法,下面说一下自己对这种几种算法的理解。

⒈最容易想到的暴力搜索。

给出节点u , v,,首先对u进行回溯一直到根节点,并对途中的节点加上标记。然后对v进行回溯,直到找到一个被标记的节点T,此时T即为u,v的LCA。此方法写起来很简单但时间复杂度太高,故只适合查询次数极少的时候。

⒉离线的Tarjan算法。

此种算法需要预先知道所有的询问,并对询问进行一些预处理,即将有相同节点的询问放在一块。算法的主要思想就是在DFS过程中处理一些信息从而得到答案。下面说一下我自己的理解。

在DFS进行之前,把每个点都看作一个独立的点集且作为对应点集的代表元。在DFS过程中每次遍历完一棵子树,回溯到当前子树的根节点时,便将这棵子树上的所有点并到一个点集里,根节点即为该集合的代表元。然后对与此根节点相关的询问进行回答。设此节点为u,另一点为v,若v已经完成DFS,则v所在点集的代表元即为u,v的LCA。

下面说一下细节:1.点集的标记可以用并查集来完成。2.每次询问都查询了两次,并且有且只有一次做出回答。3.此算法的缺点在于必须知道预先知道所有的询问,不够灵活。

⒊基于RMQ的在线查询算法。

该算法借助于DFS时的访问次序和RMQ的快速查询。

设depth[]记录每个点的深度,r[]记录每个点在DFS过程中第一次被访问的次序。

刘汝佳的黑书上对此算法作了详细的介绍,当时读的时候有一句“由于每条边被访问了两次,因此一共记录了2n-1个节点”始终想不明白,后来发现在DFS的递归和回溯过程中,对于一个出度为X的点,肯定会被访问X+1次,1次在递归过程中,X在回溯过程中。又因为在一棵树中除根节点外,每个节点的入度均为1,故入度总和为n-1,又有入度 == 出度,所有所有的节点一共被访问了n+n-1次,n次在递归过程中,n-1次在回溯过程中。

设r[u] < r[v] , point[2n-1]里面存放了DFS过程中一次被访问的节点。则在point[ r[u] ]到 point[ r[v] ](包括两端点)之间深度最小的那个点即为两点的LCA,深度最小的点有且仅有一个。此时可分为两种情况,一种是u即为u和v的LCA,第二种就是第三点w是u,v的LCA。

第一种情况中显然v在一棵以u为根节点的子树上,此时显然在DFS过程中先u先放入point[],然后在DFS遍历这个子树的过程中v放入point[],所以在[ r[u] , r[v] ] 中 u即为深度最小的那个点。

第二种情况中DFS过程中必先会遍历完其中一个点所在的子树,然后会回溯到某一节点w继续DFS遍历该节点的其他子树,如果v在此时遍历的子树上,则w即为u,v的LCA。由上可知,point[]的[ r[u] , r[v] ] 区间内必有w。

区间内的快速查询可以用到RMQ或者线段树,这里就不再赘述。

以上就是我对LCA的几种算法的理解,感觉说的有点罗嗦,不足之处还望指出。

浅谈LCA的几种算法相关推荐

  1. 浅谈网络爬虫中广度优先算法和代码实现

    前几天给大家分享了网络爬虫中深度优先算法的介绍及其代码实现过程,没来得及上车的小伙伴们可以戳这篇文章--浅谈网络爬虫中深度优先算法和简单代码实现.今天小编给大家分享网络爬虫中广度优先算法的介绍及其代码 ...

  2. java布尔类型比较器_浅谈Java中几种常见的比较器的实现方法

    在java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题. 通常对象之间的比较可以从两个方面去看: 第一个方面:对象的地址是否一样,也就是是否引用自同一个对象.这种方式可以直接使用& ...

  3. 浅谈淘宝搜索排序算法【转自淘宝搜索博客】

    浅谈淘宝搜索排序算法 作者:鬼脚七     前言:        目前网上有很多介绍淘宝搜索排序的文章,大多是淘宝卖家们根据自己经验摸索整理出来的,里面提到的很多办法也很正确.只是搜索排序算法不是固定 ...

  4. 面试浅谈之十大排序算法

    面试浅谈之十大排序算法 HELLO,各位博友好,我是阿呆

  5. 浅谈常用的几种web攻击方式以及解决办法

    身在互联网的时候,web在给我们带来便利的同时,有些人也在盯着这些便利,因此出现了攻击网站的现象.所以我们在开发的时候,要注意这些容易被攻击的地方,以及做好防御的措施,下面将介绍一些这些 常见的攻击手 ...

  6. python中内置的四种数值类型为_浅谈python语言四种数值类型

    Python语言支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数),本文章向码农介绍python 四种数值类型,需要的朋友可以参考一下.希望对 ...

  7. 浅谈Floyd的三种用法 By cellur925

    Floyd大家可能第一时间想到的是他求多源最短路的n³算法.其实它还有另外两种算法的嘛qwq.写一发总结好了qwq. 一.多源最短路 放段代码跑,注意枚举顺序,用邻接矩阵存图.本质是一种动规. 复杂度 ...

  8. 浅谈Prim,Kruskal最小生成树算法

    由于学的最小生成树比较浅显,所写的文章可能也比较粗略,跪求大佬能指导. 首先先了解生成树的概念,什么是生成树呢?生成树可不是树,而是包含图中全部顶点的极小连通子图罢了,就是长得像棵树,而且在生成树中添 ...

  9. 浅谈LCA问题(最近公共祖先)(三种做法)

    [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入格式 第一行包含三个正整数 N,M,SN,M,SN,M,S,分别表示树的结点个数.询问的个 ...

最新文章

  1. 计算机系统的安全需求的需求等级,计算机信息系统安全等级保护 通用技术要求.PDF...
  2. PTA团体程序设计天梯赛-L2-010 排座位
  3. 2021年AI网络安全发展趋势
  4. Bitmap的一个简单实现
  5. 【DataBase】【SQL语言】【第三天】
  6. NanoPi NEO Air使用十二:使用自带的fbtft驱动点亮SPI接口TFT屏幕,ST7789V
  7. hdu4096(模拟)
  8. SDN第二章 Ubuntu开启/关闭防火墙
  9. Visual Studio Code五月版本更新
  10. linux 查看主板sn_如何在 Linux 上查找硬件规格
  11. Java工作笔记-String转Integer可以转与不可以转的情况
  12. python的numpy库结构_NumPy构成了数据科学领域中许多Python库的基础。
  13. 电脑换ip软件_如何使用爱加速换iP软件
  14. [Angular Tutorial] 3-Components
  15. python数字时钟日期_Python数值日期时间笔记
  16. ASP程序部署在IIS上的步骤
  17. 最全的ASCII码对照表
  18. windows中判断注册表键值是否存在的一段函数
  19. python系列之supervisor进程管理
  20. python登录注册程序编写_python写注册程序

热门文章

  1. OpenCV4.5.4 DNN人脸识别模块使用介绍--如何快速搭建一个人脸识别系统
  2. 区块链的安全问题(乱序时间戳,重入攻击)
  3. 电子货架标签-----智能基站V3
  4. 笔记本扩展坞无法外界显示器的问题
  5. 渔网-粘网:粘网捕鱼技巧
  6. 成年人与商业保险的亲密接触
  7. FFmpeg简述,源码分析,录制/压缩/水印/剪切/旋转/滤镜/美颜/上传视频等(CPU软编码和解码)
  8. 计算平均成绩(函数专题),输入某位同学各门课的成绩,输出平均成绩。输入的成绩均为五级制成绩,五级制成绩转换为百分之成绩的规则如下:'A'换为百分之成绩为95分,'B'对应85分,C对应75分,'D'
  9. 趣题:三角形中的六点共圆
  10. 图片可以360度旋转类似广告代码