ST(Spare Table)算法是在O(Nlog2N)−O(1)内完成RMQ问题的在线算法。
所谓RMQ(Range Minimal Query)问题是指区间内最小值询问问题。
在朴素算法下,解决RMQ问题的时间复杂度为O(n),但实际上当遇到数量级比较大的询问时,复杂度就为O(nm)(m为询问次数),所以要使用速度更佳的ST算法。
ST算法属于一种在线算法,其在
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)