Sparse Table算法(求解RMQ)

本文介绍SparseTable算法(简称ST算法),一种高效解决RMQ(区间最值查询)问题的方法。ST算法采用类似二分的动态规划思想,预处理时间复杂度为O(nlogn),查询时间复杂度为O(1)。文章详细解释了算法的工作原理,包括初始化过程和求解步骤。
摘要由CSDN通过智能技术生成

Sparse Table算法,简称ST算法,可以用来求解RMQ(区间最值查询)问题。

RMQ问题的形式一般是:存在一个大数组,要求对于给定的起点和终点,迅速回答出这段区间的最大值或最小值。

朴素的方式是扫描起点到终点的所有数,维护其中的最值,这样的复杂度是O(n^2)的,速度太慢。ST算法是使用的是类似于二分的动态规划思想,其复杂度是O(nlogn),因此查询速度非常快。

ST算法的执行过程(以求最大值为例):

1、初始化:

设原数组为x[N]。

开辟一个数组dp[N][33]。其中dp[i][j]表示的是从下标为i的元素开始,到下标为(i + 2^j - 1)的元素为止,这些元素中的最大值。对于整型而言,其值不会超过2^32,因此第二维大小为33已经足够。

因此dp[i][0]表示的是元素本身,因此可以初始化为dp[i][0] = x[i]。

对于其他的dp[i][j],可以采用动态规划的方式求出,递推式为dp[i][j] = max(dp[i][j - 1], dp[i + 2 ^ (j - 1)][j - 1]),其实就是把一段区间切成两段大小相等的区间,当前区间的最大值就是两个子区间的最大值中的较大者。

初始化的复杂度为O(nlogn)。

2、求解:

对于给定的起点beg及终点end,可以得出区间大小为range = end - beg + 1。

因此可以找到一个整数k = (int)(log(range) / log2)。这样区间就可以被划分为子区间1,即[beg, beg + (2 ^ k) - 1],子区间2,即[end - (2 ^ k) + 1, end]。这两个可能会有重叠,但重叠不会影响最大值的求解。因此对于beg和end,可以得到解为res = max(dp[beg][k], dp[end - (2 ^ k) + 1][k])。

求解的复杂度为O(1)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值