1. 簡述
並查集是一種樹型的資料結構,用於處理一些不相交集合(disjoint sets)的合併及查詢問題。常常在使用中以森林來表示。
需要實現的操作有:合併兩個集合,判斷兩個元素是否屬於乙個集合。
這裡介紹的主要是普通的並查集,很多情況下使用的並查集是需要擴充套件的,根據使用情況的不同,有很多差別,這裡僅僅是最基本的演算法。
2. 複雜度
t=o(n*α(n)) , 其中α(x),對於x=宇宙中原子數之和,α(x)不大於4。事實上,路經壓縮後的並查集的複雜度是乙個很小的常數。
3. 偽**
沒有使用路徑壓縮和啟發式的方法。
//初始化並查集
#define n 100
int father[n];
void init()
//合併兩個元素所在的集合
void
union(
intx,
inty)
//判斷兩個元素是否屬於同乙個集合
bool
same(
intx,
inty)
//獲取根結點
intgetfather(
intx)
使用路徑壓縮,改進getfather。
//獲取根結點
intgetfather(
intx)
另外,還可以改進union,把數量少的集合合併到數量大的集合中,不過這就要記錄每個集合中的元素數量,相當於增加了o(n)的儲存空間,而且在getfather中也應該保持對元素數量的維護,相對**複雜度偏高,而且感覺效能提公升不多,這裡就不寫了。
並查集演算法
所謂並查集,它是乙個集合,這個集合的元素也是集合,他支援三種操作 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,這三類動物的食物鏈...