求RMQ O(n)-O(1)超详细讲解!

一定要是超详细,贴代码就算了。
说废话有意思么?

说白了是一种动态规划。
我们用f[i][j]来表示区间[i,i+2^j-1]的最值,采用分块思想,我们可以把区间[i,i+2^j-1]平均分为两个区间,因为j>=1的时候该区间的长度始终为偶数,可以分为区间[i,i+2^(j-1)-1]和区间[i+2^(j-1)-1,i+2^j-1],即取两个长度为2^(j-1)的块取代和更新长度为2^j的块,那么最小值就是这两个区间的最小值的最小值,转移方程为F[i,j]=min(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]).
这样我们就有了一个储存最值的数组,那么如何将它优化为O(1)呢?
这里就说得到ST算法:询问时取k=ln(j-i+1)/ln2即可,那么可以令A为i到2^k的块,和B为到2^k结束的长度为2^k的块;那么A,B都是区间[i,j]的子区间,所以即求A区间的最小值和B区间的最小值的最小值。这个时候动态规划为:RMQ(i,j)=min(F[i,k],F[j-2^k+1,k])。
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-03-16
emm虽然时间有点长但还是回答一下吧qaqaq
这个问题可以通过分块 + st表解决
我们可以将序列分成 log 块, 然后处理一下每个块的前缀和后缀最值, 然后我们预处理的时候就可以吧每一个块当成一个数来处理, 显然一共有(n/log(n))个数, 预处理的复杂度就是On的qwq 。
然后对于查询区间[l, r] 我们可以通过l所在块的后缀最值, r所在块的前缀最值, 和中间块的最值来得到我们最终的答案, 复杂度为O1.
当然当l r 在同一个块里的时候我们无法处理, 这时候只要暴力就好了吧qwqwq 虽然复杂度为log n 但是完全可以调参, 基本上是不可能被卡掉的, 而且可以算一下l, r 在同一块里的概率是非常小的对吧qwq 要卡的话估计就会被暴力跑过去了。
第2个回答  2021-06-03

既然都来问 O(n)-O(1) 的 RMQ 了,那么 ST 表应当是已经知道了的。

众所周知,ST 表是 O(nlog n) 预处理 O(1) 查询的数据结构,那么如果我们将整个序列分成 O(n/log n) 个块,每一个块大小是 (log n)/2,那么我们就可以在 O(n) 的时间内预处理,并且通过预处理块内的前缀最值和后缀最值来做到 O(1) 查询跨块的询问。

接下来考虑块内的询问,我们考虑将序列建笛卡尔树,然后以深度为权值求最值,容易发现与原问题等价。

所以我们可以预处理所有的 2^((log n)/2)=\sqrt{n} 种 ±1 的状态中最小值所在位置,然后就可以 O(1) 查询块内的最值了。

顺带推销自己的博客

第3个回答  2010-04-24
这个方法巨复杂……貌似是先把RMQ通过笛卡尔树变成LCA,然后通过欧拉序列把LCA变成±RMQ,然后再通过一个什么分块的table在O(n)-O(1)时间内解决。
第4个回答  2020-03-09
首先,你这问题问得不够专业。
其次,叙述得不够详细……
所以,答案需要你进一步解释后才能给出。。。

求RMQ O(n)-O(1)超详细讲解!
这里就说得到ST算法:询问时取k=ln(j-i+1)\/ln2即可,那么可以令A为i到2^k的块,和B为到2^k结束的长度为2^k的块;那么A,B都是区间[i,j]的子区间,所以即求A区间的最小值和B区间的最小值的最小值。这个时候动态规划为:RMQ(i,j)=min(F[i,k],F[j-2^k+1,k])。

算法总结--ST表
在计算机科学领域,RMQ(Range Minimum\/Maximum Query)问题是一个常见的查询任务。它的基本要求是在给定的数列中,找出某个范围内的最小或最大值。在动态场景中,如线段树可以有效解决RMQ问题,提供O(log(n))的时间复杂度。然而,对于静态场景,ST表(Segment Table)提供了更快的O(1)查询速度。ST表...

rmq标准算法
对于A数组,由于相邻元素差的绝对值为1,我们可以将其分解为长度为l=[(log N)\/2]的块。处理块内查询时,A'数组和B数组的处理时间复杂度为O(N)。预处理后,块内查询可在O(1)时间内完成,块间查询则分解为块内查询和RMQ,总复杂度也是O(1)。总结,我们设计了一个预处理时间O(n)、查询时间O...

pascal的快速幂的矩阵乘法,求详解和具体实现。
我们可以用上面的方法二分求出任何一个线性递推式的第n项,其对应矩阵的构造方法为:在右上角的(n-1)*(n-1)的小矩阵中的主对角线上填1,矩阵第n行填对应的系数,其它地方都填0。例如,我们可以用下面的矩阵乘法来二分计算f(n) = 4f(n-1) - 3f(n-2) + 2f(n-4)的第k项: 利用矩阵乘法求解线性递...

rmqST算法
通常,计算最大值需要O(logn)或O(n)的时间复杂度。然而,通过ST算法,我们可以做到O(1)的复杂度。以计算区间[2,8]的最大值为例,将其分为[2,5]和[5,8],直接利用f[2,2]和f[5,2]得到。这种方法可以推广到一般情况,将区间[l,r]划分成长度为2^n的两个子区间,确保每个子区间有对应f...

后缀数组最长公共前缀
RMQ可以通过预处理线段树或静态排序树在O(nlogn)时间内完成,或者使用RMQ标准算法在O(n)时间内预处理,查询时间常数级。通过计算后缀数组的经验,我们可以利用后缀之间的关联,发现height数组的一个性质:对于i>1且Rank[i]>1,height[i]大于等于height[i-1]-1。根据这个性质,我们可以设计一个O(n)...

interview-o 代码用法
interview-o代码的用法:interview-o给定链表的头指针和一个结点指针,在O(1)时间内删除该结点。需要注意的是,这里只是删除该结点的步骤为O(1),而不是查找到该结点的时间复杂度。求解思想:一般来说,我们删除链表中的一个结点是将在它前驱结点上进行操作,将它前驱结点的next指针指向K的后继节点,K...

求大神给一个windows8.1企业版安装密匙
Windows 8.1 & Windows 8 Pro \/ Pro WMC 离线激活零售版密钥:slmgr.vbs -ipk CGWVF-N3VMK-CVG7W-MBB9Y-MY2KV slmgr.vbs -ipk D46QW-N3M4H-RY93J-DPMPY-43G67 slmgr.vbs -ipk D66NY-H99YQ-9MPFY-G2YF3-973G7 slmgr.vbs -ipk DBTMW-N29V3-V6XJ7-4RQXD-4F9T7 slmgr.vbs...

请教做ACM的常用算法..还是菜鸟
(RMQ+dfs)).(poj1330) (3)双端队列和它的应用(维护一个单调的队列,常常在动态规划中起到优化状态转移的 目的). (poj2823) (4)左偏树(可合并堆). (5)后缀树(非常有用的数据结构,也是赛区考题的热点). (poj3415,poj3294) 四.搜索 (1)较麻烦的搜索题目训练(poj1069,poj3322,poj1475,poj1924...

我是个ACM菜鸟,希望学到东西,为了下一代,把你的功力传给我吧,如果我...
因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打 出来。1.最短路(Floyd、Dijstra,BellmanFord)2.最小生成树(先写个prim,kruscal要用并查集,不好写)3.大数(高精度)加减乘除 4.二分查找. (代码可在五行以内)5.叉乘、判线段相交、然后写个凸包.6.BFS、DFS,...

相似回答