当前位置: 首页 > news >正文

009 ST表:静态区间最值的极致优化

ST表(Sparse Table) 是一种解决静态区间最值查询(RMQ) 的高效数据结构。它通过巧妙的倍增思想动态规划,在O(1)时间内完成查询,成为处理固定数据区间最值问题的利器。


一、ST表核心思想

1. 倍增思想

ST表的核心是倍增预处理:将每个区间的最大值表示为若干长度为2k2^k2k的子区间最值的组合。

预处理关键步骤

  1. f[i][j]表示从位置i开始长度为2j2^j2j的区间最值
  2. 状态转移方程:
 f[i][j] = max(f[i][j-1], f[i + (1 << (j-1))][j-1]) 
2. 区间查询优化

查询区间[L, R]时,找到满足2k≤(R−L+1)2^k ≤ (R-L+1)2k(RL+1)的最大k值:

max(f[L][k], f[R - (1 << k) + 1][k])

二、时间复杂度分析

操作时间复杂度说明
预处理O(n log n)双重循环遍历n个位置和log n个长度
单次查询O(1)仅需两次数组访问和取最值操作
空间占用O(n log n)二维数组存储所有预处理结果

对比其他数据结构

  • 线段树:查询O(log n) | 支持动态更新
  • 树状数组:查询O(log n) | 仅部分区间问题
  • ST表在静态数据场景下性能碾压

三、适用场景与限制

✅ 适用场景:
  1. 静态区间最值查询(RMQ)

    • 最大值/最小值(最常用)
    • 区间GCD
    • 区间按位与/或(如[LeetCode 1310])
  2. 结合其他算法优化效率

    • LCA问题(欧拉序+RMQ)
    • 二维矩阵最值(扩展ST表)
    • 分治问题中的快速区间定位
⛔ 使用限制:
  1. 数据必须静态:不支持插入/删除操作
  2. 可重复贡献:满足f(x,x)=xf(f(a),f(b))=f(a,b)
  3. 空间消耗大:1e6数据需约20n空间

四、模板代码(C++实现)

#include <vector>
#include <cmath>
using namespace std;class ST {vector<vector<int>> f;  // f[i][j]: 从i开始,2^j长度的区间最值vector<int> lg;         // 预计算对数
public:ST(vector<int>& nums) {int n = nums.size();lg.resize(n + 1);// 预处理对数for (int i = 2; i <= n; i++) lg[i] = lg[i >> 1] + 1;// 初始化ST表int k = lg[n] + 1;f.resize(n, vector<int>(k));for (int i = 0; i < n; i++) f[i][0] = nums[i];  // 长度为1的区间// DP计算其他区间for (int j = 1; j < k; j++) for (int i = 0; i + (1 << j) <= n; i++)f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);}int query(int l, int r) {int k = lg[r - l + 1];return max(f[l][k], f[r - (1 << k) + 1][k]);}
};

五、实战应用场景

场景1:快速区间最值(洛谷P3865)
  • 需求:10^6次查询数组固定区间的最大值
  • ST表解法
    ST st(arr);
    while (q--) {cin >> l >> r;cout << st.query(l-1, r-1) << "\n";
    }
    
场景2:区间极差计算(洛谷P2880)
  • 需求:求区间最大/最小值之差
  • 优化方案
    ST max_st(arr);  // 最大值ST表
    ST min_st(arr);  // 最小值ST表(需修改query为min)int diff = max_st.query(l, r) - min_st.query(l, r);
    
场景3:二维最值问题(洛谷P2216)
  • 扩展方案:将ST表扩展到二维
    // 伪代码:预处理列方向ST表
    for (int k = 1; k < K; k++) for (int i = 0; i < n; i++) for (int j = 0; j <= m - (1<<k); j++) f[i][j][k] = max(f[i][j][k-1], f[i][j+(1<<(k-1))][k-1]);
    

六、经典例题推荐

  1. [洛谷P3865] ST表模板(必做)
  2. [洛谷P1816] 忠诚(区间最小值查询)
  3. [洛谷P2880] 平衡的阵容(区间极差)

结语:ST表是静态数据区间查询的终极武器,其O(1)查询效率无可匹敌。虽然无法处理动态数据,但在固定数据集的最值、GCD等问题上,它始终是性能最优的解决方案。掌握ST表的思想,能让你在面对区间查询问题时多一件高效的工具。

http://www.xdnf.cn/news/1110745.html

相关文章:

  • OpenEuler操作系统测试USB摄像头
  • kettle从入门到精通 第101课 ETL之kettle DolphinScheduler调度kettle
  • 怎么在ComfyUI中查看别人训练的lora模型训练参数
  • 面试150 翻转二叉树
  • 26-计组-寻址方式
  • Git企业级开发(最终篇)
  • 手把手教你用YOLOv10打造智能垃圾检测系统
  • SpringBootloggers未授权访问漏洞处理
  • Java使用Langchai4j接入AI大模型的简单使用(四)--整合Springboot
  • 12.使用VGG网络进行Fashion-Mnist分类
  • 让 VSCode 调试器像 PyCharm 一样显示 Tensor Shape、变量形状、变量长度、维度信息
  • CSS flex
  • 安卓定制功能
  • 外设数据到昇腾310推理卡 之二dma_alloc_attrs
  • Linux系统编程——目录 IO
  • 理解小数的计算机表达
  • PyTorch神经网络实战:从零构建图像分类模型
  • 脉冲神经网络膜电位泄漏系数学习:开启时空动态特征提取的新篇章
  • 复现永恒之蓝
  • Linux - 安全排查 3
  • 飞算JavaAI:重新定义Java开发效率的智能引擎
  • python-for循环
  • 【TA/Unity】Shader基础结构
  • 强化学习、PPO和GRPO的通俗讲解
  • 创客匠人:解析创始人 IP 打造对知识变现的深层赋能
  • os.machine()详解
  • vue3 el-table动态表头
  • 菜鸟的C#学习(二)
  • TDengine 使用最佳实践(1)
  • hot100链表(1)