並查集(union-find)是一種高效的資料結構,主要的操作有:
為方便敘述,把所有元素視作點,元素之間的關係視作線,存在聯絡便存在關係(需要注意的是,這裡的關係應當是1.自反的,2.對稱的,3.傳遞的)
所謂合併,便是將兩個點之間「畫」一條線。 又上邊的定義不難理解相連的若干點之間互相存在關係,這樣我們便可以吧相連的若干點看做乙個**「等價類」或「連通分支」**
合併主要的流程為:
我們採用線性的資料結構:陣列,來表示並查集:
路徑壓縮即為,將所有節點的前驅節點改為連通分支的根節點
這樣在尋找節點的根節點時耗時更少。
使用路徑壓縮,和優化後的合併方法的並查集演算法已經是理論上的最優演算法。
附上leetcode547題的題解:
class
solution
}// 得到朋友圈數量
int count = uf.
count()
;return count;}}
// union-find class
class
uf// 查詢點p的根節點
public
intfind
(int p)
// 判斷p,q是否連線
public
boolean
connected
(int p,
int q)
// 得到連通分支數
public
intcount()
// 合併連通分支
public
void
union
(int p,
int q)
else
}// 合併後連通分支數減一
count--;}
}
資料結構與演算法之並查集
並查集結構可以用於 1 檢查兩個元素是否屬於同乙個集合 比如對於圖1這個例子來說,如果我們想要檢查節點d和節點e是否屬於同乙個集合,可以這樣操作 d節點往上找其父節點,一直往上找,直到某個節點的父節點是其本身,此時停止 找到了節點a e節點也按照相同的步驟往上找其父節點,找到節點a 如果這兩個節點往...
演算法基礎之資料結構 並查集
題目 合併計算 一共有 n 個數,編號是 1 n,最開始每個數各自在乙個集合中。現在要進行 m 個操作,操作共有兩種 m a b,將編號為 a 和 b 的兩個數所在的集合合併,如果兩個數已經在同乙個集合中,則忽略這個操作 q a b,詢問編號為 a 和 b 的兩個數是否在同乙個集合中 輸入格式 第一...
資料結構之並查集
並查集 union find sets 是一種簡單的用途廣泛的集合.並查集是若干個不相交集合,能夠實現較快的合併和判斷元素所在集合的操作,應用很多,如其求無向圖的連通分量個數 最小公共祖先 帶限制的作業排序,還有最完美的應用 實現kruskar演算法求最小生成樹。其實,這一部分 演算法導論 講的很精...