Skip to content

方法Method

二进制倍增

Binary lifting · Doubling technique

预计算函数的 2k 次迭代,用输入步数的二进制展开快速跳转。

形式陈述 ​

设 S 为有限集,f:S→S。二进制倍增预计算 f 在函数复合意义下的各个 2k 次幂:

up[0][v]=f(v),up[k+1][v]=up[k][up[k][v]],

即 up[k][v]=f2k(v),每一层由上一层与自身复合而得。要计算 fm(v),把步数 m 写成二进制展开 m=2k1+⋯+2kr,则

fm=f2k1∘f2k2∘⋯∘f2kr,

依次沿各跳表前进即可;诸幂都是同一个 f 的迭代,彼此可交换,应用次序无关。设 |S|=N、支持的最大步数为整数 M≥1,保存 0≤k≤⌊log2⁡M⌋ 的各层。常数时间表访问模型下,预处理时间与空间为 O(Nlog⁡(M+1)),查询 0≤m≤M 为 O(1+log⁡(m+1));m=0 直接返回 v。若只支持 M=0,无需建立跳表。

最常见的实例是有根树上的父亲函数 f(v)=parent(v)(根的父亲约定为根本身;若使用哨兵,就把哨兵加入 S 并令其映到自身),此时 up[k][v] 就是 v 的第 2k 级祖先。

直觉

这与快速幂是同一个思想:任何步数都是若干个二的幂之和,只要预先备好“跳 1,2,4,8,… 步”的答案,走 m 步就化为至多 ⌊log2⁡m⌋+1 次大跳。倍增表本身按动态规划方式填充——跳 2k+1 步等于先跳 2k 步、再从落点跳 2k 步,恰好复用已算好的半程答案。支撑这一切的代数事实只有一条:函数复合满足结合律,因此“先分块预算、再拼接”与一步步走结果相同。与朴素逐步模拟相比是 O(log⁡m) 对 O(m) 的差距,代价是对数因子的额外内存与一次静态预处理。

幂次跳表与二进制分解
例子与边界

取一条父指针链 14→13→⋯→1(箭头指向父亲,根 1 指向自身),查询结点 14 的第 13 级祖先:13=8+4+1,依次查表 up[3][14]=6、up[2][6]=2、up[0][2]=1,三次查表替代十三步逐级上爬。倍增表还可与“可结合的路径摘要”并行维护:令 agg[k][v] 为从 v 向上 2k 步路径上的最小值(或和、最大值),其合并规则与 up 完全同构——这要求摘要运算构成幺半群,若结合律缺失,拼接便无意义。

边界情形:倍增表是静态快照,若 f 会被修改(换父、改权),改变一个映射值也可能使多个起点、多个层级的表项失效,需要重建或另给动态维护算法;空间 Θ(Nlog⁡(M+1)) 在 N 很大时不可忽视,而“第 k 级祖先”这类特定问题另有更省空间的线性预处理算法,倍增胜在简单与通用。另一常用技巧是在表上自高位向低位“贪心下探”:例如当前节点满足谓词,且沿向根方向谓词先真后假时,可逐位尝试仍为真的大跳,寻找最靠近根的真祖先。必须同时限制不超过实际深度,避免根自环制造不存在的更远祖先。这个结论依赖谓词沿链单调;返回位置正是真区间向根一侧的边界。

推论与应用

树上的最近公共祖先是倍增的招牌应用:先把较深点提到同一深度;若两点已经相同,立即返回该点。否则从高位到低位,只在两点的 2k 级祖先不同时让它们同时跳过去,最后返回任一点的父亲。每次跳跃都停在 LCA 下方,因而不会越过答案。若接口只问第 k 级祖先,Level Ancestor 问题还能在静态树上追求线性空间与常数查询;若目标是 LCA,RMQ–LCA 等价给出另一条线性预处理路线。倍增的 O(Nlog⁡(M+1)) 预处理与 O(log⁡(M+1)) 查询是静态 RAM 下的最坏界,胜在构造直接,而非所有树查询上的最终界。

稀疏表把同一“按二的幂分块”思想用于静态区间查询,数与矩阵的快速幂是它在乘法结构上的化身。并行环境中的指针跳跃与链表排名也反复把后继距离加倍,但评价指标变成总工作与并行深度。函数图上的第 m 个后继、树上路径摘要仍属于顺序查表版本;共享“doubling”图像不表示这些成本模型相同。

参考资料
  • OI-Wiki contributors, OI-Wiki (2026), binary lifting.
  • cp-algorithms contributors, Algorithms for Competitive Programming (2026), binary lifting.
  • Michael A. Bender and Martín Farach-Colton, “The LCA Problem Revisited,” LATIN 2000, LNCS 1776, 2000.
关系图谱7 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系