早上早早起來看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大,各個代表都召集到了人民大會堂,假設每個代表都代表著某個省份的人去參加會議,比如我是江西的,江西省的人大代表就代表了江西人民參加會議進行投...