对各种lca算法的理解
1.RMQ+ST
首先注意这个算法的要素:结点编号,dfs序,结点深度。
首先dfs,求出dfs序,同时求出每个结点的深度。然后st算法,维护深度最小的结点编号(dfs序也可以,因为他们俩可以互相转换,只要不是深度就行了)。这样后面查询的时候才知道lca是哪个结点。如果维护的是深度。。那就不知道了。
感觉这个算法的精髓在于:两个节点的dfs序间最小深度的结点一定是它们的lca(不会证)。至于结点编号和dfs序如何转换。。dfs序转换成结点编号很简单,数组取一下就行了。然而结点编号转换成dfs序需要对于每个结点存一个first,表示每个结点第一次在dfs序中出现的位置。为什么这样。。因为无论是维护还是查询,它和其他位置都还是一样的,没影响。
所以只要认清三个要素,然后清楚它们如何转换就行了。
时间复杂度。。预处理O(nlogn),查询O(1)吧。预处理上界紧。
2.树剖
树剖思想很好理解。。顺着链往上找就行了。注意两个结点同链时要取深度低的。
时间复杂度:预处理O(n),查询O(logn)。上界都松。
3.倍增
倍增也就是先预处理一下,然后对于一个查询x,y,先把x,y跳到同一高度,再一起进退。。好理解吧。
时间复杂度:预处理O(nlogn),查询O(logn)。上界紧。。(感觉这个好蒟蒻,但是好写)
4.tarjan
前面都是在线。。这个是秒杀一切的离线算法。
它利用了dfs的性质。首先对于树dfs。当一个结点的一个孩子dfs完以后,再把它的孩子通过并查集并到它上面。注意不能按秩合并。。因为这个结点的孩子都遍历完以后,会查询与这个结点相关的询问。如果那个结点访问过,就查询那个结点的爸爸的爸爸的爸爸祖先,那一定是它们的lca。
至于为什么不能立即合并,那是因为tarjan需要将子树独立,不然查询到的就是目前访问到的最低结点,而不是对于查询的lca了。
时间复杂度:O(n)。上界。。紧不紧无关紧要。
得出结论:如果数据不大的话,用好写的倍增。不然支持离线用tarjan,只能在线的话,查询多用RMQ+ST,节点多用树剖!
对各种lca算法的理解的更多相关文章
- LCA算法的理解
		LCA思想: 在求解最近公共祖先为问题上,用到的是Tarjan的思想,从根结点开始形成一棵深搜树,非常好的处理技巧就是在回溯到结点u的时候,u的子树已经遍历,这时候才把u结点放入合并集合中, 这样u结 ... 
- LCA算法
		LCA算法: LCA(Least Common Ancestor),顾名思义,是指在一棵树中,距离两个点最近的两者的公共节点.也就是说,在两个点通往根的道路上,肯定会有公共的节点,我们就是要求找到公共 ... 
- openCV中直方图均衡化算法的理解
		直方图均衡化就是调整灰度直方图的分布,即将原图中的灰度值映射为一个新的值.映射的结果直观表现是灰度图的分布变得均匀,从0到255都有分布,不像原图那样集中.图像上的表现就是对比度变大,亮的更亮,暗的更 ... 
- 【图论】tarjan的离线LCA算法
		百度百科 Definition&Solution 对于求树上\(u\)和\(v\)两点的LCA,使用在线倍增可以做到\(O(nlogn)\)的复杂度.在NOIP这种毒瘤卡常比赛中,为了代码的效 ... 
- SDUT OJ 数据结构实验之串一:KMP简单应用   &&   浅谈对看毛片算法的理解
		数据结构实验之串一:KMP简单应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ... 
- POJ1523(割点所确定的连用分量数目,tarjan算法原理理解)
		SPF Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7406 Accepted: 3363 Description C ... 
- 【转】浅谈对主成分分析(PCA)算法的理解
		以前对PCA算法有过一段时间的研究,但没整理成文章,最近项目又打算用到PCA算法,故趁热打铁整理下PCA算法的知识.本文观点旨在抛砖引玉,不是权威,更不能尽信,只是本人的一点体会. 主成分分析(PCA ... 
- Vue中diff算法的理解
		Vue中diff算法的理解 diff算法用来计算出Virtual DOM中改变的部分,然后针对该部分进行DOM操作,而不用重新渲染整个页面,渲染整个DOM结构的过程中开销是很大的,需要浏览器对DOM结 ... 
- 关于KMP算法中,获取next数组算法的理解
		参考:KMP入门级别算法详解--终于解决了(next数组详解) https://blog.csdn.net/lee18254290736/article/details/77278769 在这里讨论的 ... 
随机推荐
- css中单位px和em,rem的区别
			PX:PX实际上就是像素,用PX设置字体大小时,比较稳定和精确.但是这种方法存在一个问题,当用户在浏览器中浏览我们制作的Web页面时,如果改变了浏览器的缩放,这时会使用我们的Web页面布局被打破.这样 ... 
- JavaUtil_07_HttpUtil_使用Hutool 封装的 HttpUtil
			二.参考资料 1.[Hutool]Hutool工具类之Http工具——HttpUtil 
- linux命令学习笔记(10):cat 命令
			cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示, 或者从标准输入读取内容并显示,它常与重定向符号配合使用. .命令格式: cat [选项] [文件] ... 
- stl_heap.h
			stl_heap.h // Filename: stl_heap.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http://b ... 
- 【二叉树的递归】05二叉树中找任意起点和终点使他们的路径和最大【Binary Tree Maximum Path Sum】
			++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树,寻找值最大的路径. ... 
- C\C++的转义字符
			C\C++的转义字符 所有的ASCII码都可以用"\"加数字(一般是8进制数字)来表示.而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符, ... 
- 脚本手动执行正常,放cron中执行有问题的原因
			问题原因: 1. crond服务没启动 2. 环境变量如 PATH LANG SHELL 等设置不对 3. 脚本中引用的文件地址是相对路径,而非绝对路径. 排查步骤: 以 check ... 
- 【QT】对Qt项目开发中遇到的问题的总结
			1. QMessageBox中文乱码 这里的中文乱码是指只有QMessageBox才出现中文乱码,其他都可以正常使用的情况.有些博客中提到使用QString::fromUtf8()函数, 实测有些情况 ... 
- 利用src.rpm包修改源码后重新制作rpm包
			1. 下载 .src.rpm包.例:https://repos.fedorapeople.org/repos/openstack/EOL/openstack-grizzly/epel-6/openst ... 
- nodejs 操作文件系统读取写入文件
			我们通过fs这个模块来对文件系统进行操作,对于文件系统操作一般都有同步.异步方法,两者区别,同步等有返回结果时候,在继续执行后面的代码,异步是不等返回结果,直接执行后面的代码,待有返回结果时候,通过回 ... 
