Skip to content

二进制倍增

Binary lifting · Doubling technique

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

条目类型
原则

形式陈述

S 为有限集,f:SS。二进制倍增预计算 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=f2k1f2k2f2kr,

依次沿各跳表前进即可;诸幂都是同一个 f 的迭代,彼此可交换,应用次序无关。设 |S|=N、支持的最大步数为 M,预处理时间与空间为 O(NlogM),单次查询 O(logM)。最常见的实例是有根树上的父亲函数 f(v)=parent(v)(根的父亲约定为根本身或哨兵),此时 up[k][v] 就是 v 的第 2k 级祖先。

直觉

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

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

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

边界情形:倍增表是静态快照,若 f 会被修改(换父、改权),相关表项整列失效,只能重建或改用支持动态操作的树结构;空间 Θ(NlogM)N 很大时不可忽视,而“第 k 级祖先”这类特定问题另有更省空间的线性预处理算法,倍增胜在简单与通用。另一常用技巧是在表上自高位向低位“贪心下探”:例如寻找最深的、满足某谓词的祖先时,逐位尝试大跳、越界或谓词破坏则放弃该位——这要求谓词沿祖先链单调,否则逐位判定不再正确。

推论与应用

树上的最近公共祖先是倍增的招牌应用:先把两点提到同一深度,再自高位起同步大跳,直到双方父亲重合。若接口只问第 k 级祖先,Level Ancestor 问题还能在静态树上追求线性空间与常数查询;若目标是 LCA,RMQ–LCA 等价给出另一条线性预处理路线。倍增的 O(NlogM) 预处理与 O(logM) 查询是静态 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.
关系图谱8 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

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