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

2021-10-01 07:35:00 字數 1110 閱讀 6923

【st演算法簡介】

資訊學競賽中,經常會出現rmq問題,即求區間最大(小)值問題。那麼,我們該如何求解呢?st演算法橫空出世。 

st演算法(sparse table,稀疏表)主要用於解決區間最值問題(即

rmq問題)。因為st演算法求解rmq問題時的時間複雜度只有o(nlogn),查詢時間複雜度為常數階o(1),所以我們還常稱

st演算法為tle的死敵

本題利用了st演算法求解,st演算法分預處理及詢問兩部分。要理解st演算法,首先要注意下文表述中的移位運算子 >>及<< 的優先順序比四則運算 +-*/ 的優先順序高。這樣就能理解 1<

(2)查詢

若給定查詢

區間 [x,y]

,若利用st演算法求此區間內的最大值。則需先求出最大的 k,使之滿足 

2^k ≤ y-x+1

。在此基礎上,區間 [x,y]=[x,x+2^k-1]∪[y-2^k+1,y],則區間 [x,y] 內的最大值為 max(f[x][k],f[y-(1雖然這兩個區間有交集,但對於求區間最值來說沒有影響。

據上,利用st演算法查詢區間 [x,y] 的最大值,計算式如下:

k=log2(y-x+1)

max(f[x][k],f[y-(1<

【演算法**】

#includeusing namespace std;

const int maxn=100005;

const int maxm=20; //∵log(10^6)<20

int a[maxn];

int f[maxn][maxm]; //f[i][j]表示從i位起的2^j個數中的最大數

int main()

for(int j=1; j<=log2(n); j++)

for(int i=1; i+(1<

Sparse Table演算法 求解RMQ

sparse table演算法,簡稱st演算法,可以用來求解rmq 區間最值查詢 問題。rmq問題的形式一般是 存在乙個大陣列,要求對於給定的起點和終點,迅速回答出這段區間的最大值或最小值。樸素的方式是掃瞄起點到終點的所有數,維護其中的最值,這樣的複雜度是o n 2 的,速度太慢。st演算法是使用的...

RMQ問題 Sparse Table演算法

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

演算法 ST表

想學習一下lca倍增,先 水乙個黃題 學一下st表 這是乙個運用倍增思想,通過動態規劃來計算區間最值的演算法 求出區間最值 回答詢問 求出區間最值 用 f i j 來儲存從第 j 個點開始,向後 2 i 1 個點 共 2 i 個點 中的最值 包括本身 利用二分法的思想,將區間 j,j 2 i 1 平...