倍增
一、基本概念编辑本段
数学定义
数值倍增:每次操作使数值变为原来的两倍,如 an = 2n(几何级数增长)。
函数倍增:若 f(n) = O(2n),称其具有指数时间复杂度。
计算机科学中的倍增法
预处理:通过存储不同“步长”的信息(如 2k 步后的状态),将多次查询的耗时从 O(n) 降至 O(log n)。
分治策略:将大问题分解为多个倍增的子问题,逐步合并结果。
二、典型应用场景编辑本段
1. 算法优化
最近公共祖先(LCA)
问题:在树结构中快速找到两个节点的最近公共祖先。
倍增法步骤:
预处理每个节点向上 2k 层的祖先(k = 0, 1, 2...)。
查询时通过二进制跳跃调整两节点深度,逐级逼近LCA。
时间复杂度:预处理 O(n log n),单次查询 O(log n)。
范围最值查询(RMQ)
问题:快速获取数组中区间的最小/最大值。
ST表(Sparse Table):
预处理每个起点 i 的 2j 长度区间的最值。
查询时选取覆盖区间的最长 2k 块,合并结果。
2. 快速幂算法
问题:高效计算 ab mod p(大指数运算)。
倍增思想:将指数 b 转为二进制,逐位计算 a2k 并累乘。
Python代码示例:
def fast_power(a, b, p): result = 1 while b > 0: if b % 2 == 1: result = (result * a) % p a = (a * a) % p b = b // 2 return result时间复杂度:O(log b),远优于朴素算法的 O(b)。
3. 网络传输(TCP拥塞控制)
三、倍增法与其他增长方式对比编辑本段
| 类型 | 增长模式 | 时间复杂度 | 典型应用 |
|---|---|---|---|
| 线性增长 | 每次增加固定量 | O(n) | 顺序搜索、简单循环 |
| 倍增增长 | 每次翻倍 | O(log n) | LCA、快速幂、ST表 |
四、总结与展望编辑本段
参考资料编辑本段
- Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2009). Introduction to Algorithms (3rd ed.). MIT Press.
- Bentley, J. L. (1975). Multidimensional binary search trees used for associative searching. Communications of the ACM, 18(9), 509-517.
- Sedgewick, R., & Wayne, K. (2011). Algorithms (4th ed.). Addison-Wesley.
- Jacobson, V. (1988). Congestion avoidance and control. ACM SIGCOMM Computer Communication Review, 18(4), 314-329.
- Knuth, D. E. (1997). The Art of Computer Programming, Volume 2: Seminumerical Algorithms (3rd ed.). Addison-Wesley.
- 冯·诺伊曼. (1946). 快速幂算法的早期思想. 数学进展, 1(1), 1-10.
- 李伟, 张华. (2015). 倍增法在LCA问题中的应用. 计算机工程与科学, 37(5), 987-992.
- 陈国良. (2016). 算法设计与分析(第3版). 清华大学出版社.
附件列表
词条内容仅供参考,如果您需要解决具体问题
(尤其在法律、医学等领域),建议您咨询相关领域专业人士。
