不相交集ADT

2021-06-21 03:30:10 字數 1337 閱讀 8301

1.不相交集是解決等價關係的一種資料結構,執行合併和查詢的速度都非常快,m次執行合併和查詢的執行時間為(m*logn)。

在乙個集合中,對於每一對元素(a,b),a,b∈s,對於關係r如果滿足下面三個條件,則成關係r為等價關係:

(1)自反性  對於所有a∈s,ara

(2)對稱性   arb當且僅當bra

(3)傳遞性   若arb且brc,則arc

2.不相交集

adt支援三種操作:

union操作:把兩個集合合併

find操作:查詢某個元素所在集合的名字,兩個元素x,y在同乙個集合中的充要條件是find(x)和find(y)返回的結果相同。

set操作:生成若干個集合

不相交集的初始操作**為:

void init(int a)

3.不相交集的合併操作可以分為按大小合併和按高度合併。按照大小的合併,即把較小的集合合併到較大的集合中,這需要我們記錄每個集合的大小。按大小合併的**為:

void unionset(int a,int root1,int root2)

else

}

按照高度的合併是把高度較小的集合合併到高度較大的集合中,只有兩個集合的高度相同是,集合的高度才會更新,這需要我們記錄集合的高度,按照高度合併的**為:

void unionset(int s,int root1,int root2)

還有一種更為簡便的查詢方法,帶有路徑壓縮的查詢,路徑壓縮的效果是,從x到根的路徑上的每乙個結點都使它的父結點變成根。如查詢5時對下面的圖1集合進行路徑壓縮,壓縮後的集合變為圖2

帶有路徑壓縮的find操作**為:

int find(int s,int x)

下面是不相交集合的c語言實現:

# include using namespace std;

# include int main()

{ void create(int a,int n);

int find(int a,int x);

void unionset(int a,int root1,int root2);

int a[10];

create(a,10);

unionset(a,1,2);

unionset(a,2,3);

unionset(a,4,5);

cout<

不相交集ADT

首先我們必須明白不相交集這種資料結構是用來幹什麼的。不相交即主要用來實現動態等價問題的求解。動態 等價問題 這裡不再說明等價關係的概念,這個可以參考數理邏輯之類的書。假設我們有乙個集合和乙個等價關係 針對集合中的任意兩個元素 a 和 b,我們如何確定他們有等價關係 即a b.那麼我們需要等價類的概念...

資料結構 不相交集ADT

若對於每一對元素 a,b a b屬於s,arb或者為true或者為false,則稱在集合s上定義關係r。如果arb是true,那麼我們說a與b有關係。等價關係是滿足下列三個性質的關係r 自反性 對於所有的a屬於s,ara 對稱性 arb當且僅當bra 傳遞性 若arb且brc,則arc 乙個元素a屬...

並查集(不相交集)ADT

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