ST算法
2015-07-27 15:31
260 查看
概论
ST(sparse table)算法用于快速求取区间最值。这是我们做题中经常遇到的问题,当求区间(l,r)之间的最值时,最简单的方法方法是从头到尾扫描一遍,复杂度log(n),显然在n较大,查询较为频繁时,时间过长。于是,对于这种区间求最值,我们需要另外考虑高效算法。ST算法正是这样一个算法,当然线段树也可以实现O(log(n))的复杂度。
ST算法用O(log(n))的复杂度dp预处理数组,查询复杂度O(log(1))
3、预处理:f[i][j]表示从第i个数开始的2^j个数的最值。
f[i][0]=a[i](初值)
f[i][2]=max(a[i],a[i+1],a[i+2],a[i+3])。
动态转移方程:f[i][j]=f[i][j-1]+f[i+2^(j-1)][j-1]
将区间(i,i+2^j-1)
分解成(I,i+2^(j-1)-1)和(
i+2^(j-1), i+2^j ),注意这个动态转移方程是由j-1的状态转移到j转态
代码:
void RMQ(){
inti,j;
for(i=1;i<=n;i++)
f[i][0]=a[i];
for(j=1;j<=20;j++)
for (i=1;i<=n;i++)
if (i+(1<<j)-1<=n)
f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1];
}
4、查询
查询区间(l,r)之间最值,区间可重叠,故可以分解成(l,l+2^k-1)和(r-2^k+1,r),其中k=int
(log2(r-l+1)),ans=max(f[l][k],f[r-(1<<k)+1][r]);
概论
ST(sparse table)算法用于快速求取区间最值。这是我们做题中经常遇到的问题,当求区间(l,r)之间的最值时,最简单的方法方法是从头到尾扫描一遍,复杂度log(n),显然在n较大,查询较为频繁时,时间过长。于是,对于这种区间求最值,我们需要另外考虑高效算法。ST算法正是这样一个算法,当然线段树也可以实现O(log(n))的复杂度。
ST算法用O(log(n))的复杂度dp预处理数组,查询复杂度O(log(1))
3、预处理:f[i][j]表示从第i个数开始的2^j个数的最值。
f[i][0]=a[i](初值)
f[i][2]=max(a[i],a[i+1],a[i+2],a[i+3])。
动态转移方程:f[i][j]=f[i][j-1]+f[i+2^(j-1)][j-1]
将区间(i,i+2^j-1)
分解成(I,i+2^(j-1)-1)和(
i+2^(j-1), i+2^j ),注意这个动态转移方程是由j-1的状态转移到j转态
代码:
void RMQ(){
inti,j;
for(i=1;i<=n;i++)
f[i][0]=a[i];
for(j=1;j<=20;j++)
for (i=1;i<=n;i++)
if (i+(1<<j)-1<=n)
f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1];
}
4、查询
查询区间(l,r)之间最值,区间可重叠,故可以分解成(l,l+2^k-1)和(r-2^k+1,r),其中k=int
(log2(r-l+1)),ans=max(f[l][k],f[r-(1<<k)+1][r]);
相关文章推荐
- 【DATAGUARD】物理dg的failover切换(六)
- sketchup技巧分享-如何利用组件创建无缝图案峥
- hdu 1022Tran Problem
- hdu 5312 Sequence(三角形数的利用)
- set env和export这三个命令的区别
- java IO流解析(三)
- 高德地图API使用效果图
- Ajax实现页面自动刷新与进度条制作
- 从文件结构认识HLS
- 关于tomcat端口的修改,以及同时部署多个应用,自己遇到的问题以及解决办法
- LVS Nginx HAProxy 优缺点
- poj 3734 矩阵快速幂模板清晰版
- Partition List
- 表单标签form的简单使用
- Oracle SqlPlus 方向键的方法和解决的退格键失效
- uva 10726 Coco Monkey(数论)
- 【DATAGUARD】物理dg的switchover切换(五)
- sketchup技巧分享-如何利用组件创建无缝图案艺
- 三个引号的区别和用法
- If We Were a Child Again