演算法 並查集

2021-10-07 16:11:26 字數 2327 閱讀 1000

用於解決動態連通性問題,能動態連線兩個點,並且判斷兩個點是否連通。

方法描述

uf(int n)

構造乙個大小為 n 的並查集

void union(int p, int q)

連線 p 和 q 節點

int find(int p)

查詢 p 所在的連通分量編號

boolean connected(int p, int q)

判斷 p 和 q 節點是否連通

public

abstract

classuf}

public

boolean

connected

(int p,

int q)

public

abstract

intfind

(int p)

;public

abstract

void

union

(int p,

int q)

;}

可以快速進行 find 操作,也就是可以快速判斷兩個節點是否連通。

需要保證同一連通分量的所有節點的 id 值相等。

但是 union 操作代價卻很高,需要將其中乙個連通分量中的所有節點 id 值都修改為另乙個節點的 id 值。

}}可以快速進行 union 操作,只需要修改乙個節點的 id 值即可。

但是 find 操作開銷很大,因為同乙個連通分量的節點 id 值不同,id 值只是用來指向另乙個節點。因此需要一直向上查詢操作,直到找到最上層的節點。

public

class

quickunionuf

extends

uf@override

public

intfind

(int p)

return p;

}@override

public

void

union

(int p,

int q)

}}

這種方法可以快速進行 union 操作,但是 find 操作和樹高成正比,最壞的情況下樹的高度為節點的數目。

為了解決 quick-union 的樹通常會很高的問題,加權 quick-union 在 union 操作時會讓較小的樹連線較大的樹上面。

理論研究證明,加權 quick-union 演算法構造的樹深度最多不超過 logn。

}}在檢查節點的同時將它們直接鏈結到根節點,只需要在 find 中新增乙個迴圈即可。

演算法union

find

quick findn1

quick union

樹高樹高

加權 quick union

logn

logn

路徑壓縮的加權 quick union

非常接近 1

非常接近 1

並查集演算法

所謂並查集,它是乙個集合,這個集合的元素也是集合,他支援三種操作 makeset x 建立乙個只有乙個元素x的集合x0,將這個集合放入並查集中 findset x 在並查集中尋找乙個元素s 注意並查集的元素s也是集合 滿足 x屬於s union x,y 將並查集中的元素s1,s2合併,其中x屬於s1...

並查集演算法

並查集是一種樹型的資料結構,用於處理一些不相交集合 disjoint sets 的合併及查詢問題。常常在使用中以森林來表示。讓每個元素構成乙個單元素的集合,也就是按一定順序將屬於同一組的元素所在的集合合併。1 makeset s 建立乙個新的並查集,包含s個單元素集合。2 union x,y 把x ...

並查集演算法

includeint pre 10 int find int x 查詢祖先節點 int i x,j while i r 壓縮路徑 return r void join int x,int y int main 2 食物鏈問題 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈...