RMQ問題 線段樹演算法,ST演算法優化

2021-09-22 13:13:52 字數 2231 閱讀 5205

對於長度為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 #include2

3using

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

using

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