算法之QMR--ST算法
来源:互联网 发布:mymusic软件 编辑:程序博客网 时间:2024/06/06 08:36
RMQ (RangeMinimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。
解决的方法有:
1、朴素(即搜索),O(n)-O(qn) online。
2、线段树,O(n)-O(qlogn)online。
3、ST(实质是动态规划),O(nlogn)-O(q) online。
ST算法(Sparse Table),以求最大值为例,设d[i,j]表示[i,i+2^j-1]这个区间内的最大值,那么在询问到[a,b]区间的最大值时答案就是max(d[a,k],d[b-2^k+1,k]),其中k是满足2^k<=b-a+1(即长度)的最大的k,即k=[ln(b-a+1)/ln(2)]。
d的求法可以用动态规划,d[i,j]=max(d[i, j-1],d[i+2^(j-1), j])。
4、RMQ标准算法:先规约成LCA(LowestCommon Ancestor),再规约成约束RMQ,O(n)-O(q)online。
这里学的是ST 算法
ST 算法 是一个动态规划的问题;
作用: ST算法是用来求解给定区间RMQ的最值,
原理: F[ I, J ] 代表从I 开始长度为 2^J 的区间内 的最值;
ST 动态规划:
动态规划方程为: d[i, j]=max(d[i, j-1],d[i+2^(j-1), j])。
用法:
查询:区间[l,r]分成两个长度为2^n的区间 查询[a,b] 区间 分成 [a,c] 与[c,b] 两个区间 内的最值问题;
预处理操作: DP 解决
首先是预处理,用一个DP解决。设a是要求区间最值的数列,f[i,j]表示从第i个数起连续2^j个数中的最大值。例如数列3 2 4 5 6 8 1 2 9 7 ,f[1,0]表示第1个数起,长度为2^0=1的最大值,其实就是3这个数。f[1,2]=5,f[1,3]=8,f[2,0]=2,f[2,1]=4……从这里可以看出f[i,0]其实就等于a[i]。这样,DP的状态、初值都已经有了,剩下的就是状态转移方程。我们把f[i,j](j≥1)平均分成两段(因为j≥1时,f[i,j]一定是偶数个数字),从i到i+2^(j-1)-1为一段,i+2^(j-1)到i+2^j-1为一段(长度都为2^(j-1))。用上例说明,当i=1,j=3时就是3,2,4,5 和6,8,1,2这两段。f就是这两段的最大值中的最大值。于是我们得到了动规方程F[i,j]=max(F[i,j-1],F[i+2^(j-1),j-1])。
void st(){for(int j=1;1<<j<=n;j++)for(int i=1;i+(1<<j)-1<=n;i++)maps[i][j]=max(maps[i][j-1],maps[i+(1<<j-1)][j-1]);}
查询操作:
int query(int l,int r){int x= int (log(r-l+1)/log(2));return max(maps[l][x],maps[r-(1<<x)+1][x]);}
main 函数内 输入操作:
for(int i=1;i<=n;i++)S1(maps[i][0]);
- 算法之QMR--ST算法
- RMQ之ST算法
- RMQ问题之ST算法
- RMQ问题之ST算法
- RMQ问题之ST算法
- RMQ问题之ST算法
- LCA之ST算法模板
- ST算法
- ST算法
- ST算法
- st算法
- ST算法
- ST算法
- ST算法
- ST算法
- ST算法
- ST算法
- Node:RMQ问题之ST算法
- C# combox下拉模糊查询
- Servlet(8)—GenericServlet和改进Servlet实例
- 反转链表
- Unity3d中的Awake()、OnEnable()、Start()等默认函数的执行顺序和生命周期
- 神经网络分类
- 算法之QMR--ST算法
- SpringMVC的上传图片
- (精简)进程间和线程间的通信方式
- Discuz使用UCenter实现同步登录、注册、退出
- 5G结构模型和概念(未完待续...)
- 【学习摘记】马士兵bbs改良版_课时22-24_FCKEditor
- Spring 实现数据库读写分离
- 如何配置web项目值用localhost:8080就访问到项目action
- Android CountDownTimer 实现倒计时功能