並查集是一種樹型的數據結構,用於處理一些不相交集合(Disjoint Sets)的合併及查詢問題。web
Dynamic connectivity:算法
(1)Find query,檢查兩個物體是否在一個單元中。數組
(2)Union command,鏈接2個單元,使得這個單元包含這兩個物體。數據結構
Quick find:id[p] is p的單元id性能
(1)Find:p and q索引的id是否相同。ui
(2)Union:合併p=q,則要合併全部條目的id=id[p],id=id[q]。spa
Quick Union:id[p] is p的i的父節點orm
(1)Find:檢查p和q是否有同一個root。htm
(2)Union:set p的root爲q的root。blog
Improvement:
(1)Weighted Quick-Union。在進行合併的時候,會首先判斷待合併的兩棵樹的大小,即老是size小的樹做爲子樹和size大的樹進行合併。這樣就可以儘可能的保持整棵樹的平衡。
(2)Weighted Quick-Union With Path Compression。在find方法的執行過程當中,不是須要進行一個while循環找到根節點嘛?若是保存全部路過的中間節點到一個數組中,而後在while循環結束以後,將這些中間節點的父節點指向根節點,不就好了麼?可是這個方法也有問題,由於find操做的頻繁性,會形成頻繁生成中間節點數組,相應的分配銷燬的時間天然就上升了。那麼有沒有更好的方法呢?仍是有的,即將節點的父節點指向該節點的爺爺節點,這一點很巧妙,十分方便且有效,至關於在尋找根節點的同時,對路徑進行了壓縮,使整個樹結構扁平化。
算法性能:
對於Quick-Union算法而言,節點組織的理想狀況應該是一顆十分扁平的樹,全部的孩子節點應該都在height爲1的地方,即全部的孩子都直接鏈接到根節點。這樣的組織結構可以保證find操做的最高效率。
動態連通性相關的Union-Find算法基本上就介紹完了,從容易想到的Quick-Find到相對複雜可是更加高效的Quick-Union,而後到對Quick-Union的幾項改進,讓咱們的算法的效率不斷的提升。這幾種算法的時間複雜度以下所示:
Algorithm |
Constructor |
Union |
Find |
Quick-Find |
N |
N |
1 |
Quick-Union |
N |
Tree height |
Tree height |
Weighted Quick-Union |
N |
lgN |
lgN |
Weighted Quick-Union With Path Compression |
N |
Very near to 1 (amortized) |
Very near to 1 (amortized) |