Sparse Table演算法 求解RMQ

2021-06-20 13:39:28 字數 1138 閱讀 9230

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)。

RMQ問題 Sparse Table演算法

rmq引子 我們都知道求乙個陣列的最小值,可以用很樸素的o n 級別的演算法來求解。那麼,如果現在是求乙個陣列的任意連續子陣列的最小值呢?假設詢問q次,那麼總的時間複雜度為o q n 時間開銷很高!這就是今天所要介紹的rmq問題 range minimum query 然而,如果使用一些分治的思想,...

ST演算法(Sparse Table,稀疏表)介紹

st演算法簡介 資訊學競賽中,經常會出現rmq問題,即求區間最大 小 值問題。那麼,我們該如何求解呢?st演算法橫空出世。st演算法 sparse table,稀疏表 主要用於解決區間最值問題 即 rmq問題 因為st演算法求解rmq問題時的時間複雜度只有o nlogn 查詢時間複雜度為常數階o 1...

A 演算法求解迷宮

cpp view plaincopy include include include using namespace std 方向向量 int direc 4 2 封閉,開放列表標記 enum flag 最小堆節點類 堆優先順序為 f g h g為當前的路徑長 h為估計當前位置到目標位置開銷探測 當...