当前位置: 首页 > 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.lryc.cn/news/586608.html

相关文章:

  • 面试现场:奇哥扮猪吃老虎,RocketMQ高级原理吊打面试官
  • MyBatis实现分页查询-苍穹外卖笔记
  • comfyUI-controlNet-线稿软边缘
  • python-enumrate函数
  • HarmonyOS从入门到精通:动画设计与实现之六 - 动画曲线与运动节奏控制
  • houdini 用 vellum 制作一个最简单的布料
  • 洛谷题解 | UVA1485 Permutation Counting
  • C++结构体数组应用
  • Spring Boot 中使用 Lombok 进行依赖注入的示例
  • 基于springboot+Vue的二手物品交易的设计与实现(免费分享)
  • 2025年亚太杯(中文赛项)数学建模B题【疾病的预测与大数据分析】原创论文讲解(含完整python代码)
  • jieba 库:中文分词的利器
  • JAVA--双亲委派机制
  • 【springcloud】快速搭建一套分布式服务springcloudalibaba(四)
  • 【一起来学AI大模型】RAG系统流程:查询→向量化→检索→生成
  • 【AI News | 20250711】每日AI进展
  • 【TOOL】ubuntu升级cmake版本
  • AI产品经理面试宝典第12天:AI产品经理的思维与转型路径面试题与答法
  • 功耗校准数据PowerProfile测试方法建议
  • 【深度剖析】致力“四个最”的君乐宝数字化转型(下篇:转型成效5-打造数字化生存能力探索可持续发展路径)
  • VUE3 el-table 主子表 显示
  • Transformer基础
  • Openpyxl:Python操作Excel的利器
  • Qt 多线程编程:单例任务队列的设计与实现
  • 五、深度学习——CNN
  • NW728NW733美光固态闪存NW745NW746
  • C语言32个关键字
  • 锁相环初探
  • Python Day11
  • 《Spring 中上下文传递的那些事儿》Part 11:上下文传递最佳实践总结与架构演进方向