LCA实现的三种不同的方法
1.输入两个节点A和B2.设当前节点为A3.while dfs(当前节点)没有搜索到A和B4.当前节点更新为当前节点的父节点5.输出当前节点
很容易看出这个过程的正确性。首先,LCA的子树中必定有一个节点是A,一个是B,而且必定在两个节点到根节点的唯一路径上。
![](/assets/blank.gif)
然后,我们对于每一个节点,记录其往上跳1个节点,2个节点,4个节点,8个节点,16个节点……2^k个节点所达到的节点编号。在这里,往上跳2^k个节点应达到的是节点-1,也就是说,向上跳2^k个节点是不可能的,但是跳2^(k-1)个节点应该可以跳到。这可以用链表存储,也可以直接开一个数组,以方便索引。
1.DFS(根节点),对于每个DFS到的节点(不包括回溯到的): 2.设当前跳到的节点为DFS的目前节点的父节点 3.设当前向上跳2^i个节点,其中i=0 4.while 当前跳到的节点仍然存在(即不为-1) 5.当前节点的表中加入向上跳2^i跳到当前跳到的节点 6.++i 7.当前跳到的节点更新为当前跳到的节点向上跳2^(i-1)的节点
1.设要向上跳k层,当前跳到节点为A'2.while k != 0 3.A'向上跳lowbit(k)层 4.k -= lowbit(k)
接着相应的将相应的节点设为A’,如果A'和另一节点相同则LCA就是那个节点。于是,下面的思路就也很明朗了。二分LCA!比如说现在A和B在同一层上(深度相同),并且设深度都是100的话,就先向上跳64层,如果相同就只跳32层(在原来节点的基础上),不相同则再跳32层(在跳64层达到的两个节点的基础上),最后即可轻而易举地二分到答案了……这一过程似乎又称树上倍增算法,正确性的证明很简单,那个表的过程就不说了,而LCA的最终二分过程应该类似于二分步长,不断试探,最终必定能够找到答案。
while (x!=back[x]){ x = back[x];}
int findLCA(int x){ if (x==back[x]) return x; return x = findLCA(back[x]);}
由并查集的时间复杂度可知,总的时间复杂度应该是O(N+Q* α(N) )。而且,这里的应用还不需要合并,只需要查询即可,写起来比普通的并查集还要简单。
LCA实现的三种不同的方法相关推荐
- 【小白学习keras教程】十、三种Model Selection方法:k-fold cross-validation,GridSearchCV和RandomizedSearchCV
@Author:Runsen Model Selection是划分训练集和测试集的手段,下面总结了三种Model Selection方法. k-fold cross-validation using ...
- Python实现二叉树的三种深度遍历方法!
python代码实现了二叉树,这次将会实现二叉树的几种遍历方法,来更好的解析二叉树的结构特点.分别是一种广度遍历,和三种深度遍历方法:先序遍历,中序遍历,后序遍历.下面是代码实现: 1.先序遍历 遍历 ...
- php调用mysql库_PHP调用三种数据库的方法(1)
PHP调用三种数据库的方法(1) 更新时间:2006年10月09日 00:00:00 作者: MySQL是一个小巧灵珑的数据库服务器软件,对于中.小型应用系统是非常理想的.除了支持标准的ANSI ...
- 实现两数 交换的三种不同编程方法。
第一种 即常规方法 借助第三变量 int a = 5,b = 3,c; c = a; a = b; b = c; 第二种 不借助第三变量 int a=5,b=3,c; a = a+b; //(缺 ...
- 常用的分隔符有哪三种_掌握这三种调漂方法,你想怎么钓就怎么钓,再也不用求人...
调漂对于刚学钓鱼的钓友来说是一件非常头痛的事情,每次钓鱼大部分时间都浪费在调漂上,总是感觉调不好,不是灵了就是钝了!那么问题到底出在哪呢?今天就和大家分享三种针对悬坠钓的调漂方法,看懂弄明白了,再也不 ...
- Python 三种读文件方法read(), readline(), readlines()及去掉换行符\n
Python 三种读文件方法read(), readline(), readlines()及去掉换行符\n 首先, 让我们看下数据demo.txt, 就两行数据. 35durant teamGSW 1 ...
- OpenCV函数应用:基于二值图像的三种孔洞填充方法记录(附python,C++代码)
系列文章目录 函数系列: OpenCV函数简记_第一章数字图像的基本概念(邻域,连通,色彩空间) OpenCV函数简记_第二章数字图像的基本操作(图像读写,图像像素获取,图像ROI获取,图像混合,图形 ...
- 极低噪声幻像电源如何设计?详细原理图和三种消噪方法拿走不谢
极低噪声幻像电源如何设计?详细原理图和三种消噪方法拿走不谢 原创 ADI 亚德诺半导体 2022-04-19 11:48 极低噪声幻像电源如何设计?详细原理图和三种消噪方法拿走不谢 Q: 是否可以利用 ...
- 分享三种高效的方法,快速将一个PDF文件分割成两个!
如何将一个PDF分割成两个?PDF文件在学习和工作中都是常用的文件格式,但是有时候我们可能只需要其中的一部分内容,这时候就需要将PDF文件分割成两个或多个.本文将分享三种不同的方法,供大家参考. 一. ...
最新文章
- mysql索引为啥要选择B+树 (上)
- TextBoxSuggest,输入框提示工具,输入建议,输入匹配,辅助输入,输入即时提示,文本编辑器,Visual Studio效果,高速查询引擎,哈希树,模糊匹配,百万条零毫秒
- Unity插件之NGUI学习(8)—— Table和NGUI尺寸转换为世界坐标系尺寸
- msf principle
- 在全局中谋一域_谋全局才能谋一域
- 英语语法---分词短语详解
- Android Studio快捷键之代码提示
- 敏捷开发系列学习总结(6)——你用什么工具管理项目
- 计算机应用与维修专业主修,计算机应用与维修专业个人简历制作
- GBDT 算法:原理篇
- Mybatis常见配置错误总结
- ubuntu14.04 clementine音乐播放器无法播放ape格式解决方法
- 七夕到了 —— 属于 Java 的浪漫,拿去吧~ 祝表白成功
- uniapp的navigateTo页面跳转参数传递问题
- 银行系统日终结算要多久_银行 核心系统的清算与结算 - 系统性能与软件架构 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
- C++小白如何做简单游戏
- TOJ 3778.Sheldon's Friendship II
- [应用模板]HTML5电子相册
- 求一个n阶方阵对角线元素之和
- mfc设置半透明对话框