ST表的學習

2021-10-21 23:50:09 字數 1037 閱讀 4635

st表的優勢在於可以把查詢乙個區間的最值的時間複雜度降為o(n

)o(n)

o(n)

。假設有乙個陣列裡有10000個元素,第i個元素記為ar[i]。

我們用f[i][j]表示從第i個元素開始,向右i+2j-1的 這些元素的最大值。

有f[i][j]=max(f[i][j-1],f[i+2j-1][j-1])

這其實是把區間[i][j]分成了兩個部分,每部分的長度均為2j-1,將兩個部分的最大值儲存在f[i][j]中。有了這個狀態轉移方程後,就可以求出所有的f陣列了。不難看出,時間複雜度為o(n

logn

)o(nlogn)

o(nlog

n)。

for

(j =

1; j <= lg[n]

; j++

)}

這裡的思想非常巧妙。設查詢的區間為[l][r]

則查詢區間的長度為len=r-l+1

查詢結果為max(f[l][log

(len

)log(len)

log(le

n)],f[r-2len+1][log

(len

)log(len)

log(le

n)]通過兩次分別向左,向右的查詢,可以巧妙的覆蓋整個查詢區間。由於log

loglo

g經常需要呼叫,需要預處理一下。

l g[

i]=l

g[i/

2]+1

lg[i]=lg[i/2]+1

lg[i]=

lg[i

/2]+

1用**實現的話,就是

while

(q--

)

這樣,通過預處理o(n

logn

)o(nlogn)

o(nlog

n)後,每次查詢的時間複雜度僅為o(1

)o(1)

o(1)

。是不是很快呢?

ST表 學習筆記

概念 st表是用來求解區間最大值的一種優秀的離線演算法,它可以 o n logn o nlogn o nlog n 預處理,然後o 1 查詢,如何實現呢?思想運用了近似於區間dp的方法,乙個大區間有小區間轉移得到,不同的是,我們定義st i k st i k st i k 表示從第i ii個位置起,...

ST表學習筆記

st表是一種利用dp思想求解最值的倍增演算法 st表常用於解決rmq問題,即求解區間最值問題 接下來以求最大值為例分步講解一下st表的建立過程 1.定義 f i j 表示 i,i 2j 1 這個長度為2j的區間中的最大值 2.預處理 f i 0 a i 即區間 i,i 的最大值就是a i 3.狀態轉...

學習記錄 ST表

st 表是用於解決可重複貢獻問題的資料結構 可重複貢獻問題 是指對於運算 opt 滿足 x opt x x 則對應的區間詢問就是乙個可重複貢獻問題。摘自oi wiki 說人話,就是對區間的重複運算不影響結果。比如區間最值問題 rmq 區間gcd 比方10個數求最大值,先對前7個數求最值,再對後6個數...