RMQ算法 (区间最值问题)
来源:互联网 发布:js读取txt文件内容 编辑:程序博客网 时间:2024/05/23 19:13
首先先介绍一下RMQ算法,RMQ算法是针对区间最值的一个算法,有些问题可以用线段树实现但是你不觉得 有些问题RMQ仅仅几行的代码机上超级快的查询速度是一件很美好的事情吗?!!!!
RMQ原理:定义一个二维数组dp[i][j],表示的是从第i个元素开始,长度(1<<j)内的最值,我们用动态规划的思想来实现
dp[i][j]=max{dp[i][j-1],dp[i+(1<<(j-1))][j-1];
dp[i][j]=min{dp[i][j-1],dp[i+(1<<(j-1))][j-1];
实现代码如下
void RMQ(int num) //预处理->O(nlogn){ for(int i=1;i<=num;i++) dp[i][0]=a[i]; for(int j = 1; (1<<j) <= num; ++j) for(int i = 1; i + (1 << j) - 1 <= num; ++i) { dp[i][j] = max(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]); }}之所以j在上i在下 我们得明白我们是先给第i个位置确定了一个初值,然后我们只能
从已经有了的值去推出值 所以只能慢慢来从短到长 由已知到未知 大家好好思考一下这个问题。
接着就是查询了,查询的思路很简单就是找到一个最大的k使(1<<k)<=r-l+1;
int query(int l,int r){ int k=0; while(1<<(k+1)<=r-l+1) k++; return max(dp[l][k],dp[r-(1<<k)+1][k]);}查询的时间复杂度只有O(1) 。
最后我们来看一道例题 NYOJ119:http://acm.nyist.net/JudgeOnline/status.php?pid=119
代码如下 :
#include <iostream>#include <cstdio>using namespace std;int n,m;int maxsum[100000][20];int minsum[100000][20];void RMQ(int num) //预处理->O(nlogn){ for(int j = 1; (1<<j) <= num; ++j) for(int i = 1; i + (1 << j) - 1 <= num; ++i) { 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]); }}int query(int l,int r){ int k=0; while(1<<(k+1)<=r-l+1) k++; return max(maxsum[l][k],maxsum[r-(1<<k)+1][k])-min(minsum[l][k],minsum[r-(1<<k)+1][k]);}int main(){ while(~scanf("%d%d",&n,&m)) { int x; for(int i=1;i<=n;i++) { scanf("%d",&x); maxsum[i][0]=x; minsum[i][0]=x; } RMQ(n); int l,r; while(m--) { scanf("%d%d",&l,&r); printf("%d\n",query(l,r)); } } return 0;}
0 0
- RMQ算法 (区间最值问题)
- RMQ算法:区间最值问题
- RMQ(区间最值问题)ST算法
- RMQ之ST算法(求区间最值问题)
- rmq问题(区间最值)
- RMQ问题(区间最值查询)
- RMQ(区间最值问题)
- RMQ 区间最值问题
- RMQ区间最值问题
- RMQ-区间最值问题
- RMQ算法的学习(区间最值问题)NYOJ 119 士兵杀敌(三)
- RMQ算法详解(区间最值查询)
- RMQ 区间最值查询算法
- RMQ算法求区间最值
- RMQ算法,求区间最值
- 区间最值查询 --RMQ算法
- RMQ区间最值查询SparseTable算法
- hihoCoder 1068 : RMQ-ST算法 (区间最值查询之 rmq算法)
- pat 1079 another solution
- haudoopMR程序如何做表之间的链接
- 什么是渡假式交换酒店,先记一下
- 浅谈编译器编译地址 ,cpu统一编址的物理地址,程序载入内存的地址。
- android xml 无法自动提示
- RMQ算法 (区间最值问题)
- poj 1122
- 英语六级听力应试技巧:“五边处理法”
- UItableviewCell重用注意事项
- linux命令大全
- 【cocos2d-x】3.0 C++11 特性
- python 开一个简单的服务器
- Android 自动编译、打包生成apk文件 1 - 命令行方式
- 从B树、B+树、B*树谈到R 树