用於解決動態連通性問題,能動態連線兩個點,並且判斷兩個點是否連通。
方法描述
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,這三類動物的食物鏈...