rmq引子:
我們都知道求乙個陣列的最小值,可以用很樸素的o(n)級別的演算法來求解。
那麼,如果現在是求乙個陣列的任意連續子陣列的最小值呢?假設詢問q次,那麼總的時間複雜度為o(q*n),時間開銷很高!這就是今天所要介紹的rmq問題(range minimum query)。
然而,如果使用一些分治的思想,可以大大簡化時間複雜度。
我們在求乙個區間的最小值時,可以把問題一分為二,求左半邊陣列的最小值minleft,右半邊陣列的最小值minright,然後求二者的最小值即可!
minleft和minright怎麼求呢?同樣用剛才分而治之的思想,繼續分下去。最後,一定可以分到陣列僅有乙個元素的樸素情況。
我們定義dp[i][j]為:以下標i開頭,長度為2j的陣列的最小值,則:
dp[i][j] = min(dp[i][j-1], dp[i+2j-1][j-1])
sparse-table適用於:
1. 只需要查詢區間最大/小值
2. 但是,不需要對陣列進行修改的問題
#include #includeusing
namespace
std;
const
int maxn = 1024
;const
int maxk = 10
;int
d[maxn][maxk];
intn;
void
build()
for(int j = 1; (1
<< j) <= n; j++)
}}int query(int l, int
r) int
main ()
return
0;
}
談談RMQ問題
沒用的話 好像好久沒更博了,無聊就講講演算法吧 主要找不到水題 認識rmq 要學習rmq,首先要知道rmq問題是什麼吧?rmq簡單來說就是求區間的最大值 最小值 什麼?沒懂!舉個栗子 1 2 9 10 15 38 9 這裡有 7 個數 隨便輸的 rmq就是用來查詢這些數中的最大值 最小值 但是是區間...
RMQ問題與LCA問題
一 區間最小 最大查詢 range minimum maximum query rmq 問題 toj 2762 描述 已知長度為l 的數列a 詢問區間 l,r 中的最值。若詢問的次數較少,可以用線性的複雜度來查詢,但如果詢問的次數過多且l 過大,那麼複雜度就會很高。所以需要更快速的查詢方法。st 演...
RMQ問題 ST演算法
rmq問題 rmq問題是指求區間最值的問題。rmq演算法 st演算法 時間複雜度 預處理o nlogn 查詢o 1 以求最大值為例,設d i,j 表示 i,i 2 j 1 這個區間內的最大值,那麼在詢問到 a,b 區間的最大值時答案就是max d a,k d b 2 k 1,k 其中k是滿足2 k ...