RMQ详解(ST表)

ST表与RMQ问题:高效区间查询的实现与优化 区间最值查询(RMQ)是算法中的经典问题,指在静态数组上快速获取指定区间的最大值或最小值。基于倍增思想的ST表(Sparse Table)通过O(nlogn)预处理,将查询时间复杂度优化至O(1),成为解决RMQ问题的利器。该数据结构利用动态规划预处理不同长度区间的极值,通过二进制拆分实现快速查询。在工程实践中,ST表广泛应用于需要高频区间查询的场景,如数据分析中的峰值统计、时间序列处理等。结合GCD等可重复贡献运算的特性,ST表还能高效处理区间公约数等衍生问题。相比线段树等动态结构,ST表在静态数据处理场 阅读详情

RMQ详解

RMQ算法, 是一个快速求出区间最值的算法,预处理时间复杂度为O(n*log(n)),查询为O(1)。

著名的ST算法就是倍增的产物。给定一个长度为N的数列A,ST算法能在O(n*logn)时间的预处理后,以O(1)的时间复杂度在线回答“数列A中下标在(l~r)之间的数的最大值是多少”这样的区间最值问题。

预处理:

设F[i][j]表示数列A从第i个数起连续 2 j 2^j 2j个数([ i , i + 2 j − 1 i,i+2^j-1 i,i+2j−1])中的最大值。递推边界是F[i][0] = A[i],即数列A在区间[i,i]里的最大值。

在递推时,我们把子区间的长度成倍增加,即长度为 2 j 2^j 2j的子区间最大值是左右两半长度为 2 j − 1 2^{j-1} 2j−1的子区间的最大值中较大的一个。即 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][j−1],F[i+2j−1][j−1])

例如:

A数组为: 3 2 4 5 6 8 1 2 9 7

F[1,0]表示从第1个数起,长度为 2 0 = 1 2^0=1 20=1的最大值,即3这个数。同理 F [ 1 , 1 ] = m a x ( 3 , 2 ) = 3 F[1,1]=max(3,2)=3 F[1,1]=max(3,2)=3, F [ 1 , 2 ] = m a x ( 3 , 2 , 4 , 5 ) = 5 F[1,2]=max(3,2,4,5)=5 F[1,2]=max(3,2,4,5)=5, F [ 1 , 3 ] = m a x ( 3 , 2 , 4 , 5 , 6 , 8 , 1 , 2 ) = 8 F[1,3]=max(3,2,4,5,6,8,1,2)=8 F[1,3]=max(3,2,4,5,6,8,1,2)=8;

F[i,0]就等于A[i] (DP的初始值)

我们把F[i , j]平均分成两段(因为区间内一共有偶数个数字),从 i i i到 i + 2 j − 1 − 1 i+2^{j-1}-1 i+2j−1−1为一段, i + 2 j − 1 i+2^{j-1} i+2j−1到 i + 2 j − 1 i+2^{j-1} i+2j−1为另一段。(长度都为 2 j − 1 2^{j-1} 2j−1)。当i=1,j=3时就是3,2,4,5和6,8,1,2这两段。F[i, j]就是这两段中最大值的最大值。

状态转移方程为: 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,j−1],F[i+2j−1,j−1])。

代码:
void RMQ(int num) //预处理->O(nlogn)
{
    for(int j = 1; j < 20; ++j)    // 这里j的范围根据具体题目数据定义
        for(int i = 1; i <= num; ++i)    // num为数组内整数的个数
            if(i + (1 << j) - 1 <= num)
            {
                maxsum[i][j] = max(maxsum[i][j - 1], maxsum[i + (1 << (j - 1))][j - 1]);
                minsum[i][j] = min(minsum[i][j - 1], minsum[i + (1 << (j - 1))][j - 1]);
            }
}
查询:

假如我们需要查询的区间为[i, j],那么我们需要找到覆盖这个闭区间(左边界取i,右边界取j)。可以重复,比如查询5,6,7,8,9,我们可以查询5678和6789.

因为这个区间的长度为j - i + 1,所以我们可以取 k = l o g 2 ( j − i + 1 ) k=log_2(j-i+1) k=log2​(j−i+1),则有 F [ i , j ] = m a x ( F [ i , k ] , F [ j − 2 k + 1 , k ] ) F[i,j] = max(F[i, k], F[j-2^k+1, k]) F[i,j]=max(F[i,k],F[j−2k+1,k])。
例如:要求区间[2, 8]的最大值, k = l o g 2 ( 8 − 2 + 1 ) = 2 k=log_2(8-2+1) = 2 k=log2​(8−2+1)=2,即求 m a x ( F [ 2 , 2 ] , F [ 8 − 2 2 + 1 , 2 ] ) = m a x ( F [ 2 , 2 ] , F [ 8 − 2 2 + 1 , 2 ] ) = m a x ( F [ 2 , 2 ] , F [ 5 , 2 ] ) max(F[2, 2], F[8-2^2+1, 2]) = max(F[2,2], F[8-2^2+1,2]) = max(F[2, 2], F[5, 2]) max(F[2,2],F[8−22+1,2])=max(F[2,2],F[8−22+1,2])=max(F[2,2],F[5,2])

