rmq(range minimum/maximum query)問題:
rmq問題是給定乙個區間,求這個區間中的最大或最小值的問題
rmq採用動態規劃的思想來求解:(
st演算法:
square table):
預處理:
預處理使用
dp的思想,
f(i, j)
表示[i, i+2^j - 1]
區間中的最小值。
例如,f(0, 0)
表示[0,0]
之間的最小值,就是
num[0], f(0, 2)
表示[0, 3]
之間的最小值
, f(2, 4)
表示[2, 17]
之間的最小值
注意,
因為f(i, j)
可以由f(i, j - 1)
和f(i+2^(j-1), j-1)
匯出,
而遞推的初值
(所有的
f(i, 0) = i)
都是已知的
所以我們可以採用自底向上的演算法遞推地給出所有符合條件的
f(i, j)
的值。查詢
:假設要查詢從m到
n這一段的最小值
, 那麼我們先求出乙個最大的k, 使得k
滿足2^k <(n - m + 1).
於是我們就可以把
[m, n]
分成兩個
(部分重疊的
)長度為
2^k的區間
: [m, m+2^k-1], [n-2^k+1, n];
而我們之前已經求出了
f(m, k)為
[m, m+2^k-1]的最小值
, f(n-2^k+1, k)為
[n-2^k+1, n]的最小值
我們只要返回其中更小的那個
, 就是我們想要的答案
, 這個演算法的時間複雜度是
o(1)的.
例如, rmq(0, 11) = min(f(0, 3), f(4, 3))
由此我們要注意的是預處理
f(i,j)中的j
值只需要計算
log(n+1)/log(2)
即可,而
i值我們也只需要計算到
n-2^k+1
即可。例子:
poj 3264找出任意給定區間中,最大值和最小值之間的差
排序演算法詳細介紹
排序的定義 對一串行物件根據某個關鍵字進行排序 術語說明 各種演算法的通俗理解!貪心演算法 從左到右,兩兩互換,每一次最後乙個數總是最大的 選擇排序 從左到右,找到從當前位置開始最小的那個數,然後將當前位置的數與那個最小的數字置互換,直到最後 直接插入演算法 從左到右,該數左邊的序列已經是有序的,如...
詳細介紹匈牙利演算法步驟
這篇部落格介紹了匈牙利演算法的操作步驟,不討論原理。作用解決指派問題。所謂的指派問題就比如 甲乙丙三個人去做abc三件事情。每個人做每件事情所花的時間可能不一樣。每個人只能安排一件事情,問怎樣安排才能使三個人所工作的時間之和最小?擴充套件成 n 個人 n 件事也可以,但要求是 例項 甲乙丙中第i i...
poj 3461 kmp演算法詳細解釋
題目鏈結 kmp演算法已經學過好多次了,但每一次都會忘記,因此打算在這裡藉著這一道模板題記錄下自己對kmp演算法的理解 kmp演算法的核心思想可以理解為 利用目標串自身的資訊,來減少匹配次數提高效率 next陣列的引入 next陣列就是用來幫助利用目標串自身的資訊的。我們這裡定義next陣列表示的是...