RMQ((Range Minimum/Maximum Query))ST算法】的更多相关文章

给定一个数组,求出给定区间[l,r]中元素的最大值或最小值或者最值的索引. 一看到这个题目,简单,看我暴力出奇迹.暴力当然是可行的.但是时间复杂度很高(O(n^2)).线段树,树状数组也可以解决这个问题,复杂度(O(nlogn))的预处理,最终查询为O(次数*logn). 而今天用ST(Sparse_Table)算法,也是O(nlogn)的预处理,但是是单次查询为O(1),挺高效的. 我们现在给定一组数据 n==9,元素为2,4,6,8,9,1,2,3,4.一个二维数组f[MAX][MAX];假…
ST算法------是用来求解给定区间RMQ的最值,本文以最小值为例 ST算法分为两部分 离线预处理(nlogn):运用DP思想,用于求解区间最值,并保存到一个二维数组中. 在线查询 (O(1)):对给定区间进行分割,借助该二维数组求最值 离线预处理 该二维数组是什么? 设该二维数组为dp[n][n], 则dp[i][j]表示以i为起点,以2^j为区间长度的区间最值即表示数组[i, i+2^j-1]区间的最值. 给出一数组A[0~5] = {5,4,6,10,1,12},则区间[2,5]之间的最…
转载自:http://kmplayer.iteye.com/blog/575725 RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在[i,j]里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题 主要方法及复杂度(处理复杂度和查询复杂度)如下: 1.朴素(即搜索) O(n)-O(n) 2.线段树(segment tree) O(n)-O(qlogn) 3.ST(实质是动态规…
参考: 1. 郭华阳 - 算法合集之<RMQ与LCA问题>. 讲得很清楚! 2. http://www.cnblogs.com/lazycal/archive/2012/08/11/2633486.html 3. 代码来源yejinru 题意: 有一棵树, 按照顺序给出每条边, 再给出若干对点, 这两点之间的唯一的路( Simple path )上边权加1. 当所有对点处理完后, 按照边的输入顺序输出每条边的权. 思路: LCA问题. 最近公共祖先(Least Common Ancestors…
RMQ (Range Minimum/Maximum Query)问题是指: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在[i,j]里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题 主要方法及复杂度(处理复杂度和查询复杂度)如下: 1.朴素(即搜索) O(n)-O(n) 2.线段树(segment tree) O(n)-O(qlogn) 3.ST(实质是动态规划) O(nlogn)-O(1) 线段树方法: 线段树能在对数时间内在数组区间上进…
RMQ是一类询问区间最小/最大值的问题. 这类问题一般分成两类:静态区间(无修改),动态区间(带修改). 对于动态区间查询最大/最小,我们显然可以用线段树来解决…… 那么对于静态区间查询最大/最小的问题,我们一般用ST算法解决.(显然这个我们也可以用线段树) 这个算法相比于线段树来说有以下优点: ·程序实现比较简单. ·运行速度快,常数小. 接下来为了解释方便,我们假设我们要查询区间的最大值. 一.ST算法的实质 ST算法的实质是动态规划. 现在我们有一组数a[1…n]; 我们定义f(i,j)表…
RMQ问题之ST算法 RMQ(Range Minimum/Maximum Query)问题,即区间最值问题.给你n个数,a1 , a2 , a3 , ... ,an,求出区间 [ l , r ]的最大值. 举例:a={ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 },求出区间[4 ,8]中的最值.(答案:8 ) 这个问题最朴素的想法是用一个循环每次比较大小,但是,当数据范围较大时,这个算法十分低效.这时我们往往使用 ST 算法解决这个问题.虽然线段树和树状数组都能解决,但…
/* RMQ(Range Minimum/Maximum Query)问题: RMQ问题是求给定区间中的最值问题.当然,最简单的算法是O(n)的,但是对于查询次数很多(设置多大100万次),O(n)的算法效率不够.可以用线段树将算法优化到O(logn)(在线段树中保存线段的最值).不过,Sparse_Table算法才是最好的:它可以在O(nlogn)的预处理以后实现O(1)的查询效率.下面把Sparse Table算法分成预处理和查询两部分来说明(以求最小值为例). 预处理: 预处理使用DP的思…
RMQ(Range Minimum/Maximum Query)问题是求区间最值问题. 对于长度为 n 的数组 A,进行若干次查询,对于区间 [L,R] 返回数组A中下标在 [L,R] 中的最小(大)值. 可以用线段树来解决这个问题,预处理的复杂度是 O(nlogn),查询的复杂度是 O(logn). 更好的解法是ST算法.Sparse_Table算法,即稀疏表算法,这个方法可以在 O(nlogn) 的预处理后达到 O(1) 的查询代价. 这个算法非常容易实现. 定义 F[ i, k ] 表示从…
[引子]RMQ (Range Minimum/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算法(Spars…