代码:
int query(int l, int r)
{
	int k = log(r-l+1) / log(2);
	return max(F[l][k], F[r - (1<<k) + 1][k]);
}
例题:

POJ-3264 Balanced Lineup

【模板】ST表求解RMQ问题 RMQRMQRMQ问题 RMQ(Range&amp;nbsp;Minimum&amp;nbsp;Query)RMQ(Range&amp;nbsp;Minimum&amp;nbsp;Query)RMQ(Range \ Minimum \ Query),范围最小值问题。具体表现为一下一类问题: 给出一个 nnn 个元素的数组 A1,A2,…,AnA1,A2,…,AnA_1, A_2, \dots , A_n ,求解 min(l,... 阅读详情

相关推荐

题解:洛谷 P3865 【模板】ST 表 & RMQ 问题

—两个覆盖查询区间的子区间的最值可以合并得到整体最值,因此可以通过预处理实现。个区间最值查询(RMQ),需要快速回答每个区间。若对每个查询暴力扫描,时间复杂度为。次询问,求出每一次询问的区间内数字的最大值。行,每行一个整数,依次表示每一次询问的结果。,表示查询的区间为$ [l_i,r_i]$。,分别表示数列的长度和询问的个数。关键观察是:区间最值具有。行,每行包含两个整数。),依次表示数列的第。

团爸讲算法 830

RMQ算法讲解

现在给你一个问题:给你一个数组 ,其中有N个数字,现在给你一次询问,给你区间[l ,r],问你在这个区间内的最大值为多少? 哇!这题简单啊,一个for循环,遍历数组记录最大值输出即可啊。 那好,现在我告诉你假设N为50000,给你Q次询问((1 ≤ Q ≤ 200,000)),如果这种情况,我们还每次都进行暴力遍历求解的话,那么无论你提交几万次都会得到如下结果: 是的,这种暴...

不期而遇 3万+

rmq算法(倍增)

rmq算法,有详细注释 dp1[i][j] = max ( dp1[i][j-1] , dp1[i+(1<<(j-1))][j-1] ) ; dp2[i][j] = min ( dp2[i][j-1] , dp2[i+(1<<(j-1))][j-1] ) ;

RMQ算法

RMQ介绍   要介绍RMQ算法首先要介绍其解决的问题,RMQ是一个解决多个区间最值查询的算法,RMQ(Range Minimum/Maximum Query),即区间最值查询,如果我们要查询某一个区间内的最值,显然我们可以用暴力搜索的方式在O(n)的时间复杂度内获得结果,但是当我们要查询10000个不同区间内的最值时,我们如果依然采用暴力搜索的方式,那么时间复杂度就会变成O(mn),其中m指的是查询次数,n指的是数据个数。   RMQ算法的目标就是降低多区间最值查询问题的时间复杂度,RMQ算法是通过动态规

qq_37957064的博客 4048

飞牛fnOS安装1Panel后Docker容器消失?三步教你恢复数据并避免踩坑

本文详细解析了飞牛fnOS安装1Panel后Docker容器消失的问题,指出这是由于daemon.json文件被覆盖导致。通过SSH连接、修复配置文件和系统重启三个步骤,用户可以轻松恢复数据。文章还提供了预防措施和最佳实践,帮助用户避免类似问题。

yellow的专栏 869

x265探索与研究(四):如何编码视频?

如何编码视频?           本文介绍x265中的两种编码视频方法,一是采用命令行的方法;二是GUI的方式。   1、命令行的方法   (1)、第一种方式生成*.265格式的视频文件           第一种方式可以生成*.265格式的视频文件,对应的命令为: x265 --input-res 352x288 --fps 30 hall_cif_352x288_300.y

成长Bar的博客专栏 3934

RMQ (Range Minimum/Maximum Query)算法

1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们暂不介绍。 2.RMQ算法 对于该问题,最容易想到的解决方案是遍历,复杂度是O(n)。但当数据量非常大

飘过的小牛 1万+

单周期CPU设计【Verilog】

第一章 单周期CPU的设计原理 为实现单周期CPU,本文首先研究了单周期CPU的相关理论和工作原理。本章首先简要介绍单周期CPU的基本概念,然后对CPU的工作原理进行简要分析,以便为单周期CPU的设计和开发提供理论基础。 1.1 单周期CPU概述 中央处理器,即CPU,作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。在CPU内部,电平从低到高变化的瞬间称为时钟上升沿,两个相邻时钟上升沿之间的时间间隔称为一个时钟周期。单周期CPU指的是一条指令的执行在一个时钟周期内完成,然后开始下一

