ST算法
2015-08-01 15:19
375 查看
ST(Spare Table)算法是在O(Nlog2N)−O(1)内完成RMQ问题的在线算法。
所谓RMQ(Range Minimal Query)问题是指区间内最小值询问问题。
在朴素算法下,解决RMQ问题的时间复杂度为O(n),但实际上当遇到数量级比较大的询问时,复杂度就为O(nm)(m为询问次数),所以要使用速度更佳的ST算法。
ST算法属于一种在线算法,其在O(Nlog2N)的时间内完成离线预处理,在O(1)的时间内完成在线查询,则询问次数为m时,复杂度为O(Nlog2N)+O(m)复杂度远低于朴素的O(nm)。
f(k,d)={Ak,min{f(k,d−1),f(k+2d−1,d−1)}d=0d>0
此时,对于每个询问[l,r],求出d=⌊log2(r−l+1)⌋,则答案为min{f(l,d),f(r−2d+1,d)}
算法实现如下:
参考资料:
1. 郭华阳《RMQ与LCA问题》(2007)
所谓RMQ(Range Minimal Query)问题是指区间内最小值询问问题。
在朴素算法下,解决RMQ问题的时间复杂度为O(n),但实际上当遇到数量级比较大的询问时,复杂度就为O(nm)(m为询问次数),所以要使用速度更佳的ST算法。
ST算法属于一种在线算法,其在O(Nlog2N)的时间内完成离线预处理,在O(1)的时间内完成在线查询,则询问次数为m时,复杂度为O(Nlog2N)+O(m)复杂度远低于朴素的O(nm)。
f(k,d)={Ak,min{f(k,d−1),f(k+2d−1,d−1)}d=0d>0
此时,对于每个询问[l,r],求出d=⌊log2(r−l+1)⌋,则答案为min{f(l,d),f(r−2d+1,d)}
算法实现如下:
procedure prep; var i,j:longint; begin for i:=1 to m do f[i,0]:=a[i]; //求f(k,0) for i:=1 to trunc(ln(m)/ln(2)) do for j:=1 to (m-(1 shl i)+1) do f[j,i]:=min(f[j,i-1],f[j+1 shl (i-1),i-1]); //求f(k,d) end; function ask(l,r:longint):longint; var tmp:longint; begin tmp:=trunc(ln(r-l+1)/ln(2)); //求d exit(min(f[l,tmp],f[r-(1 shl tmp)+1,tmp])); end;
参考资料:
1. 郭华阳《RMQ与LCA问题》(2007)
相关文章推荐
- SQL语句执行效率及分析
- MATLAB 无约束一维极值问题
- 排序分类基本介绍
- xml约束DTD演示
- Problem F
- uva11732 字典树
- 运用proguard进行代码混淆
- 双向冒泡排序
- 新装ubuntu 没有语言设置图标
- jdbc-odbc连接dbf (转)
- play 1.2.7
- 【CSAPP】proxy Lab代理实验
- zoj 1610 Count the Colors --线段树成段更新
- JQuery中$.ajax()方法参数详解
- SVD奇异值分解简析
- 杭电4883 TIANKENG’s restaurant(小板凳的问题)
- Label Button和textfield组合
- 使用Cadence绘制PCB流程(个人小结)
- POJ1064——二分——Cable master
- 按值传递对象和按址传递对象