您的位置:首页 > 其它

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)}

  算法实现如下:

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: