雜談 莫隊複雜度相關

2022-09-19 16:03:14 字數 1098 閱讀 9808

原理略過

設塊長為 \(b\),易分析得出端點移動次數為 \(\frac+ms\),若 \(n,m\) 同階,取 \(b=\sqrt n\) 最優。但實際上,根據資料生成的方式不同,不同的塊長在效率上也有所不同,但我們這裡暫且討論複雜度上問題,不考慮資料不同帶來的影響。

莫隊掌握的經典技巧是複雜度平衡。

如果 \(m,取塊長 \(\frac\),移動次數和查詢次數得到平衡,左右端點移動次數和查詢次數均為 \(\mathcal(n\sqrt m)\),這一步是根據均值不等式來得出的。

舉個栗子,例如每次端點移動是區間修改,查詢是單點查詢,\(n,m\) 同階。這個時候如果用線段樹或者樹狀陣列,複雜度為 \(\mathcal(n\sqrt n\log n)\).但是注意到詢問只有 \(m\) 次,詢問的複雜度比修改的複雜度還要低,嘗試平衡修改和詢問的複雜度,採用序列分塊來做到 \(\mathcal(1)\) 修改 \(\sqrt n\) 查詢,這樣總複雜度就是 \(\mathcal(n\sqrt n)\).

還有諸如把 \(\log\) 放進根號裡面的技巧,當然這都是理論上的東西,在實踐中,由於實現不同部分的常數差異,塊長有時候取得更大或者更小是更優的。

在正常的問題中,普通莫隊是不斷移動左右端點來維護答案。

但有的問題,插入和刪除複雜度是不一樣的。有時候插入更快一些,有時候刪除更快一些。

採用只插入不刪除,或者只刪除不插入的莫隊,稱之為回滾莫隊。

仍是按照左端點所在的塊為第一關鍵字,按照右端點為第二關鍵字排序。

只插入莫隊:初始左端點為所在塊右端點,右端點從小往大掃,每次處理詢問的時候直接撤銷左端點的影響,重新從塊的右端點開始移動。

只刪除莫隊:類似地,初始左端點為所在塊左端點,右端點從大往小掃,每次處理詢問的時候直接撤銷左端點的影響,重新從塊的左端點開始移動。

很多部落格都是讓左右端點在同一塊內的暴力掃,但如果散塊詢問不好暴力掃得出,一併加入到最後掃莫隊也是不影響的。

舉一反三,分塊也可以沿用類似的思路,常見的分塊是整塊處理答案,散塊暴力掃,這對應的是"只插入莫隊",考慮只刪除的話,那就是記錄全域性的答案,預處理兩側的整塊刪除後對答案的影響,然後散塊暴力刪除。不知道有沒有類似的例題,只是我臨時起意想出來的乙個東西,有時間或許會根據這個思想編一道題。

待補。

關於莫隊演算法時間複雜度的分析

這兩天看了莫隊,對於莫隊演算法感覺實現還是很簡單的,但是時間複雜度的理解好像網上的文章都沒有講的太明白 也可能是我理解能力有問題orz 莫隊的時間複雜度的貢獻主要來自於l,r指標的移動 l跨塊轉移的次數o sqrt n 跨塊轉移的總距離為o n 即不跨塊轉移的次數為o n sqrt n 每次的查詢的...

複雜度分析 時間複雜度 空間複雜度

執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...

演算法複雜度 時間複雜度和空間複雜度

1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...