倍增与 ST 表

倍增与 ST 表:


倍增:

“成倍增长”,通过倍增带来的指数级别增长快速抵达(逼近)目标位置(状态)。

• 【相较线性一步步走抵达目标位置 O(N),倍增只需 O(logN) 即可抵达】。
• 通过倍增抵达目标位置(状态)可分为目标位置已知(快速幂),目标位置未知(LCA)两种情况。

目标位置已知,指知道从当前位置抵达目标位置的距离,且距离是整数(任意整数可以表示成若干个 2 的次幂的形式)。

  1. 已知目标点距离当前位置为 b,每次可移动 2**(i ∈ A) 步且每一次移动都需移动步数大于等于前一步。
    • 可将 b 转化为二进制形式(如 5 → (101)_2),则可先走 2^0 步,再走 2^2 步即可到达目标位置。
  2. 已知整数 a 和整数 b,求 a^b,即求 b 个 a 的连乘结果,可知 1 距离 a^b 差 b 个 a 连乘。(快速幂)
    • 如 a^5 可将其看作 a^(101)_2 的形式,即 a1×20 × a0×21 × a1×22 = a^1 × a^4。
    • 在求解过程中,可从 a^1 逐步倍增到 a^b 并记录其值,以此到达目标位置求解问题。

Ø 在已知目标位置时,可通过倍增快速抵达目标位置,前提是我们递推问题的状态空间(从起点抵达目标的方式)关于 2 的次幂具有可划分性。

目标位置未知,指不清楚所需抵达的目标的具体位置,但抵达某个位置后可知晓该位置与目标位置的先后关系。
• 如在二分中,虽事先不知道所求答案具体位置,但能通过红蓝边界进行判断从而逼近目标位置(倍增可替代二分)。

  1. 在一个不重复有序序列 A 中,找值为 x 的元素所在下标。
    • 可从当前位置 i 依次尝试走 2^k (k ∈ N), …, 2^0 步,到达 A[i + 2^k] 后判断 A[i + 2^k] 与 x 大小关系,
    • 当 A[i + 2^k] > x 时,缩小 k,令 k = k - 1,继续判断;
    • 当 A[i + 2^k] < x 时从 i 走 2^k 步到达新位置 i = i + 2^k,继续重复之前判断;
    • 当 A[i + 2^k] = x 时,i + 2^k 即是 x 下标。
  2. 在树上求两点最近公共祖先,亦可如 1 中,尝试走并判断,来快速逼近目标位置,从而抵达。

Ø 在未知目标位置时,可通过倍增快速逼近从而抵达,前提是能知晓尝试到达位置和目标位置之间的关系。


ST 表:

在 RMQ(区间最值问题)中,给定一个长度为 N 的序列 A,ST 算法能在 O(NlogN) 时间预处理后,以 O(1) 的时间复杂度在线回答“数列 A 中区间 [l, r] 所有数的最值”问题。【用于处理可重复贡献问题,需预处理,只能静态查询】

给定 n 个数,有 m 个询问,对于每个询问,你需要回答区间 [l, r] 中的最大值。

  • 可重复贡献:对于区间 [l, r] 而言,区间最值可由多个可重叠的子区间最值共同构成(可重不漏)。
  • 一个序列的子区间数目为 N^2 个,可选择一些 2 的整数次幂的位置作为代表:F[i, k]表示区间 [i, i + 2^k - 1] 的最大值。
  • 递推边界:F[i, 0] → [i, i] ⇒ F[i, 0] = A[i],即数列 A 在子区间 [i, i] 里的最大值。
  • 递推公式:递推时,将子区间长度成倍增长,有 F[i, k] = max(F[i, k - 1], F[i + 2^k - 1, k - 1])。

在这里插入图片描述

预处理

  • 递推边界:F[i, 0] → [i, i] ⇒ F[i, 0] = A[i],即数列 A 在子区间 [i, i] 里的最大值。
  • 递推公式:递推时,将子区间长度成倍增长,有 F[i, k] = max(F[i, k − 1], F[i + 2^k−1, k − 1])。

区间求最值

  • 询问任意区间 [l, r] 最值时,可先计算出一个 k,满足 2^k ≤ r − l + 1 < 2^(k+1),即小于区间长度下最大的 k。
  • “从 l 开始的 2^k 个数” 和 “以 r 结尾的 2^k 个数”,这两段一定覆盖了整个区间。
  • 二维 ST 表

在这里插入图片描述

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值