不相交集合的資料結構 並查集

2021-08-10 08:08:44 字數 1550 閱讀 7526

在介紹操作之前,我得先說說實現這些操作的背景。對於並查集中的每乙個集合,都有乙個代表,這個代表就是集合中的乙個元素,其表示了整個集合。打個比喻吧,最近召開了19大,各個代表都召集到了人民大會堂,假設每個代表都代表著某個省份的人去參加會議,比如我是江西的,江西省的人大代表就代表了江西人民參加會議進行投票,這個代表就代表了整個江西人民這個集合。知道代表這個概念,就可以聊聊並查集的操作了。

為了更好的分析演算法時間複雜度,我們不妨設n為make-set操作的次數,m為make-set(x)、union(x,y)、find-set(x)操作次數的總和。

下面簡述一下並查集的乙個簡單應用:確定無向圖中連通分量

如下所示;

由上可知,集合中包含了各個節點,通過邊(u,v)將兩個集合進行合併。

簡單的來說,按秩合併就是在兩個集合合併的時候會出現乙個矛盾,兩個集合都有乙個代表,那麼誰來當這個新集合的代表呢??前面的方式是第乙個集合的代表作為新集合的代表,這樣顯然是不合符情理的,所以按秩合併就是,哪顆樹的深度越高,樹的根節點就作為新樹的根節點。換句話說就是哪邊元素多,哪邊的代表就作為新的代表,這樣才是我們想要的。

這種方法的意思就是,在樹的結構中,通過元素x來查詢根節點肯定會產生乙個查詢分支,新樹合併後,這個分支的每個節點都指向根節點。

上圖總a就是我們查詢根節點的元素,分支最後都指向更接點。

make_set(x)     //構建乙個新集合

x.p=x

x.rank=0

unino(x,y) //合併兩個集合

link(find-set(x),find-set(y)) //利用根節點將兩個集合合併

link(x,y)

if x.rank>y.rank //如果x樹的深度大於y樹的深度

y.p=x //x作為根節點

else

x.p=y //如果x樹的深度小於等於y的深度,y作為根節點

if(x.rank==y.rank) //如果深度相同時,深度加1

y.rank=y.rank+1

find-set //找到根節點

if x!=x.p

//注意這裡會實現路徑壓縮的功能,你按照程式迭代一次就會發現了,這裡的偽**寫的也是666

x.p=find-set(x.p)

return x.p

上述偽**,我就不再多加解釋了,注釋寫的很清楚了。我只想分析一下改進後演算法的時間複雜度:如果單獨採用路徑壓縮或者按秩合併,都不能直接改變演算法的效能。但是兩個結合起來,效果就很明顯了。如果單獨使用按秩合併,時間複雜度為o(mlgn),如果單獨使用路徑壓縮,時間複雜度為

並查集(不相交集合)

早上早早起來看kruscal的mst演算法,原來要用到不相交集合來實現。拿起 演算法導論 看完不相交集合這章,頓然茅塞頓開,終於完成並查集的基礎知識的學習。演算法導論 真是牛 不相交集合有兩種不同的實現,鍊錶表示和帶路徑壓縮的按秩合併策略。看到大家都比較喜歡用帶路徑壓縮的按秩合併策略,那麼我只認真研...

用於不相交集合的資料結構(並查集)

一,兩個重要操作 1 找出給定元素所屬的集合 2 合併兩個集合 二,原理 保持一組不相交的動態集合s 每個集合通過乙個代表來識別,代表即集合中的某個元素 三,操作 1 make set x 建立乙個新的集合,其唯一成員就是x 因各集合是不相交的,故要求x沒有在其他集合 現過 2 union x,y ...

資料結構 9 並查集(不相交集)

並查集 disjoint sets 直譯即不相交集。離散數學中對等價關係的定義 滿足自反性 對稱性和傳遞性的關係。集合a,a,b a,b a,滿足arb,則稱r為a上的關係,若r滿足以上三種性質,則為等價關係。數學上的定義不必過多解釋,只需知道,等價關係是用來對集合中的元素分類,以達到簡化問題的目的...