浅谈倍增算法
倍增(ST)
倍增是什么?
倍增,每次将范围扩大或减少一倍以达到加速的效果
思想引入:如果你想跳到n = 15米远的地方,怎么做?
-
一步一步跳过去(暴力):显然这是15次
-
次(倍增):
- 设 k = 5, = 32 > n, k -- ,k = 4 (超了)
- k = 4, = 16 > n, k --,k = 3 (超了)
- k = 3, = 8 < n,n = n - 8 = 7, k --, k = 2(跳)
- k = 2, = 4 < n,n = n - 4 = 3, k --, k = 1(跳)
- k = 1, = 2 < n,n = n - 2 = 1, k --, k = 0(跳)
- k = 0, = 1 < n,n = n - 1 = 0(跳到了)
即只跳了4次,与暴力做法相比,少了11次。而且数据越大相差的越大,因为暴力是O(n)而倍增是O()
可以发现一个性质,如果跳用1,不跳用0表示,则用二进制表示为1111,这恰好是15。
所以这就称为
二进制转换
,比如11用倍增的思想做出来,恰好是1011.
在图论中的应用
在大多数情况下,图论中的点或边都可以按某种方式排序,如果问题要求的是O()的时间复杂度,就需要考虑倍增的思想,可以结合的最优子结构和ST表的思想求解。
倍增在LCA(最近公共祖先)中的应用
LCA其实就相当于在树上找的最短路,因为找到了最近公共祖先就相当于找到了一条最短路径
首先,要找到和第一个不同祖先不同的位置,然后从这个位置向上走一步就是最近公共祖先。要想找到第一个不同祖先的位置,就要保证在同一深度(这样才能同时向上移一步)
所以这个过程分为三步:
先用一个dfs/bfs找到所有的节点深度
,用depth数组存下
fa[i,j]表示从开始,向上走步所能走到的节点。
预处理
查询
__EOF__

本文作者:Zhicheng
本文链接:https://www.cnblogs.com/L-zhicheng/p/16222138.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/L-zhicheng/p/16222138.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异