資料結構之樹(並查集)

2021-10-10 03:03:37 字數 2390 閱讀 4047

0,2,4,6,8的標籤為0。

1,3,5,7,9的標籤為1。

標籤為0和1表示兩個不同的集合。

查詢元素p所對應的集合編號,o(1)複雜度

private

intfind

(int p)

檢視元素p和元素q是否所屬乙個集合,o(1)複雜度

public

boolean

isconnected

(int p,

int q)

合併元素p和元素q所屬的集合,o(n) 複雜度

public

void

unionelements

(int p,

int q)

總結:find時間複雜度o(1),union時間複雜度o(n)。

初始化, 每乙個parent[i]指向自己, 表示每乙個元素自己自成乙個集合

for

(int i =

0; i < size ; i ++

) parent[i]

= i;

查詢過程, 查詢元素p所對應的集合編號,o(h)複雜度, h為樹的高度

private

intfind

(int p)

檢視元素p和元素q是否所屬乙個集合,o(h)複雜度, h為樹的高度

public

boolean

isconnected

(int p ,

int q )

合併元素p和元素q所屬的集合,o(h)複雜度, h為樹的高度

public

void

unionelements

(int p,

int q)

總結:find時間複雜度o(h),union時間複雜度o(h)。

缺點:整個樹可能退化成陣列鍊錶。

初始化, 每乙個parent[i]指向自己, 表示每乙個元素自己自成乙個集合,sz[i]表示以i為根的集合中元素個數。

for

(int i =

0; i < size ; i ++

)

o(h)複雜度, h為樹的高度

public

void

unionelements

(int p,

int q)

else

}

總結:find時間複雜度o(h),union時間複雜度o(h)。

缺點:如下圖,以8為根的節點有3個,以7為根的節點有6個,合併後如圖二所示,樹的深度會增加。

初始化, rank[i]表示以i為根的集合所表示的樹的層數。

for

(int i =

0; i < size ; i ++

)

合併元素p和元素q所屬的集合,o(h)複雜度,h為樹的高度。

public

void

unionelements

(int p,

int q)

}

就是使樹的深度變小。使節點指向父節點的父節點。

查詢過程中,就進行路徑壓縮。

private

intfind

(int p)

return p;

}

使用遞迴使所有節點都指向根節點。

private

intfind

(int p)

資料結構之並查集

並查集 union find sets 是一種簡單的用途廣泛的集合.並查集是若干個不相交集合,能夠實現較快的合併和判斷元素所在集合的操作,應用很多,如其求無向圖的連通分量個數 最小公共祖先 帶限制的作業排序,還有最完美的應用 實現kruskar演算法求最小生成樹。其實,這一部分 演算法導論 講的很精...

資料結構之並查集

覺得很不錯的參考資料引用一下 陣列實現 合併操作代價高,可達o n 2 鍊錶實現 樹結構實現 查詢與合併的平均時間複雜度為o log 2 n 與樹的深度有關,優化 降低時間複雜度 按秩合併 若h b h b,則將b樹作為a樹的子樹。帶路徑壓縮的查詢演算法 改變結點所指方向以減小深度,查詢路徑時 走兩...

資料結構之並查集

1.將兩個集合合併。2.詢問兩個元素是否在乙個集合當中。複雜度近乎o 1 基本原理 每個集合用一棵樹來表示。樹根的編號就是整個集合的編號。每個節點儲存它的父節點,p x 表示x的父節點。問題1 如何判斷樹根 if p x x 問題2 如何求x的集合編號 while p x x x p x 問題3 如...