Borůvka 樹分治(二):King's 轉化
King's 轉化(King's Reduction)將我們前一篇提到的區間最大值的問題,變成一個樹上路徑最大值問題(Tree Path Maximum)。我們接續前一篇所舉的例子:
在這個例子中,若我們將每一次 Borůvka 步驟所獲得的連通元件具體定義為樹上的一個點,並且與連通元件內的所有點都連起來(並且給予適當的權重),就會形成以下的樹 B。
大家不妨可以檢驗看看,隨意挑選一個區間,這個區間的起點和終點會對應到該樹上的兩片葉子。而區間內數值的最大值,會恰好等於樹 B 中的兩個點之間路徑上的最大權重。值得一提的是,在樹 B 當中的這條路徑,不見得恰好包含原本區間內的所有數值,它可能會多一些數值、也可能會少一些數值。但這個 King's 轉化厲害的地方是,這條路徑總是包含最大值、而且這個轉化也適用於輸入是一棵樹的情形。
現在讓我們來仔細定義這棵樹。對於一個輸入的樹 T=(V,E)(上述例子中,這棵樹是一條路徑),我們先執行一連串的 Borůvka 步驟。 並且我們定義 ti,j 為第 i 次 Borůvka 步驟找出的第 j 個連通元件。 為了方便起見我們將原本樹 T 的點集合 V 寫作 V={t0,j}。 定義樹 B 如下:
- B 的所有節點,為所有連通元件所形的集合 {ti,j}。樹根為 tℓ,0,而 ℓ≤log|V| 為 Borůvka 步驟進行的總次數。
- 樹 T 的每一個節點 t0,j,對應到樹 B 的一片葉子。
- 對於所有連通元件 ti,j,它與所有屬於該連通元件的前一層節點 ti−1,k 都建立一條邊,且權重定義為 T 上面由 ti−1,k 往外連所有邊中權重最小值。
性質 MST.14
上述定義之樹 B 的確是一棵樹,而且每一個內部節點至少有兩個以上的子節點。
性質 MST.14 的證明
由於 T 是連通的,因此其定義出來的樹 B 的確是一棵樹。此外,由於每一次的 Borůvka 步驟,會將每一個連通元件與至少另一個連通元件合併。因此每個 B 上面的第 i 層的內部節點 ti,j 至少有兩個位於第 i−1 層的鄰居。
對於所有葉子深度都相同、並且每個內部節點都有兩個或更多的子節點的樹,我們稱為完滿分叉樹(Full Branching Tree)。這樣的性質保證了建構出來的 B 不會太大。
係理 MST.15 (證明略)
假設輸入之樹 T 節點數有 n 個。那麼樹 B 的節點數不超過 2n−1。
接著我們證明這個定義出來的樹 B 上面關於區間最大值的最重要性質:
引理 MST.16 [1]
對於給定的兩個點 u:=t0,j 以及 v:=t0,k,u 和 v 之間在 T 上路徑 u⇝Tv 的最大邊權,總是等於這兩點在 B 上路徑 u⇝Bv 的最大邊權。
引理 MST.16 的證明
對於每條邊 e 我們用 w(e) 來表達它的權重。首先,我們證明對於任何一條 B 上面路徑的邊 e∈u⇝Bv,都能找得到一條 T 上面路徑的邊 e′∈u⇝Tv 使得 w(e′)≥w(e)。 令 e=(ti−1,x,ti,y),由註標可知,ti−1,x 在 T 上代表的是一個連通元件,而在第 i 次 Borůvka 步驟執行時,ti−1,x 選擇了邊權重為 w(e) 的邊,這條邊是所有 ti−1,x 外連的邊中權重最小者。
此外,由於 e 是 e∈u⇝Bv 的一條邊,這蘊含了 u 與 v 恰有一個點在 ti−1,x 所在的連通元件裡面、另一個點在外面。因此,在 T 的路徑 u⇝Tv 上面存在一條邊 e′ 是從 ti−1,x 跨出去的,從前述對 w(e) 的推論可知此時必定有 w(e′)≥w(e)。
接下來,我們證明在 u⇝Tv 這條路徑中的最重邊 e′=(a,b),其權重值必定出現在 u⇝Bv 上面。不妨假設這個權重 w(e′) 是路徑上唯一的。此時我們宣稱,在某一次 Borůvka 步驟執行時,當 a (或 b) 所在的連通元件 ti,j 選擇了 e′ 這條邊作為外連邊進行合併的時候,該連通元件必定包含 u 或 v 至少一個點。證明如下:若不然,當 a (或 b) 所在的連通元件選擇了 e′ 這條邊作為外連邊進行合併時,u⇝Tv 這條路徑上至少有兩條不同邊跨越 ti,j 這個連通元件。然而,e′ 是比較重的那條,根據 Borůvka 步驟的描述 ti,j 是不可能選擇 e′ 合併的,與 ti,j 挑選 e′ 這個假設矛盾。
另一方面,ti,j 挑選 e′ 合併時,u 或 v 也剛好有一個點不在其中:若不然,代表有另一條路連接 u 到 v,與 T 為一棵樹的假設矛盾。既然 ti,j 挑選 e′ 合併時,u 或 v 恰好有一個點在其中,這代表 (ti,j,ti+1,j′) 這條邊出現在 u⇝Bv 這條路徑上,而且其權重恰好等於 w(e′),得證。
於是乎,任何經過 King's 轉化的樹,任兩點之間的距離都不超過 logn(根據最小共同祖先 LCA 的位置,只要往上爬不超過 ℓ 層再往下走就能走到另一點啦。)因此,上述轉化不只是解決了區間最大值問題,還可以解決樹上路徑最大值問題:
(靜態離線) 樹上路徑最大值問題 Tree Path Maximum
給定一棵有邊權的樹 T,以及一系列預先給定好的詢問 {(ui,vi)}mi=1。對於每一個詢問,請回答 T 上面連接 ui 與 vi 的這條唯一路徑上,所有邊權重的最大值。
定理 MST.17
存在一個 O(n+mlogn) 時間複雜度的演算法,解決樹上路徑最大值問題。
定理 MST.17 的證明
我們可以先花線性時間 O(n) 對 T 跑一次 Borůvka 演算法,並且算出 King's 轉化後的樹 B。對於每一筆詢問 (ui,vi),同時讓 ui 和 vi 在 B 中往上爬,並且記錄中間經過的所有邊權重的最大值。根據引理 MST.16,途中經過得最大值,就會是 T 上面 ui 到 vi 路徑上的最大權重,因此答案是正確的。往上爬所需要的時間是 O(ℓ)=O(logn),因此整體時間複雜度是 O(n+mlogn)。
從幾乎線性到線性
從定理 MST.17 的證明看來,在完滿分叉樹上面解決樹上路徑最大值問題,我們只是很平鋪直敘地應用 King's 轉化,並平鋪直敘地暴力找出每條路徑上的最大邊權。而事實上,我們能夠利用更多的單調性質,並且利用巧妙的位元運算(bit tricks)設計出更快速的演算法!
在下一篇文章中,我們將介紹 Full Branching Tree 上面解決靜態離線樹上路徑最大值問題的 Hagerup 演算法2 與其核心的 Komlós 分析3。
為什麼標題叫做樹分治?
樹分治是一種將形狀偏頗的樹轉化成一棵平衡樹的一類技巧。 根據實際需求,在設計資料結構(和演算法)時不一定要實際將轉化的平衡樹算出來,重點是能將長鏈的部分以對數時間方法走訪即可。 這類技巧包含常見的樹鏈剖分 Heavy-Light Decomposition、啟發式合併(知乎)、輕重樹剖分 DSU on Tree、最平衡樹分治問題 POI 11th Cave。 它們的核心概念是相同的,但是根據題目需求,建構出來的資料結構或演算法也長得不太一樣,今天我們討論的 King's 轉化就是一類樹分治的演算法。
備註
在維多利亞大學(University of Victoria)任職的 Valerie King,於 1995 年發表了一篇驗證最小生成樹的線性時間演算法。該演算法中最重要的一步——也就是 King's 轉化——是將樹上路徑最大值問題(Tree Path Maximum)轉化成完滿分叉樹(Full Branching Tree)上面的路徑最大值問題。
Valerie King, A Simpler Minimum Spanning Tree Verification Algorithm, Algorithmica 1997.
Torben Hagerup, An Even Simpler Linear-Time Algorithm for Verifying Minimum Spanning Tress, WG 2009.
János Komlós, Linear verification for spanning trees, Combinatorica 1985.