2020-10-05

ST表,又称稀疏表,是一种用于快速求解区间最大值问题的数据结构。通过动态规划,以O(nlogn)的时间复杂度构建f数组,其中f[i][j]表示从i开始长度为2^j的区间最大值。利用相邻区间合并策略,可以高效地求解任意区间[l, r]的最大值。适合解决区间查询的问题。" 111210235,10326282,单片机常用C语言算法详解与代码实例,"['C语言编程', '单片机开发', '算法实现', '微控制器', '数学运算']
摘要由CSDN通过智能技术生成

st表:
作者:王清楚
链接:https://ac.nowcoder.com/discuss/395376
来源:牛客网

ST 表(Sparse Table)实际上是一种动态规划的方法,或者说简单一点,是用统计的思想来解决问题,它主要用于求解区间最大/最下值问题(也可也用来求和或者其他的东西)。以求区间最大值为例,它的基本思想是:用 {f[i] [j]}f[i][j]维护从从i开始长度为 2^{j}2
j
的区间的最大值,例如 {f[1] [1]}f[1][1] 表示的是以1开始长度为2的区间的最大值, {f[1] [2]}f[1][2]表达的是以1开始长度为4的区间的最大值。我们可以看到 {j}j 每增加1,区间的长度乘以二,于是两个相邻区间合并就可以得到当前这个长度的区间的最大值了,也就是说 f[i] [j] = max(f[i] [j-1], f[i+2^{j-1}] [j-1])f[i][j]=max(f[i][j−1],f[i+2
j−1
][j−1]),这样 {O(nlogn)}O(nlogn)的时间复杂度我们就可以维护出f数组。在这里插入图片描述
知道了f数组我们怎么来求任意区间[l,r]的最大值呢?也很简单,我们用两个长度刚好大于(r-l+1)/2的区间拼起来就好了(一个左边界是l,一个右边界是r)`

void rmp_st(int n) //预处理ST表,数组中有n个元素
{
   
    for(int i = 1; i <= n; i++) f[i][0] = a[i];
    int m = (int)(log((double)n) / log(2.0));
    for(int j = 1; j <= m; j++)//先循环j再循环i,因为必须要把长度为1的区间都算出来了才能求长度为2的
    for(int i = 1; i+(1<<j)-1 <= n; i++)
        f[i][j] = min(f[i][j-1], f[i+(1<<(j-12))][j-1]);
}
int rmp_find(int l, int r)  //求区间 l 到 r 之间的最值
{
   
    int k = (int)(log(1.0 * (r-l+1)) / log(2.0));
    return min(f[l][k], f[r-(1<<k)+1][k
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值