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個元素 元素也是乙個集合 的集合,其中每個集合只含有乙個元素,且互不相同,也不存在等價關係,使得這些集合互不相交,此時只能進行兩...