1.定义 RMQ,Range Min/Max Query,区间最小/大值查询。 对于数组A, 定义Query(i,j)= min {Ai,Ai+1,…Aj},即为RMQ问题。 算法思想: 使用Tarjan的Sparse-Table算法,简称ST算法。 令d(i,j)表示从i开始的,长度为2^j的区间...
分类:
其他好文 时间:
2015-03-28 01:02:27
阅读次数:
294
RMQ问题
范围最小值问题(Range Minimum Query)是指:给定一个n个元素的数组A[1],A[2]...A[n]。设计一个数据结构,支持查询操作Query(L,R):计算min{A[L],A[L+1]...A[R]}。
该问题在实践中常用Tarjan的Sparse-Table算法。它的预处理时间是O(N*logN),但查询只需要O(1),而且常数非常小。最重要的是,这个算法非常...
分类:
其他好文 时间:
2015-03-19 22:14:17
阅读次数:
140
RMQ问题就是区间最小值问题,这是一个非常经典的题,
由他引申出来的也是不计其数最多的是给出一个区间,然后输入多组区间端点,求输入区间的最小值。
每次用循环来计算一个最小值显然不够快,怎么办呢?
实践中最常用的是Tarjan的 Sparse-Table算法,它的预处理时间是O(nlogn),但是查询只需要O(1),而且常数很小。
它的思想很简单,就是递推+二分的思想。我们先定义一个二维数组...
分类:
其他好文 时间:
2015-03-01 18:35:50
阅读次数:
139
范围最小值问题(Range Minimum Query)
给出一个n个元素的数组,设计数据结构使得支持查询操作Query(L,R) 计算[L,R]中最小值
Tarjan的Sparse-Table算法预处理时间为O(nlogn) 查询只需要O(1)而且常数很小。假设dp[i][j]表示从第i个数开始的2^j个数的最小值。
有下列公式:dp[i][j] = min(dp[i,j-1],dp[i+2...
分类:
编程语言 时间:
2015-02-22 21:57:56
阅读次数:
200
http://acm.split.hdu.edu.cn/showproblem.php?pid=5172官方题解
一个区间是排列只需要区间和为len(len+1)2(len为区间长度),且互不相同,对于第一个问题我们用前缀和解决,对于第二个问题,预处理每个数的上次出现位置,记它为pre,互不相同即区间中pre的最大值小于左端点,使用线段树或Sparse Table即可在O(n)/O(nlogn)的...
分类:
其他好文 时间:
2015-02-15 18:12:15
阅读次数:
161
Sparse Tabel名为稀疏表,又称为ST表,可以在O(1)的时间复杂度下完成查询区间最值,相比线段树和树状数
组,效率提升了不少.ST表本质上是一个很经典的dp,通过预处理完成O(1)的查询.既然是个dp,那我们来看下dp的
定义吧(下面以查询区间最大值为例).
dp[i][j]:表示以i为起点,长度为2^j的区间最值
那么我们很容易得出状态转移方程:...
分类:
其他好文 时间:
2015-02-03 13:25:50
阅读次数:
188
对于求区间最大最小值,我们自然而然就想到了一个O(n)时间复杂度的算法,但是如果询问有很多呢?这样必然超时。当然我们可以用线段树来解,使得每一次查询的时间降到log(n),但是对于RMQ算法,只要我们做了些预处理,之后的查询我们仅需要O(1)的时间。Sparse_Table算法是解决RMQ问题的一类...
分类:
其他好文 时间:
2014-11-19 23:55:43
阅读次数:
250
题目大意:给定一个n个单词的文章,求每个单词在文章中的出现次数
文章长度
首先将所有单词用空格连接成一个字符串,记录每个单词的起始位置和长度
然后求后缀数组,对于每个单词后缀数组中一定有连续一段后缀以这个单词开头,我们通过一开始记录的起始位置找到这个单词的后缀,然后左右端点二分答案,满足左右端点之间的后缀与原单词的LCP都当与等于原单词长度即可
时间复杂度O(nlogn)
#includ...
分类:
编程语言 时间:
2014-11-12 15:05:52
阅读次数:
823
Balanced LineupTime Limit: 5000 MS Memory Limit: 0 KB64-bit integer IO format: %I64d , %I64u Java class name: Main[Submit] [Status] [Discuss]Descripti...
分类:
其他好文 时间:
2014-08-12 12:49:35
阅读次数:
270
ST算法即是sparse table算法,就是稀疏表的意思,就是利用二分法来划分一个表,划分为2的次方段,之后利用这个st表计算查询结果,可以使得预处理时间O(nlgn),而查询时间为O(1) ;
那么有人会有疑问,既然查询时间是O(1),那么为什么这个算法很多时候并不比线段树快多少,甚至根本没有快过呢?
因为其实查询时间为O(log(range)), range为查询区间的大小,因为...
分类:
其他好文 时间:
2014-07-12 20:35:55
阅读次数:
164