ST表

ST表,又称稀疏表,主要用于解决静态的范围最小值问题(RMQ)。博客介绍了ST表的基本思想,如何初始化,以及如何进行查询操作。虽然ST表在动态RMQ中不如线段树,但作者提出了一个创新的静态区间求和ST表的实现,通过预处理阶段的修改和递归查询来处理区间加法。预处理复杂度仍为O(nlogn),但查询操作的时间复杂度在新方法下可能增加。
摘要由CSDN通过智能技术生成

ST表(sparse-table)是一种代码极其短的数据结构,RMQ(Range Minimum Qustion,范围最小值问题)专用。

RMQ就是给你一个序列不断询问你给定区间内的最小值。

ST表只能解决静态的RMQ,动态的需要用到万能的常数贼大的线段树。

链接

ST表基本思想: d [ i ] [ j ] d[i][j] d[i][j] 表示以 i i i 为起点,长度为 2 j 2^j 2j 这一段区间中的最小值。

例如, d [ 3 ] [ 2 ] d[3][2] d[3][2] 就是 3 ∼ 3 + 2 2 3\sim 3+2^2 33+22 区间,即 3 ∼ 7 3\sim 7 37 区间的最小值。

ST表初始化代码:

for (register int i(1); i <= n; ++ i) d[i][0] = a[i] = read();
for (register int i(n); i >= 1; -- i)
for (register int j(1); i + (1 << j - 1) <= n; ++ j)
d[i][j] = max(d[i][j - 1], d[i + (1 << j - 1)][j - 1]);

由于本身ST表解决问题范围有很大的局限性上述代码可以直接背。

原理用一张图就可以说明了:

在这里插入图片描述
我们要算出 d [ i ] [ j ] d[i][j] d[i][j] 的值,也就是 i ∼ i + 2 j i\sim i+2^j ii+2j 区间内的最小/大值

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值