概念:
並查集是一種簡單的集合表示,它支援一下三種操作:
1)union(s, root1, root2):
把集合s中的子集合root2併入集合root1中。要求root1和root2互不相交,否則不執行合併。
2)find(s, x):
查詢集合s中單元素x所在的子集合,並返回該子集合的名字。
3)inital(s):將集合s中的每乙個元素都初始為只有乙個單元的子集合。
通常用樹(森林)的雙親表示作為並查集的儲存結構,每個子集合以一棵樹表示。所有表示子集合的樹構成森林,
存放在雙親表示陣列內,通常用陣列元素的下表代表元素名,根結點的下標代表子集合名,根結點的雙親位負數。
例如,若設有乙個全集合為s = ,初始化時每個元素自成乙個單元子集合,每個子集合的陣列值是 -1
經過一段時間的計算,這些子集合合併成三個更大的子集合
s1 =
s2 =
s3 =
此時並查集的樹形表示和儲存結構如下所示。
資料結構之樹(並查集)
0,2,4,6,8的標籤為0。1,3,5,7,9的標籤為1。標籤為0和1表示兩個不同的集合。查詢元素p所對應的集合編號,o 1 複雜度 private intfind int p 檢視元素p和元素q是否所屬乙個集合,o 1 複雜度 public boolean isconnected int p,i...
資料結構之並查集
並查集 union find sets 是一種簡單的用途廣泛的集合.並查集是若干個不相交集合,能夠實現較快的合併和判斷元素所在集合的操作,應用很多,如其求無向圖的連通分量個數 最小公共祖先 帶限制的作業排序,還有最完美的應用 實現kruskar演算法求最小生成樹。其實,這一部分 演算法導論 講的很精...
資料結構之並查集
覺得很不錯的參考資料引用一下 陣列實現 合併操作代價高,可達o n 2 鍊錶實現 樹結構實現 查詢與合併的平均時間複雜度為o log 2 n 與樹的深度有關,優化 降低時間複雜度 按秩合併 若h b h b,則將b樹作為a樹的子樹。帶路徑壓縮的查詢演算法 改變結點所指方向以減小深度,查詢路徑時 走兩...