對於長度為n的數列a,回答若干詢問rmq(a,i,j)(i,j<=n),返回數列a中下標在[i,j]裡的最小(大)值,也就是說,rmq問題是指求區間最值的問題
主要方法及複雜度(處理複雜度和查詢複雜度)如下:
1.樸素(即搜尋) o(n)-o(n)
2.線段樹(segment tree) o(n)-o(qlogn)
3.st(實質是動態規劃) o(nlogn)-o(1)
線段樹方法:
線段樹能在對數時間內在陣列區間上進行更新與查詢。
定義線段樹在區間[i, j] 上如下:
第乙個節點維護著區間 [i, j] 的資訊。
if i
1 #include23using
namespace
std;45
#define maxn 100
6#define maxind 256 //
線段樹節點個數78
//構建線段樹,目的:得到m陣列.
9void initialize(int node, int b, int e, int m, int
a)1025}
2627
//找出區間 [i, j] 上的最小值的索引
28int query(int node, int b, int e, int m, int a, int i, int
j)29
5859
60int
main()61;
65 initialize(1, 0, sizeof(a)/sizeof(a[0])-1
, m, a);
66 cout<1, 0, sizeof(a)/sizeof(a[0])-1, m, a, 0, 5)<67return0;
68 }
st演算法(sparse table):它是一種動態規劃的方法。
以最小值為例。a為所尋找的陣列.
用乙個二維陣列f(i,j)記錄區間[i,i+2^j-1](持續2^j個)區間中的最小值。其中f[i,0] = a[i];
所以,對於任意的一組(i,j),f(i,j) = min來使用動態規劃計算出來。
這個演算法的高明之處不是在於這個動態規劃的建立,而是它的查詢:它的查詢效率是o(1).
假設我們要求區間[m,n]中a的最小值,找到乙個數k使得2^k
1 #include2 #include3 #include4using
namespace
std;56
#define m 100010
7#define maxn 500
8#define maxm 500
9int dp[m][18
];10
/*11
*一維rmq st演算法
12*構造rmq陣列 makermq(int n,int b) o(nlog(n))的演算法複雜度
13*dp[i][j] 表示從i到i+2^j -1中最小的乙個值(從i開始持續2^j個數)
14*dp[i][j]=min
15*查詢rmq rmq(int s,int v)
16*將s-v 分成兩個2^k的區間
17*即 k=(int)log2(s-v+1)
18*查詢結果應該為 min(dp[s][k],dp[v-2^k+1][k])
19*/
2021
void makermq(int n,int
b)22
30int rmq(int s,int
v)31
3536
void makermqindex(int n,int b) //
返回最小值對應的下標
3745
int rmqindex(int s,int v,int
b)46
5051
intmain()52;
54//
返回下標
55 makermqindex(sizeof(a)/sizeof(a[0
]),a);
56 cout<0,9,a)<57 cout<4,9,a)<58//
返回最小值
59 makermq(sizeof(a)/sizeof(a[0
]),a);
60 cout<0,9)<61 cout<4,9)<62return0;
63 }
RMQ問題 線段樹演算法,ST演算法優化
對於長度為n的數列a,回答若干詢問rmq a,i,j i,j n 返回數列a中下標在 i,j 裡的最小 大 值,也就是說,rmq問題是指求區間最值的問題 主要方法及複雜度 處理複雜度和查詢複雜度 如下 1.樸素 即搜尋 o n o n 2.線段樹 segment tree o n o qlogn 3...
RMQ問題 st 線段樹
j 演算法 rmq range minimum maximum query 問題是指 對於長度為n的數列a,回答若干詢問rmq a,i,j i,j n 返回數列a中下標在 i,j 裡的最小 大 值,也就是說,rmq問題是指求區間最值的問題 主要方法及複雜度 處理複雜度和查詢複雜度 如下 1.樸素 即...
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 ...