倍增 and RMQ 问题 学习日记
什么是倍增?
倍增,从字面及数学的角度就是 ”成倍增长“ 的意思。这能使线性问题转化为数级处理,优化时间复杂度。
不是人话是不是?听不懂是不是? 看这里。这是指我们在进行递推时,如果状态空间很大,通常的线性递推无法满足时间与空间复杂度的要求,那么我们可以通过成倍增长的方式,只递推状态空间中在
因为基本定理:任意整数可以表示成若干个2的次幂项的和 这一性质,使用之前求出的代表值拼成所需的值。
”倍增“ 与 ”二进制划分“ 两个思想相互结合,降低了求解很多问题的时间与空间复杂度。快速幂其实就是 “倍增” 与 ”二进制划分“ 思想的一种体现 (不然你以为 。
倍增的主要应用为:快速幂,RMQ 问题,ST 算法,LCA 等。
RMQ 问题 / ST 算法
关于 100 多行的线段树不香吗
著名的 ST 表大法能在
设
由于使用倍增思想,所以子区间长度成倍增长,所以当我们计算
1 | void ST1() |
当询问区间最值时,我们计算出一个值
而这个值可能小于区间长度,所以我们要分两段进行求值,分别是 “从
1 | int ST2(int l, int r) |
注:ST 表可以求 最大/最小值,你只需要把
参考资料
https://www.dotcpp.com/course/947
https://www.cnblogs.com/boranhoushen/p/16557961.html
https://blog.nowcoder.net/n/63f14dae8a194960844facb24c23e58f?from=nowcoder_improve
- 标题: 倍增 and RMQ 问题 学习日记
- 作者: George222
- 创建于 : 2024-09-13 17:18:19
- 更新于 : 2024-09-13 19:38:09
- 链接: https://george110915.github.io/倍增 and RMQ 问题 学习日记/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。