25.5.22学习总结
ST表(Sparse Table,稀疏表)是一种用于高效解决静态区间最值查询(RMQ)问题的数据结构。其核心思想是通过预处理每个长度为2^j的区间的最值,使得查询时只需合并两个子区间的最值即可得到结果,从而实现O(1)的查询复杂度。
一、核心特性
-
预处理时间复杂度:O(nlogn)
-
查询时间复杂度:O(1)
-
适用场景:静态数据(无修改操作)的区间最值查询。
-
支持操作:可重复贡献且可结合的运算(如最大值、最小值、最大公约数等)。
二、构建过程
-
初始化:
-
定义二维数组
st
,其中st[i][j]
表示从位置i
开始、长度为2j的区间的最值。 -
初始时,
st[i][0] = arr[i]
(即长度为1的区间的最值为元素本身)。
-
-
动态规划填充:
-
对于每个j(1≤j≤⌊log2n⌋),遍历所有可能的起点
i
,满足i+2j−1<n。 -
状态转移方程:
st[i][j]=op(st[i][j−1],st[i+2j−1][j−1])其中
op
为合并操作(如取最大值或最小值)。
-
三、查询过程
对于区间[L,R]的最值查询:
-
计算区间长度:len=R−L+1。
-
确定最大幂次:k=⌊log2len⌋。
-
合并子区间结果:
result=op(st[L][k],st[R−2k+1][k])这两个子区间分别覆盖[L,L+2k−1]和[R−2k+1,R],确保完全覆盖原区间。
四、优缺点分析
-
优点:
-
查询速度快(O(1))。
-
适用于多次查询静态数据的场景。
-
-
缺点:
-
不支持动态修改。
-
仅适用于可重复贡献的操作。
-
五、ST表与线段树的比较
1. 时间复杂度对比
操作 | ST表 | 线段树 |
---|---|---|
预处理 | O(nlogn) | O(n) |
查询 | O(1) | O(logn) |
更新 | 不支持 | O(logn) |
-
ST表:查询极快(常数时间),但预处理稍慢,且不支持动态修改。
-
线段树:查询和更新均为对数时间,支持动态数据。
2. 空间复杂度对比
数据结构 | 空间复杂度 |
---|---|
ST表 | O(nlogn) |
线段树 | O(n) |
-
ST表:需要二维数组存储预处理结果,空间消耗较大。
-
线段树:通常用一维数组实现(类似堆),空间更优。
3. 功能对比
功能 | ST表 | 线段树 |
---|---|---|
静态区间最值(RMQ) | ✔️ | ✔️ |
动态区间最值/和 | ❌ | ✔️ |
区间更新 | ❌ | ✔️ |
可扩展性 | ❌ | ✔️ |
4. 适用场景
-
选择ST表:
-
数据静态不变,且需要极快查询(如高频RMQ)。
-
无需支持修改操作。
-
例如:离线处理大量查询的RMQ问题。
-
-
选择线段树:
-
数据动态变化,需要支持更新。
-
查询类型复杂(如区间和、区间最值混合)。
-
例如:实时更新的数据库区间统计。
-
六、例题
【模板】ST 表 && RMQ 问题https://www.luogu.com.cn/problem/P3865