醉酒、冰城外 2万+

RMQ标准算法

最终,当我们需要查询区间[i, j]内的最小值时,只需要从预处理好的结果中取出对应的块内最小值即可,时间复杂度为O(1)。现在我们的问题是将 LCA 问题转化为简化的 RMQ 问题。因为 LCA 是这两个节点的共同祖先,而在二叉搜索树的性质下,LCA 节点的值一定是区间 [i, j] 内的最小值。最后这一步的核心思想是利用动态规划的方法来预处理这个简化的RMQ问题,从而实现O(1)的查询时间复杂度。对于任意一个节点 u,它的左子树中所有节点的值都小于 u 的值,右子树中所有节点的值都大于 u 的值。

qq_73775097的博客 1068

FOC时序及电流采样注意事项

摘要:本文介绍了无刷电机FOC(磁场定向控制)的实现方法,重点解析了电流采样时序与PWM同步的关键技术。在S32K144平台上,需使用两个独立的ADC组件实现双路电流同步采样,采样时刻必须严格对应低边MOS管开启时间并位于PWM波形中央。文章详细说明了硬件触发时序设计、采样电阻配置原则,并通过示波器实测波形验证了电流反馈电路的正确性,指出正弦电流波形应是理想输出形态。关键点包括ADC-PWM时序同步、低边MOS采样及正确的PWM映射配置。

qq_40916548的博客 2619

戴尔G3/AWCC用户必看:揪出WMI Provider Host疯狂占用的元凶,附5.4.35旧版回退保姆级教程

本文针对戴尔G3/AWCC用户遇到的WMI Provider Host异常占用问题,提供了详细的诊断方法和解决方案。通过分析AWCC 5.5.14.0版本的资源占用问题,指导用户回退到稳定版AWCC 5.4.35,并附上保姆级教程和预防措施,帮助用户彻底解决系统卡顿问题。

weixin_30892037的博客 561

ST表算法详解(RMQ问题)

