約束RMQ 1RMQ演算法 複雜度O n

2021-06-20 12:57:37 字數 623 閱讀 9814

約束rmq的解法

現在仍舊用a[0,n-1]表示問題中的數列,這裡有|a[i]-a[i-1]|=1(i=1,2,...,n-1)成立。

將a分解為長度為l=[(log n)/2]的塊。設a'[i]為第i塊中的最小值,b[i]為該最小值的位置。a'[i]和b[i]的長度均為n/l, 所以用st演算法處理a'陣列的時空複雜度均為o(n/l*log(n/l))=o(n/logn*(logn-logl))=o(n)。預處理之後,對任意多連續的塊進行的查詢都能在o(1)時間內實現。餘下的問題是如何進行塊內查詢。

注意到對任意一塊中的塊內查詢的結果有影響的唯一因素是塊內每相鄰兩個元素間的「公升降關係」構成的序列。因為每兩個元素之間的關係只有兩種(「+1」、「-1」),而塊的長度又只有l=[(log n)/2],所以本質不同的塊最多有2^i=o(sqrt n)種。對每種塊中所有可能的塊內查詢預處理出答案的時空複雜度是o(sqrt n*l^2)=o(n)(這裡的o(n)表示不超過線性時間)。預處理出所有塊的「型別」,並用二進位制數儲存的時間複雜度是o(n)。

此後,每次查詢可以分為兩種情況:

1、塊內查詢,答案已經被預處理出,只要在陣列中找到它即可。

2、塊間查詢,可以分解為2個塊內查詢,和乙個a'上的rmq,三者的時間複雜度都是o(1)。

約束rmq 1RMQ(約束RMQ)

1rmq其實是rmq的乙個特殊情況,它的特殊性體現在 序列中每兩個相鄰元素的差是1或 1。即 對於這種特殊情況,有一種方法可以將rmq的時間降至常數級別,即用 的時間解決。可以發現,如果lca用dfs rmq的方法解決,則rmq部分正好是 1rmq。所以,如果會了這種方法,將可以用 這裡簡單 因為我...

大O演算法複雜度表示

序言 演算法的時間複雜度和空間複雜度都是用 大o表示法 來表示的。其中o是個常量。常見的排序演算法的時間複雜度 氣泡排序 插入排序 希爾排序 選擇排序的時間複雜度是o n 2 快速排序的時間複雜度是o n log n 空間複雜度 氣泡排序 插入排序 希爾排序 選擇排序的空間複雜度是o 1 快速排序的...

時間複雜度 大O演算法

演算法的執行效率,就是演算法 的執行時間。我們需要能夠用肉眼就看出一段 的執行時間。int cal int n return sum 2,3行都執行了1個unit time的執行時間,4,5行都執行了n遍,所以是2n unit time的執行時間,所以一共是 2n 2 unit time。所有的 的...