並查集(不相交集合)

2021-06-25 10:55:51 字數 1063 閱讀 1585

早上早早起來看kruscal的mst演算法,原來要用到不相交集合來實現。拿起《演算法導論》看完不相交集合這章,頓然茅塞頓開,終於完成並查集的基礎知識的學習。《演算法導論》真是牛××

不相交集合有兩種不同的實現,鍊錶表示和帶路徑壓縮的按秩合併策略。看到大家都比較喜歡用帶路徑壓縮的按秩合併策略,那麼我只認真研究了一下帶路徑壓縮的按秩合併策略,暫時不對鍊錶表示作討論。

顧名思義,並查集的作用不就的「並」和「查」嘛。並查集的功能描述為:合併兩個集合;將一元素併入另一集體;判斷兩個元素是否屬於同乙個集合。

通過引用兩種啟發式策略(按秩合併和路徑壓縮)就可以達到漸進意義上最快的不相交集合資料結構。 

1、make_set(x) 把每乙個元素初始化為乙個集合

建立乙個新的集合,其中集合只有唯一的乙個元素x

2、union_set(x, y) 

按秩合併x,y所在的集合

3、find_set(x)返回x所在的集合的代表 

在執行查詢操作時,要沿著父節點指標一直找下去,直到找到樹根為止。大家要注意途中的箭頭。 

4、實現並查集的標準**: 

1#include 

<

stdio.h

>23

const

intmaxn 

=100

; /*

結點數目上線*/4

intpa[maxn];    

/*p[x]表示x的父節點*/5

intrank[maxn];    

/*rank[x]是x的高度的乙個上界*/6

7void

make_set(

intx)812

13int

find_set(

intx)

1419

20/*

按秩合併x,y所在的集合

*/21

void

union_set(

intx, 

inty)

2233}

並查集(不相交集)ADT

等價關係 需要同時滿足下列三個性質的關係r 等價集合 如果乙個元素a 屬於集合s,則元素a的等價集合是集合s的乙個子集,它包含所有與元素a有等價關係的元素。輸入資料最初是n個元素 元素也是乙個集合 的集合,其中每個集合只含有乙個元素,且互不相同,也不存在等價關係,使得這些集合互不相交,此時只能進行兩...

用於不相交集合的資料操作 並查集

假定有一組詞彙,其中有一些詞是同義詞,可以把意思不同的詞分別放到不同的集合中,構成一組不相交的集合,每個集合內部都是同義詞。最開始我們不知到哪些詞可以歸併到相同的組中,因此開始的時候它們每個詞為一組。然後我們再一一給出哪些詞是同義詞,據此將初始的組進行合併 直到最後同義詞都被合併到各自應該歸屬的組裡...

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

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