博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RMQ ST算法简介
阅读量:6305 次
发布时间:2019-06-22

本文共 1285 字,大约阅读时间需要 4 分钟。

   RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。

 ST算法:先是预处理部分(构造RMQ数组),DP处理。假设b是所求区间最值的数列,dp[i][j] 表示从ii+2^j -1中最值(i开始持续2^j个数)。即dp[i][j]=min{dp[i][j-1],dp[i+2^(j-1)][j-1]},或者dp[i][j]=max{dp[i][j-1],dp[i+2^(j-1)][j-1]},这个过程的复杂度为:O(n(longn))

接着就是查询最值了,可以通过在O(1)完成查询。就是将查询区间[s,v],分成两个2^k的区间。

以求最小值为例

#include
#include
#include
using namespace std;#define M 100000#define MAXN 1000#define MAXM 1000int dp[M][20];void makermq(int n,int b[])//构造最值RMQ数组{ int i,j; for(i=0;i
=b[dp[i+(1<<(j-1))][j-1]]? dp[i][j-1]:dp[i+(1<<(j-1))][j-1]; //求最小值 dp[i][j]=b[dp[i][j-1]]
<<(j-1))][j-1]]? dp[i][j-1]:dp[i+(1<<(j-1))][j-1]; }int rmqIndex(int s,int v,int b[])//返回最值对应的下标{ int k=(int)(log((v-s+1)*1.0)/log(2.0));//求最大值 // return b[dp[s][k]]>=b[dp[v-(1<

代码没有给出主函数,主函数应根据具体题目要求来写。

以下是 poj3264:代码:

#include
#include
#include
using namespace std;#define M 50001int h[M];int dpmax[M][20],dpmin[M][20];void makermqmax(int n,int b[])//构造最值RMQ数组{ int i,j; for(i=0;i

转载于:https://www.cnblogs.com/xiuyangleiasp/archive/2012/10/03/2711080.html

你可能感兴趣的文章
Flink入坑指南第五章 - 语法糖 view
查看>>
centos 7.4 使用 pgxc_ctl 安装与使用
查看>>
Redis 单key值过大 优化方式
查看>>
【数据库】表分区
查看>>
nutz-sqltpl 1.3.4.RELEASE 发布,在 Nutz 项目中“解决 Java 拼接 SQL”问题
查看>>
城市 | 800个地铁站数据透析的京沪白领图鉴:隐形土豪、无产中产阶级和猪猪女孩...
查看>>
前端脚本!网站图片素材中文转英文
查看>>
linux的常用易忘命令
查看>>
PHP 分割字符串
查看>>
java 基于QRCode、zxing 的二维码生成与解析
查看>>
关于职业规划的一些思考
查看>>
img垂直水平居中与div
查看>>
Fabrik – 在浏览器中协作构建,可视化,设计神经网络
查看>>
防恶意注册的思考
查看>>
http2-head compression
查看>>
C# 命名空间
查看>>
订餐系统之同步美团商家订单
查看>>
使用ArrayList时设置初始容量的重要性
查看>>
Java Web-----JSP与Servlet(一)
查看>>
Maven搭建SpringMVC+Mybatis项目详解
查看>>