Range Minimum Query (RMQ)
来源:互联网 发布:mac shell alias 编辑:程序博客网 时间:2024/05/07 15:43
RMQ(Range Minimum Query) : 给定一个数组,求给定的两个索引(下标)间最小值元素的索引.
符号意义:
假设一个算法有 f(n)的预处理时间和g(n)的查询时间.则这个算法的总的时间复杂度记为<f(n), g(n)>
记数组A在索引i和j之间的最小值元素的索引为RMQA(i, j).
例子:A[0,9]
对于给定的数组A[0,N-1],N为元素个数
解法一:动态规划
对于每对索引(i , j)存储值RMQA(i, j) 在数组M[0, N-1][0, N-1]中
预处理函数如下:
算法时间复杂度为<O(N2) , O(1)>,空间复杂度为O(N2),对于N比较大时,很耗内存
解法二:Sparse Table ( 稀疏表 )
一个好的方法是对长度为2k 的子数组进行预处理。保存一个数组M[0, N-1][0, logN],M[i][j]表示从一个下标从i开始,长度为2j的子数组中最小元素的下标
例子如下:
为了计算M[i][j],我们必须搜索这个区间的前半部分和后半部分.很明显,每一部分的长度为 2j - 1。递推式如下:
预处理函数如下所示:
预处理后,让我们看看怎么计算RMQA(i, j). 思想就是选择出两个将区间[i..j]完全覆盖的小区间(预处理的M),然后取其较小值. 取k = [log(j - i + 1)]. 为了计算RMQA(i, j) 使用如下公式:
此算法总的时间复杂度为<O(N logN), O(1)>.
解法三:Segment Tree(线段树)
为了解决RMQ,还可以使用线段树.线段树能在对数时间内在数组区间上进行更新与查询。我们定义线段树在区间[i, j]上如下:
- 第一个节点维护着区间 [i, j]的信息。
- if i<j , 那么左孩子维护着区间[i, (i+j)/2]的信息,右孩子维护着区间[(i+j)/2+1, j]的信息。
线段树和堆有一样的结构, 因此如果一个节点编号为 x ,那么左孩子编号为2*x 右孩子编号为2*x+1(在这里下标从1开始).
使用线段树解决RMQ问题,我们要维护一个数组M[1, 2 * 2[logN] + 1] ,M[i] 维护着被分配给该节点的区间的最小值元素的下标。 该数组初始状态为-1 . 树应该被以下函数初始化 (b 和 e 是当前区间的左右边界):
使用线段树解决RMQ问题,我们要维护一个数组M[1, 2 * 2[logN] + 1] ,M[i] 维护着被分配给该节点的区间的最小值元素的下标。 该数组初始状态为-1 . 树应该被以下函数初始化 (b 和 e 是当前区间的左右边界):
该函数反映的是树被构建的方法。 我们应该用 node = 1, b = 0 和 e = N-1 来调用这个函数
现在开始查询. 如果我们想要找出区间 [i, j] 上的最小值的索引,我们应该使用下面这个简单的函数:
现在开始查询. 如果我们想要找出区间 [i, j] 上的最小值的索引,我们应该使用下面这个简单的函数:
我们可以用 node = 1, b = 0 和 e = N - 1来调用这个函数。 因为第一个节点的区间是 [0, N-1].
很容易看出任何查询都能在时间 O(log N)内完成。
使用线段树得到了一个 <O(N), O(logN)> 的算法.
很容易看出任何查询都能在时间 O(log N)内完成。
使用线段树得到了一个 <O(N), O(logN)> 的算法.
线段树非常有用,不仅仅因为它可以用在解决RMQ问题上。它是一个非常灵活的数据结构,在范围搜索问题上有很多应用.
- Range Minimum Query (RMQ)
- Range Minimum Query (RMQ)
- Range Minimum Query( RMQ )
- Range Minimum Query(RMQ)
- RMQ(Range Minimum Query)
- Range Minimum Query (RMQ)
- 二维RMQ(Range Minimum Query)
- RMQ(Range Minimum Query)
- RMQ (Range Minimum/Maximum Query)问题
- RMQ (Range Minimum/Maximum Query)算法
- RMQ (Range Minimum/Maximum Query)算法
- RMQ ( Range Maximum/Minimum Query ) 详解
- RMQ(Range Minimum Query)问题
- RMQ(Range Minimum/Maximum Query)算法(nyist119)
- RMQ(range maximum/minimum query)算法
- RMQ (Range Minimum/Maximum Query)问题
- RMQ (Range Minimum/Maximum Query)算法
- RMQ (Range Minimum/Maximum Query)算法
- Eclipse 入门及其基本的使用介绍
- 谈谈父窗口和所有者窗口
- HTML DOM Style 对象
- 黑麋峰之行----长沙森林公园
- 使用ADO.NET的最佳实践zz
- Range Minimum Query (RMQ)
- RUBY EXCEL操作
- 大型Web2.0站点构建技术初探一
- 如何进行文献检索
- http://fanli.qq.com
- flex如何减少代码量减少内存消耗
- container_of宏 相关
- MySQL 的外键与参照完整性
- 未来属于动态语言