RMQ問題 Sparse Table演算法

2021-07-11 21:47:06 字數 885 閱讀 8285

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 #include 

using

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 ...