資料結構之並查集
發表於:四月 13, 2012 分類:資料結構與演算法 標籤:資料結構, 演算法, 並查集
1、 概述
並查集(disjoint set或者union-find set)是一種樹型的資料結構,常用於處理一些不相交集合(disjoint sets)的合併及查詢問題。
2、 基本操作
並查集是一種非常簡單的資料結構,它主要涉及兩個基本操作,分別為:
a. 合併兩個不相交集合
b. 判斷兩個元素是否屬於同乙個集合
(1) 合併兩個不相交集合(union(x,y))
合併操作很簡單:先設定乙個陣列father[x],表示x的「父親」的編號。那麼,合併兩個不相交集合的方法就是,找到其中乙個集合最久遠的祖先(根節點),將另外乙個集合的最久遠的祖先的父親指向它。
上圖為兩個不相交集合,b圖為合併後father(b):=father(g)
(2) 判斷兩個元素是否屬於同一集合(find_set(x))
本操作可轉換為尋找兩個元素的最久遠祖先是否相同。可以採用遞迴實現。
3、 優化
(1) find_set(x)時,路徑壓縮
尋找祖先時,我們一般採用遞迴查詢,但是當元素很多亦或是整棵樹變為一條鏈時,每次find_set(x)都是o(n)的複雜度。為了避免這種情況,我們需對路徑進行壓縮,即當我們經過」遞推」找到祖先節點後,」回溯」的時候順便將它的子孫節點都直接指向祖先,這樣以後再次find_set(x)時複雜度就變成o(1)了,如下圖所示。可見,路徑壓縮方便了以後的查詢。
(2) union(x,y)時,按秩合併
即合併的時候將元素少的集合合併到元素多的集合中,這樣合併之後樹的高度會相對較小。
4、 程式設計實現
5、 複雜度分析int father[max]
;/* father[x]表示x的父節點 */
int rank[max]
;/* rank[x]表示x的秩 */
/* 初始化集合 */
void
make_set
(int x)
/* 查詢x元素所在的集合,回溯時壓縮路徑 */
intfind_set
(int x)
return father[x];}
/* 按秩合併x和y所在的集合
下面的那個if else結構不是絕對的,具體根據情況變化
但是,宗旨是不變的即,按秩合併,實時更新秩。
*/void
union
(int x,
int y)
else
father[x]
= y;
}}
空間複雜度為o(n),建立乙個集合的時間複雜度為o(1),n次合併m查詢的時間複雜度為o(m alpha(n)),這裡alpha是ackerman函式的某個反函式,在很大的範圍內(人類目前觀測到的宇宙範圍估算有10的80次方個原子,這小於前面所說的範圍)這個函式的值可以看成是不大於4的,所以並查集的操作可以看作是線性的。具體複雜度分析過程見參考資料(3)。
6、 應用
並查集常作為另一種複雜的資料結構或者演算法的儲存結構。常見的應用有:求無向圖的連通分量個數,最近公共祖先(lca),帶限制的作業排序,實現kruskar演算法求最小生成樹等。
7、 參考資料
(1) 並查集:
(2) 博文《並查集詳解》:
(3) thomas h. cormen, charles e. leiserson, ronald l. rivest, and clifford stein. introduction to algorithms, second edition. mit press and mcgraw-hill, 2001. isbn 0-262-03293-7. chapter 21: data structures for disjoint sets, pp. 498–524.
資料結構之並查集
並查集 union find sets 是一種簡單的用途廣泛的集合.並查集是若干個不相交集合,能夠實現較快的合併和判斷元素所在集合的操作,應用很多,如其求無向圖的連通分量個數 最小公共祖先 帶限制的作業排序,還有最完美的應用 實現kruskar演算法求最小生成樹。其實,這一部分 演算法導論 講的很精...
資料結構之並查集
覺得很不錯的參考資料引用一下 陣列實現 合併操作代價高,可達o n 2 鍊錶實現 樹結構實現 查詢與合併的平均時間複雜度為o log 2 n 與樹的深度有關,優化 降低時間複雜度 按秩合併 若h b h b,則將b樹作為a樹的子樹。帶路徑壓縮的查詢演算法 改變結點所指方向以減小深度,查詢路徑時 走兩...
資料結構之並查集
1.將兩個集合合併。2.詢問兩個元素是否在乙個集合當中。複雜度近乎o 1 基本原理 每個集合用一棵樹來表示。樹根的編號就是整個集合的編號。每個節點儲存它的父節點,p x 表示x的父節點。問題1 如何判斷樹根 if p x x 問題2 如何求x的集合編號 while p x x x p x 問題3 如...