資料結構與演算法之並查集

2021-09-01 18:24:57 字數 943 閱讀 7502

並查集(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演算法求最小生成樹。其實,這一部分 演算法導論 講的很精...