这里介绍LCA的三种方法(倍增,RMQ,tarjan) ps:以lg3379为例.
1.倍增
可以理解为暴力的优化.先让两个点跳在同一高度,再一起跳2^k次倍祖先.
难点:倍增数组转移方程:bz[i][j]=bz[bz[i][j-1]][j-1]
2.RMQ
提前说明这种算法比较慢,且很容易错.写在这里便于对RMQ的理解复习.
大概思路是建树后跑一遍dfs以求dfn,用数组记录点在dfn中的第一次出现的位置.
LCA一定在这两个点的dfn区间内,用RMQ求区间深度最小即LCA.有一点说
明的是在构建RMQ时用数组用同样的方式记录最小值对应的点.
3.tarjan
提前说明为离线算法,复杂度O(n+q),较快.ps:q为询问次数.
大概思路为构建已经存在的树与询问树.先dfs遍历已经存在的树,
再从遍历的节点中寻找询问树中与其关联的节点.看询问树中的节点是否
遍历过,遍历过就一定走过了LCA,用并查集维护最开始的爸爸则是LCA.
其中疑问,最开始的爸爸不是根结点吗?不,根节点的儿子还为遍历回去,还未认这个爸爸.
以此类推,存在树中的所有子树结构均满足这中关系.
标签:遍历,RMQ,三种,关于,LCA,树中,节点,bz 来源: https://www.cnblogs.com/xqysckt/p/11194904.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。