ST表讲解
ST表主要用于解決RMQ問題(區間最值問題)
當然你可以用線段樹等,但今天用一種ST表(倍增算法)
ST表是倍增算法的一個典型應用
暴力做RMQ問題,往往會超時,ST表利用對其進行優化
給定一段序列A,ST算法能在O(NlogN)的時間預處理后,以O(1) 的復雜度查詢,在線回答在一段區間l,r 中最大(小)值是多少。
f[i][j]用于表示在序列a中, 從第i位數字往后數2j個數,這個區間內的最大值,即區間[ i , i + 2 j ]內取得的最大值。
而這段區域的最大值等于左右子區間的最大值,2j = 2 * 2 j-1 = 2j-1 + 2j-1,把區間[i,i+2j]分成[i , i + 2j-1 ] [ i + 2j-1 + 1,2j]
(即f [ i ] [ j - 1 ] 與 f [ i + 2 j-1 - 1 ] [ j -1 ] )
我們可得:F [ i ] [ j ] = max ( F [ i ] [ j - 1 ] , F [ i + 2 j-1 - 1 ] [ j - 1 ] )
遞推邊界為f[i][0]=a[i]
其實說白了就是:相求大區間就先求出小區間,求小區間就求小小區間,一直這樣套娃到最低層。
但是我們查詢的區間不一定總是2的倍數,也有可能會超出區間
所以我們詢問區間[l,r]時要用一個k,k=log2(len),len為區間的長度,k向下取整
len=r-l+1
2t<len<2t+1
左右區間最大值分別是F [ l , k ] 與F [ r - 2k + 1 , k ]
總結
- 上一篇: java 程序迁移后oracle 数字溢
- 下一篇: LCA总结