演算法熟記 並查集

2021-07-25 06:20:58 字數 811 閱讀 6794

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,這三類動物的食物鏈...