ST算法

  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,d1),f(k+2d1,d1)}d=0d>0

  此时,对于每个询问[l,r],求出d=log2(rl+1),则答案为min{f(l,d),f(r2d+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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值