[数据结构]稀疏表 ST表

本文介绍了ST表(稀疏表)这一数据结构,用于在O(nlogn)预处理时间后,以O(1)时间复杂度进行区间最大值查询。通过倍增法设置f[i][j]表示从下标i开始的2^j个数的最大值,详细阐述了初始化、构建过程和查询操作。适合对数据结构和算法感兴趣的读者学习。
摘要由CSDN通过智能技术生成

写在前面

有错误请指出

正文

内容

ST表 是一个维护区间 最大值 或 最小值 的数据结构

ST表 用 O ( n log ⁡ n ) O(n \log n) O(nlogn) 的时间预处理, O ( 1 ) O(1) O(1) 的时间查询

f [ i ] [ j ] f[i][j] f[i][j] 表示为 下标 i i i 起, 2 j 2^j 2j 个数中的最大值,用倍增实现

很好理解

实现

本博客以最大值为例

初始化

设维护的数组为 a [ i ] a[i] a[i]
f [ i ] [ 0 ] = a [ i ] f[i][0] = a[i] f[i][0]=a[i]

过程

是一个类似于 区间dp 的流程

很容易得出

f [ i ] [ 1 ] = m a x ( f [ i ] [ 0 ] , f [ i + 1 ] [ 0 ] ) f[i][1] = max (f[i][0] ,f[i + 1][0]) f[i][1]=max(f[i][0],f[i+1][0])

以此类推

f [ i ] [ j ] = m a x ( f [ i ] [ j − 1 ] , f [ i + 2 j − 1 ] [ j − 1 ] ) f[i][j] = max (f[i][j - 1],f[i + 2^{j - 1}][j - 1]) f[i][j]=max(f[i][j1],f[i+2j1][j1])

就求出 ST表 了

void ST () {
 for (int len = 1;(1 << len) <= n;++ len) {
  for (int q = 1;q + (1 << len) <= n;++ q) {
   f[q][len] = max (f[q][len - 1] ,f[q + (1 << (len - 1))][len - 1]);
  }
 }
 return ;
}

查询

有了 ST表 还不行,还得会查询

很容易理解

ll RMQ (int l ,int r) {
 int k = (int) (log ((double) (r - l + 1)) / log (2.0));
    return max (f[l][k] ,f[r - (1 << k) + 1][k]);
}

此处为查询 最大值

最小值同理,把 max ⁡ \max max 改为 min ⁡ \min min 即可

后记

谢谢大家

——2020.10.4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值