路徑壓縮優化並查集的時間復雜度


路徑壓縮優化並查集大家一定很熟練了,那么它的復雜度是多少呢? O ( m α ( n ) ) O(m\alpha(n))

的確,很多人都是這么說的,但是事實上它的復雜度是 O ( m log 1 + m / n n ) O(m\log_{1+m/n}n) 的,並且能找到一種方法卡到這樣的復雜度。

要卡並查集,首先要構造一種樹——二項樹。這種二項樹還與普通的不太一樣。

定義:在給定 j j 的情況下,二項樹 T k T_k 定義如下:

  • k j k\leq j T k T_k 是一個點。
  • k > j k>j T k T_k T k 1 T_{k-1} 的根結點增加一棵 T k j T_{k-j} 的子樹。

img

這棵樹非常有意思,我們可以展開 T k j T_{k-j} ,接着展開 T k 2 j T_{k-2j} ……

另外,也可以展開 T k 1 T_{k-1} ,接着展開 T k 2 T_{k-2} ……

img

容易發現,圖5看起來像圖4的路徑壓縮之后的結果,但是不完全一樣。

如果首先按照圖5的方式展開 j j 棵子樹,再按圖4展開,可以得到

img

此時,如果在根節點上再加一個點, j j 次訪問 T 1 T_1 T j T_j ,那么路徑壓縮后可以得到圖5外加一個點作為根的兒子。

也就是說,這棵二項樹路徑壓縮后約等於沒有路徑壓縮……只是將原來作為根結點父親的那個點變成了兒子。

至於 T k T_k 的點數,通過數學歸納法可以發現不會超過 ( j + 1 ) k / j 1 (j+1)^{k/j-1} 個。

假設 m n m\geq n ,令 j = m n , i = log j + 1 n 2 + 1 , k = i j j=\frac{m}{n},i=\log_{j+1}\frac{n}{2}+1,k=ij ,那么 T k T_k 的點數不超過 n 2 \frac{n}{2} 。接下來做 n 2 \frac{n}{2} 組操作,每次加入一個點作為根結點的父親,然后對 T 1 T_1 T j T_j 逐個查詢,每次查詢的長度是 i + 1 i+1 ,同時查詢的次數顯然不超過 m m 。因此總操作次數為 n 2 j ( i + 1 ) \frac{n}{2}j(i+1) ,即 O ( m log 1 + m / n n ) O(m\log_{1+m/n}n)

圖片取自康復計划#4 快速構造支配樹的Lengauer-Tarjan算法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM