資料結構專題小結 RMQ問題

2021-06-29 05:46:43 字數 764 閱讀 7843

範圍最小值問題(range minimum query)是指:給定乙個n個元素的陣列a[1],a[2]...a[n]。設計乙個資料結構,支援查詢操作query(l,r):計算min。

該問題在實踐中常用tarjan的sparse-table演算法。它的預處理時間是o(n*logn),但查詢只需要o(1),而且常數非常小。最重要的是,這個演算法非常好寫,而且不易寫錯。

(1)原理:該演算法利用了分治法的思想,令d(i,j)表示從i開始的,長度為2^j的一段元素中的最小值。則不難發現如下公式成立:

d(i,j)=min

注意到2^i≤n,因此d陣列的元素個數不超過n*logn個,而每一項都能在常數時間內算完。因此總的時間複雜度是o(n*logn)。

#define n 1000

int d[n][n];

vectora;

#define inf 100000000

void rmq_init(const vector&a)//初始化操作,所有元素放到vector中

查詢操作也很簡單,令k為滿足2^k≤r-l+1的最大整數,則以l開頭,以r結尾的兩個長度為2^k的區間合起來即覆蓋了查詢區間[l,r]。由於是最小值,有些元素重複考慮了也沒有關係。

int rmq(int l, int r)

更簡潔的寫法如下:

int rmq(int l, int r)

資料結構 RMQ問題

rmq range minimum maximum query 即區間最值問題。對於長度為n的數列a,回答若干查詢rmq a,i,j i,j n 返回數列a中下標在i,j裡的最大 小 值。假設當前題目要求區間最小值,我們令dp i j 代表從i開始,長度為 2 這段區間的最小值。於是便有 dp i ...

資料結構鐵軌問題 資料結構練習專題

下面我給大家帶來一些資料結構的題,供大家欣賞 一 棧 鐵軌試題描述 某城市有乙個火車站,鐵軌鋪設如圖所示,有n節車廂從a方向駛入車站,按進站順序編號為1至n。你的任務是判斷是否能讓它們按照某種特定的順序進入b方向的鐵軌並駛出車站。為了重組車廂,你可以借助中轉站c。這是乙個可以停放任意多節車廂的車站,...

資料結構專題

一.並查集 主要操作 1.合併兩個不相交集合 2.判斷兩個元素是否屬於同一集合 時間複雜度 o n n 其中 x 對於x 宇宙中原子數之和,x 不大於4,事實上,路經壓縮後的並查集的複雜度是乙個很小的常數。模板題 include includeusing namespace std for poj ...