ST表就是一个用来解决rmq(区间最值)问题的算法。 ST表不支持在线修改。 预处理时间复杂度O(nlogn),查询时间O(1)。 ST表算法详解(求最大值): 或者用f[i][st] 以i开始,长度为的区间的最小值 [ i, i+-1 ] 如f[i[[0] 区间为 [i , i],长度为1 () f[i][1] 区间为[ i, i+1],长度为2...

gzcszzx 349

嵌入式软件工程师面试题目整理(一)

文章目录嵌入式软件工程师面试题目整理(一)Arm有多少32位寄存器?Arm2440和6410有什么区别CPU,MPU,MCU,SOC,SOPC联系与差别上拉&下拉&高阻态串口协议讲一讲RS232和RS485通讯接口有什么区别IIC时序图画一下,IIC有哪些状态,给一个字节,将它发送出去。IIC有什么注意事项?有没有用I/O模拟IIC,如果有需要注意什么?为什么2440的内存起始地址是3后面7个0呢?为什么6410的内存起始地址是5后面7个0呢?内存管理有什么看法?(MMU)锁有哪些?有什么注

嵌入式与Linux那些事的博客 7882

好用的RMQ与ST表详解

ST表学习  作用:ST算法是用来求解给定区间RMQ的最值,本文以最小值为例 举例: 给出一数组A[0~5] = {5,4,6,10,1,12},则区间[2,5]之间的最值为1。 方法:ST算法分成两部分:离线预处理 (nlogn)和 在线查询(O(1))。虽然还可以使用线段树、树状链表等求解区间最值,但是ST算法要比它们更快,而且适用于在线查询。 (1)离线预处理:运用DP思想,用于求解...

nka_kun的博客 1340

Python爬虫实战:利用最新技术爬取B站视频信息

本文详细介绍了如何使用Python最新技术构建一个功能完善的B站视频信息爬虫。我们从基础爬取开始,逐步深入到反反爬策略、异步处理、数据存储和分析等高级主题。更智能的反反爬策略:使用机器学习识别验证码更高效的分布式架构:结合Kubernetes实现弹性伸缩实时数据管道:将爬取的数据实时推送到数据分析平台多平台支持:扩展支持抖音、YouTube等其他视频平台。

2201_76125261的博客 1040

全面解读AI Infra:架构、生态与未来趋势

文章摘要 大模型时代下,AI基础设施(AI Infra)成为关键技术基建,涵盖从数据准备到模型服务的全栈技术体系。文章系统解构了AI Infra的四层架构(硬件资源层、资源管理调度层、开发框架层、平台工具层),并分析了全球AI Infra生态图谱,包括云计算巨头、芯片厂商等全栈服务商,以及中国特色的多元竞合格局。通过对比Data Infra与AI Infra的核心差异,指出AI Infra更关注智能应用的规模化与自动化。文章还探讨了从传统数据设施向AI基础设施的转型路径,强调自主可控、软硬协同等发展趋势,为

技术引领业务创新 609

ST表实现RMQ详解+例题(一维+二维)

目录 【ST算法】 【引入】 【实现】 【一维】 【二维】 【例题】 【一维】 【二维】 【ST算法】 【引入】 区间最值RMQ问题的两种实现方法: 1.线段树(预处理时间复杂度,查询与修改时间复杂度,适用于带修改的情况) 2.ST算法(预处理时间复杂度 ,查询时间复杂度 ,适用于无修改操作且查询较多的情况) 【实现】 【一维】 ST算...

菜鸡成长史 627

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

RMQ问题 st表详解【模板】【板题】POJ-3264 Balanced Lineup

RMQ问题 RMQ (Range Minimum/Maximum Query)问题是指: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值, 也就是说,RMQ问题是指求区间最值的问题。 来自百度百科 简单说就是给出n个数的数组,每次询问给出L和R,问在 a[L…R] 这个区间里的最值 ST表就是用来解决该问题 ST(Sparse Table)算法可以在O(nlogn)时间内进行预处理,然后在O(1)时间内查询每个问题; 但是ST只能解决

weixin_43895356的博客 247

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

HDU5726 GCD(二分 + ST表 RMQ 倍增算法 详解)

GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 5451    Accepted Submission(s): 1969   Problem Description Give you a sequence of N(N≤1...

qq_41668093的博客 241

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ST表(RMQ)算法详解

ST的定义: 就是一个用来解决rmq(区间最值)问题的算法。 相关性质: 1.缺点:不支持修改操作。 2.时间复杂度: 预处理(O( n*log(n) ) 查询:(O(1)); 具体操作: 1.首先建立f[i][j] 首先定义f[i,j]为以第i个数为起点,长度为2^j的一段区间中的最大值 2.预处理 根据状态方程预处理整个过程 3.查询。 状态表达式: 要知道, f[i][j]=max(f[i][j-1],f[i+(1<<(j-1)][j-1]); f[i][j-1]表示: 闭区间[i ,

yyj的博客之旅 752

LCA问题的高效解法:欧拉序 + RMQ 详解

最近公共祖先简称。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根最远的那个。为了方便,我们记某点集 的最近公共祖先为 或。

colP6B3Im的博客 240

洛谷P3865 【模板】ST 表 & RMQ 问题 【考点】:ST表,倍增思想

本文介绍了ST表解决RMQ(区间最大值查询)问题的模板实现。ST表通过倍增预处理构建稀疏表f[i][j],存储从i开始长度为2^j区间的最大值。预处理阶段采用动态规划递推,查询时利用两个覆盖区间块取最大值实现O(1)查询。代码实现分为三步:1)初始化读入数组;2)倍增构建ST表;3)处理查询,计算区间长度对数k后取两个覆盖区间的最大值输出。该算法通过预处理实现高效查询,是解决静态区间最值问题的经典方法。

2301_79799657的博客 317

四毛子算法精解:如何实现O(n)预处理的±1 RMQ查询

区间最值查询(RMQ)是数据结构中的基础问题,其核心目标是在静态数组上快速回答任意区间的最小值或最大值查询。通用解法如稀疏表(ST表)通过倍增和动态规划实现O(n log n)预处理和O(1)查询,但在特定场景下仍有优化空间。当数组满足相邻元素差值绝对值为1(±1)的约束时,问题的性质发生了根本变化,这为应用更高效的四毛子算法(Method of Four Russians)创造了条件。四毛子算法是一种经典的设计范式,其核心思想是分块、预处理和查表,通过将大规模问题分解为可枚举的小规模子问题,并提前计算出所

weixin_34109408的博客 491

数据结构——ST表和RMQ问题

ST表的构建,ST表的应用,ST表解决RMQ问题

m0_73693552的博客 502

【洛谷P3865】ST表【模板】【RMQ问题】

输入输出样例 输入 #1 5 5 4 3 1 2 4 5 1 1 4 2 4 3 2 3 5 1 2 4 5 输出 #1 4 4 1 4 4 分析 ST表: 我们设f[i][j]f[i][j]f[i][j]表示以i为左端点,长度为2^j的区间的最小值(最大值等)。 以最小值为例,显然可以有递推式 f[i][j]=a[i](j=0)f[i][j]=a[i] (j=0)f[i][j]=a[i](j=0) f[i][j]=m(f[i][j−1],f[i+2(j−1)][j−1])(j>0)f[i][j.

ssllyr 299
上一篇: POJ-3264 Balanced Lineup(RMQ)
下一篇: Acwing-109 天才ACM(倍增+归并)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值