有一類問題被稱作區間最值問題,描述的是,給定 n 個元素,需要查詢下標位於 p , q 之間的最大/小值。
首先確定,針對每一次查詢,肯定是不能動態求最值的,因為每次都要計算,可能造成比較多的時間耗費。
有 一種比較好的解決辦法是,先得到所有結果,在查詢時直接取出結果。這樣,就需要一種資料結構,能夠覆蓋所有查詢並且能快速索引。
用乙個二維陣列儲存中間結果, rmq[n][i],每乙個元素表示:第 i 個元素到 i + 2 ^ n 個元素之間的最大值。這樣,我們將演算法分成兩個部分,乙個是初始化,乙個是查詢,演算法如下所示:
void prepare(int n,int *data)
for (j = 0;(1 << j) < n;++ j)//這裡對於 n > 1 時可以不用相等,而當 n = 1 時必須要有相等這個條件,否則 table 不會被賦值
else
} }}
int querymax(int p,int q)
RMQ(區間最值問題)
1 概述 lca least common ancestors 即最近公共祖先,是指這樣乙個問題 在有根樹中,找出某兩個結點u和v最近的公共祖先 另一種說法,離樹根最遠的公共祖先 rmq range minimum maximum query 即區間最值查詢,是指這樣乙個問題 對於長度為n的數列a,...
RMQ 區間最值查詢演算法
rmq range minimum maximum query 對於長度為n的數列a,回答若干詢問rmq a,i,j i,j n 返回數列a中下標在i,j裡的最小 大 值。主要方法 樸素 即搜尋 複雜度為o n 線段樹能在對數時間內在陣列區間上進行更新與查詢。預處理 o n 查詢 o logn 定義...
RMQ 區間最值查詢 入門
講解不錯 一些細節講解 rmq range minimum maximum query 即區間最值查詢。rmq演算法一般用較長時間做預處理,時間複雜度為o nlogn 然後可以在o 1 的時間內處理每次查詢。主要是來解決 給你乙個陣列 其中有n個數字,現在給你多次詢問,給你區間 l,r 問你在這個區...