倍增
倍增法(Binary Lifting),核心思想是利用二进制拆分,预处理出跳 2⁰、2¹、2²… 步的状态,把单次大步查询拆解成若干次预计算的小步跳转,将原本线性的时间复杂度优化到对数级别,常用于 LCA、RMQ、后缀数组等问题。
算法设计1分钟阅读

倍增法(Binary Lifting / Doubling Technique) 是一种在计算机科学与算法设计中非常经典且高效的思想。
它的核心核心逻辑非常简单:“成倍增长,跳跃前进”。通过利用 的幂次方(),将原本需要逐位线性推导的 复杂度,大幅降低到 。
在日常生活中,如果让你用尽可能少的硬币凑出某个金额,或者用最少的操作步数走完一段距离,指数级递增是最快速的缩小范围方式。
倍增法建立在一个基础数学事实之上:任何正整数都可以唯一地表示为二进制数(即若干个 2 的幂次方之和)。
- 例如:走 13 步,可以拆解为 (即二进制
1101)。 - 我们不需要一步一步走 13 次,而是直接跳跃 8 步,再跳跃 4 步,最后跳跃 1 步,仅用 3 次跳跃 即可到达目的地。
倍增法在图论、动态规划以及高级数据结构中有非常广泛的应用,最典型的两大应用场景如下:
在树形结构中,求两个节点的最近公共祖先,如果朴素地让较深的节点一步步向上爬,效率会比较低(退化成链时为 )。
-
倍增做法: 预处理出每个节点向上跳 步所到达的祖先节点,定义
dp[u][k]为节点u的第 个祖先。 -
转移方程:
即:“向上跳 步” 等价于 “先向上跳 步,再从那个节点向上跳 步”。
-
查询阶段: 借助预处理好的数组,先把两个节点对齐到同一深度,然后利用二进制思想从大到小(如 )尝试向上跳跃,即可在 时间内锁定 LCA。
计算 时,如果连乘 次,复杂度是 。
- 倍增做法: 利用 ,把指数 进行二进制拆分。
- 这样可以将原本需要执行 次的乘法,缩减至约 次操作。
- 查询极快: 单次查询复杂度从线性 降至对数级 。
- 状态转移优雅: 利用二进制按位处理,代码实现逻辑通常非常清晰。
- 需要预处理空间: 需要存储 规模的状态矩阵(如
dp[N][LOGN])。 - 通常要求状态可合并且静态: 如果原图结构或数据频繁发生动态修改,倍增数组的维护成本会比较高(此时通常需要结合树链剖分或 LCT 等更高级数据结构)。