曼哈頓距離最小生成樹與莫隊算法

曼哈頓距離最小生成樹與莫隊算法


List

Knowledge

1 曼哈頓距離最小生成樹

曼哈頓距離最小生成樹問題可以簡述如下:
給定二維平面上的N個點,在兩點之間連邊的代價爲其曼哈頓距離,求使所有點連通的最小代價。
樸素的算法可以用O(N2)的Prim,或者處理出所有邊做Kruskal,但在這裏總邊數有O(N2)條,所以Kruskal的複雜度變成了O(N2logN)。
但是事實上,真正有用的邊遠沒有O(N2)條。我們考慮每個點會和其他一些什麼樣的點連邊。可以得出這樣一個結論,以一個點爲原點建立直角座標系,在每45度內只會向距離該點最近的一個點連邊。
這個結論可以證明如下:假設我們以點A爲原點建系,考慮在y軸向右45度區域內的任意兩點B(x1,y1)和C(x2,y2),不妨設|AB|≤|AC|(這裏的距離爲曼哈頓距離),如下圖:
pic
|AB|=x1+y1,|AC|=x2+y2,|BC|=|x1-x2|+|y1-y2|。而由於B和C都在y軸向右45度的區域內,有y-x>0且x>0。下面我們分情況討論:
1. x1>x2且y1>y2。這與|AB|≤|AC|矛盾;
2. x1≤x2且y1>y2。此時|BC|=x2-x1+y1-y2,|AC|-|BC|=x2+y2-x2+x1-y1+y2=x1-y1+2*y2。由前面各種關係可得y1>y2>x2>x1。假設|AC|<|BC|即y1>2*y2+x1,那麼|AB|=x1+y1>2*x1+2*y2,|AC|=x2+y2<2*y2<|AB|與前提矛盾,故|AC|≥|BC|;
3. x1>x2且y1≤y2。與2同理;
4. x1≤x2且y1≤y2。此時顯然有|AB|+|BC|=|AC|,即有|AC|>|BC|。
綜上有|AC|≥|BC|,也即在這個區域內只需選擇距離A最近的點向A連邊。
這種連邊方式可以保證邊數是O(N)的,那麼如果能高效處理出這些邊,就可以用Kruskal在O(NlogN)的時間內解決問題。下面我們就考慮怎樣高效處理邊。
我們只需考慮在一塊區域內的點,其他區域內的點可以通過座標變換“移動”到這個區域內。爲了方便處理,我們考慮在y軸向右45度的區域。在某個點A(x0,y0)的這個區域內的點B(x1,y1)滿足x1≥x0且y1-x1>y0-x0。這裏對於邊界我們只取一邊,但是操作中兩邊都取也無所謂。那麼|AB|=y1-y0+x1-x0=(x1+y1)-(x0+y0)。在A的區域內距離A最近的點也即滿足條件的點中x+y最小的點。因此我們可以將所有點按x座標排序,再按y-x離散,用線段樹或者樹狀數組維護大於當前點的y-x的最小的x+y對應的點。時間複雜度O(NlogN)。
至於座標變換,一個比較好處理的方法是第一次直接做;第二次沿直線y=x翻轉,即交換x和y座標;第三次沿直線x=0翻轉,即將x座標取相反數;第四次再沿直線y=x翻轉。注意只需要做4次,因爲邊是雙向的。
至此,整個問題就可以在O(NlogN)的複雜度內解決了。

2 莫隊算法

據說這個算法是莫濤提出的(Orz!),但是在網上到處都搜不到相關資料,最後問pty才知道的。這個算法是用於處理一類不帶修改的區間查詢問題的離線算法,其核心在於利用曼哈頓距離最小生成樹算法對區間處理順序進行處理。比如下面這個例題(清橙A1206《小Z的襪子》,就是莫隊出的題):
給定一個長爲N的序列,每個元素的值是其顏色。有M次詢問,每次詢問從一個區間中隨機選取兩個元素同色的概率。
一次詢問[l,r]的答案即,其中是區間中第i中顏色的個數。顯然暴力是O(NM)的,而且一般的區間問題的思路似乎不適用。
我們先考慮一個簡化的問題:所有的查詢區間的左端點都是1。那麼我們可以按右端點排序,假設已經處理出了[1,r]的答案,考慮轉移到[1,r+k],即添加k個元素,這個可以在O(k)的複雜度內求出。那麼處理所有區間的複雜度(不考慮排序)就是O(N)。
那麼如果是從[l,r]轉移到[l’,r’]呢?複雜度即O(|r’-r|+|l’-l|),也即點(l,r)到點(l’,r’)的曼哈頓距離。那麼如果將所有詢問轉化成二維平面中的點,求曼哈頓距離最小生成樹,再按照生成樹的順序做,就可以最小化區間之間轉移的複雜度。可以證明(我不會證……似乎莫隊的論文裏有),這樣做的複雜度是O(N^1.5)的。問題也就得到了解決。

Examples

點擊訪問我的博客(帶code)。

eg1

POJ3241 Object Clustering

eg2

Tsinsen A1206&Bzoj2038小Z的襪子

參考文獻

鳴謝

ZYT huzecong 瘋狂的橡樹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章