1. 程式人生 > >[學習-思考-探究]莫隊算法 曼哈頓最小生成樹與分塊區間詢問算法

[學習-思考-探究]莫隊算法 曼哈頓最小生成樹與分塊區間詢問算法

所有 我們 轉移 關鍵字 這樣的 不必要 時間復雜度 大於 莫隊算法

前段時間刷了一些莫隊算法的題目,這裏記錄了一些理解和思考。
莫隊算法
算法
莫隊算法用於解決一類可以由區間[l,r]的答案可以快速轉移出區間[l-1,r],[l+1,r],[l,r+1],[l,r-1]的區間離線詢問問題。
我們假設轉移的復雜度是c
莫隊算法的"本質"是把把每一個區間看成平面上的點,l是橫坐標,r是縱坐標。
由點(l0, r0)轉移到(l, r)的復雜度是(|l-l0|+|r-r0|)c。轉移次數即是兩點之間的曼哈頓距離。
所以對所有的詢問作曼哈頓最小生成樹可以避免不必要的計算。
莫隊算法采用了分塊思想,把整個區間分成$\sqrt{n}$個小區間,以詢問左端點所在區間為第一關鍵字,右端點位置為第二關鍵字排序。
可以保證時間復雜度是$O(n*\sqrt{n})$
具體的步驟這裏略過。
這樣做一定是最優的嗎?


實際上求曼哈頓最小生成樹有$O(nlog{n})$的算法,莫隊算法中求得的不是曼哈頓最小生成樹。
考慮如果平面上有n/2個點,保證任意兩點之間的曼哈頓距離大於等於$/sqrt{n}$(這裏指的是近似值...不過顯然是可以做到的),它們的曼哈頓最小生成樹有n/2-1條邊。
總長度自然也就大於等於$n*\sqrt{n}$(忽略系數..)因此,莫隊算法這樣的做法是較優的,如果求曼哈頓最小生成樹,算法復雜度仍是$O(n*/sqrt{n})$。

[學習-思考-探究]莫隊算法 曼哈頓最小生成樹與分塊區間詢問算法