資料結構 不相交集ADT

2021-07-17 01:51:33 字數 1131 閱讀 9713

若對於每一對元素(a,b),a、b屬於s,arb或者為true或者為false,則稱在集合s上定義關係r。如果arb是true,那麼我們說a與b有關係。

等價關係是滿足下列三個性質的關係r:

自反性:對於所有的a屬於s,ara;

對稱性:arb當且僅當bra;

傳遞性:若arb且brc,則arc; 』

乙個元素a屬於s的等價類是s的乙個子集,它包含所有與a有關的元素。

所以,不相交集實質上就是各個等價類組成的集合。

不相交集允許的運算:find和union。

find:返回包含給定元素的集合(即等價類)的名字;

union:新增關係arb,若a、b不在同乙個等價類中,則使用union把a、b合成乙個等價類。

不相交集的型別宣告:

#include#define numsets 1000

typedef int disjset[numsets+1];

typedef int settype;

typedef int elementtype;

void initialize(disjset s)

不相交集運算的實現:

void setunion(disjset s, settype root1, settype root2)

settype find(elementtype x, disjset s)

下面是對演算法的改進:

靈活求並的演算法:

分為按高度和按大小求並。

按高度求並:

void setunion(disjset s, settype root1, settype root2)

}

基於路徑壓縮的find演算法:

路徑壓縮只在find操作執行期間執行,與union操作無關。路徑壓縮的效果為:從結點x到根的路徑上的每乙個結點,都使它的父節點變為根。由此對這些結點未來的快速訪問將由於花費額外的工作來進行路徑壓縮而得到補償。

settype find(elementtype x, disjset s)

不相交集ADT

1.不相交集是解決等價關係的一種資料結構,執行合併和查詢的速度都非常快,m次執行合併和查詢的執行時間為 m logn 在乙個集合中,對於每一對元素 a,b a,b s,對於關係r如果滿足下面三個條件,則成關係r為等價關係 1 自反性 對於所有a s,ara 2 對稱性 arb當且僅當bra 3 傳遞...

不相交集ADT

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

不相交集資料結構

用乙個1x3的陣列來儲存每個數的數 其父親 秩。首先尋找合併的兩個樹的根的根,然後按照秩的大小將兩個樹進行合併。尋找兩個數的根時,順便壓縮其與根的距離 include define max 100 int find int a 3 int n void rootunion int a 3 int m...