RMQ(範圍最值問題)演算法學習

2022-07-20 02:57:14 字數 423 閱讀 2984

rmq演算法適合求解對乙個陣列多次查詢給定範圍內的最值。

預處理操作:

令d[i,j]表示從i開始,長度為2^j的一段元素的最值,可以用遞推公式寫出d[i,j] = min

原理如圖所示:

複雜度:因為2^j<=n, 所以d陣列的元素不會超過nlogn個, 計算每個d需要o(1)。所以總的時間複雜度是o(nlogn)

查詢操作:找到乙個最大的整數k,使2^k<=r-l+1,這樣查詢區間就可以分為 i~i+2^k-1    和   j-2^k+1 ~ j   2個區間。因為是求最值,所以區間有一些重複也沒有關係。 

//

d[i][j] 表示 i往後2^j 區間內的最值

void rmq_init(int *a,int

n)int rmq(int l, int

r)

RMQ(區間最值問題)

1 概述 lca least common ancestors 即最近公共祖先,是指這樣乙個問題 在有根樹中,找出某兩個結點u和v最近的公共祖先 另一種說法,離樹根最遠的公共祖先 rmq range minimum maximum query 即區間最值查詢,是指這樣乙個問題 對於長度為n的數列a,...

範圍最小值問題(RMQ)

給出乙個n個元素的陣列 tarjan的sparse table演算法 include includeusing namespace std const int maxn 10005 int a maxn d maxn 20 d i j 為以a i 為起點,長度為2 j的一段元素中的最小值 遞推公式d...

範圍最小值(RMQ)問題

問題 給出乙個n個元素的陣列,a 1 a 2 a n 設計乙個資料結構,支援查詢操作rmq l,r 計算min。分析 迴圈計算會超時,用tarjan的sparse table演算法,預處理時間是o nlogn 查詢只需要o 1 令d i j 表示從i開始,長度為2的j次方的一段元素的最小值。則d i...