算法学习 - ST表 - 稀疏表 - 解决RMQ问题
2017-08-26 21:44:45
writer:pprp
RMQ问题就是区间最大最小值查询问题;
这个SparseTable算法构造一个表,F[i][j] 表示 区间[i, i + 2 ^ j -1]的最大或者最小值
ST分为两个部分
1、nlogn的预处理
预处理主要用到了动态规划,二分区间每个区间长度为 2 ^ (j -1)找到一个递推关系;
F[i][j] = min(F[i][j - 1],F[i + (1 << (j - 1))][j - 1]);
2、查询部分更为巧O(1)得到询问结果
对于任意一个区间【n,m】来说,可以将其划分为两个以上区间的和
【m,n】 = 【m, m+2^k-1】 + 【n-2^k-1,n】
其中k = log2(n-m+1)
实现的代码如下:
/*
@theme:ST表(sparse table)稀疏表
@writer:pprp
@declare:用动态规划的思想来解决RMQ问题;
@date:2017/8/26
*/ /*方程
F[i,j]:区间[i,i + 2^j - 1]的最小值,此时区间长度为2^j
转移方程:F[i,j] = min(F[i,j - 1],F[i + 2^(j - 1),j - 1])
初始化:F[i,0] = nArr[i];
*/ #include <bits/stdc++.h> using namespace std; int F[][];//待比较元素的个数最大为1百万 void SparseTable(int a[], int len)
{
//初始化
for(int i = ; i < len ; i++)
F[i][] = a[i];
//递推
//找到j的范围log2(n)
int nlog = int(log(double(len))/log(2.0));
for(int j = ; j <= nlog; j++)
{
for(int i = ; i < len ; i++)
{
//区间右端点不能超过数组最后一位下标
if((i + ( << j) -) < len )
{
F[i][j] = min(F[i][j - ],F[i + ( << (j - ))][j - ]);
}
}
}
} int RMQ(int a[], int len, int Start, int End)
{
//中间变量的选取log2(len)
int nlog = (int)(log(double(End-Start+))/log(2.0)); return min(F[Start][nlog], F[End - ( << nlog) + ][nlog]);
} int main()
{
int a[] = {,,,,,,,,,,,,,,,}; for(int i = ; i < ; i++)
{
cout << a[i] <<" ";
}
cout << endl; SparseTable(a,);
int l, r;
while(cin >> l >> r)
{
cout << RMQ(a,,l,r) << endl;
}
return ;
}
ST模板
#include <bits/stdc++.h> using namespace std; int F[][];
void ST(int a[],int len)
{
for(int i = ; i < len ; i++)
F[i][] = a[i];
int nlog = int(log(double(len))/log(2.0));
for(int j = ; j <= nlog; j++)
{
for(int i = ; i < len ; i++)
{
if(i+(<<j)- < len)
F[i][j] = max(F[i][j-],F[i+(<<(j-))][j-]);
}
}
} int RMQ(int a[],int len, int l, int r)
{
int nlog = floor(log(double(r-l+))/log(2.0));
return max((F[l][nlog]),F[r-(<<nlog)+][nlog]);
} int main()
{
int a[];
int n;
cin >> n;
for(int i = ; i < n ; i++)
cin >> a[i];
ST(a,n);
int l,r;
int cas;
cin >> cas;
while(cas--)
{
cin >> l >> r;
cout << RMQ(a,n,l,r) << endl;
} return ;
}
算法学习 - ST表 - 稀疏表 - 解决RMQ问题的更多相关文章
- [poj3264]rmq算法学习(ST表)
解题关键:rmq模板题,可以用st表,亦可用线段树等数据结构 log10和log2都可,这里用到了对数的换底公式 类似于区间dp,用到了倍增的思想 $F[i][j] = \min (F[i][j - ...
- 算法学习——st表
st表是一种基于倍增思想的DP. 用于求一个数列中的某个区间的最大/最小值. 用st[i][j]表示从第i个开始往后2^j个点,最大的是多少. 我们令k[i]表示2^i等于多少 那么有转移方程 st[ ...
- RMQ (Range Minimal Query) 问题 ,稀疏表 ST
RMQ ( 范围最小值查询 ) 问题是一种动态查询问题,它不需要修改元素,但要及时回答出数组 A 在区间 [l, r] 中最小的元素值. RMQ(Range Minimum/Maximum Query ...
- ST表解决RMQ问题
RMQ问题: RMQ(Range Minimum/Maximum Query),区间最值查询.对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间 ...
- 基于稀疏表(Sparse Table)的RMQ(区间最值问题)
在RMQ的其他实现方法中,有一种叫做ST的算法比较常见. [构建] dp[i][j]表示的是从i起连续的2j个数xi,xi+1,xi+2,...xi+2j-1( 区间为[i,i+2j-1] )的最值. ...
- [算法模板]ST表
[算法模板]ST表 ST表和线段树一样,都能解决RMQ问题(范围最值查询-Range Minimum Query). 我们开一个数组数组\(f[maxn][maxn\log_2]\)来储存数据. 定义 ...
- 动态规划——稀疏表求解RMQ问题
RMQ (Range Minimum/Maximum Query)问题,即区间最值查询问题,是求解序列中的某一段的最值的问题.如果只需要询问一次,那遍历枚举(复杂度O(n))就是最方便且高效的方法,但 ...
- 用ST解决RMQ问题
用ST算法解决RMQ(区间最值问题) 在解决CF上的6E Exposition时,用到了RMQ+二分的方法.学习了用ST来快速解决RMQ问题,因此做一个小记 建表 用DP的方式来建ST. dp[i][ ...
- mysql中相关,无关子查询,表与表之间的关系以及编码和乱码的解决
※MySQL中的字符编码(注意,utf8中没有'-',跟Java中不一样)SHOW VARIABLES; //查看系统变量//查询字符编码相关的系统变量SHOW VARIABLES WHERE var ...
随机推荐
- Linux yum 安装 Nginx
搭建 Nginx 静态服务器 安装 Nginx 使用 yum 安装 Nginx: yum install nginx -y 修改 /etc/nginx/conf.d/default.conf,去除对 ...
- JUnit4 测试示例
1. JUnit4 测试示例 // Calculator.java public class Calculator{ public int add(int a, int b){ return a + ...
- 剑指Offer——左旋转字符串
题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”ab ...
- 【react npm】解决用npmstart启动别人的react项目的问题1:sha1-xxx checksum failed wanted sha1-xxx but got sha512-xxx. (10700 bytes)
1.npm是nodejs的包管理器,相当于php的composer,python的pip,用于安装各种包. 2.一般来说,别人拷给你的react项目不会带依赖包的,因为太大了,需要用npm命令自己安装 ...
- shell 从文件中读取批量文件名并做命令行操作
222文件内容: /home/zhangsuosheng/Desktop/9-30/9_30/1bak/1538291162.png /home/zhangsuosheng/Desktop/9-30/ ...
- Linux(5)- MariaDB、mysql主从复制、初识redis
一.MYSQL(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可. 开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL ...
- shell_03
函数: fanction print_welcome(){ echo welcome now time is `date` } print_welcome 函数调用 print _welcome 00 ...
- python web框架 django 工程 创建 目录介绍
# 创建Django工程django-admin startproject [工程名称] 默认创建django 项目都会自带这些东西 django setting 配置文件 django可以配置缓存 ...
- Web爬虫的C#请求发送
public class HttpControler { //post请求发送 private Encoding m_Encoding = Encoding.GetEncoding("gb2 ...
- how to use greendao in android studio
http://www.arjunsk.com/android/use-greendao-android-studio/ 1.新建一个java文件MainGenerator.java: import d ...