所謂並查集,就是一種用來管理元素分組情況的資料結構。並查集一共有兩種操作:
第一種操作:查詢元素a和元素b是否屬於同一組
第二種操作:合併元素a和元素b所在的組
正是因為剛好有這兩種操作,所以這種資料結構叫做並查集。並查集也是使用資料結構實現的,不過不是二叉樹。
對於並查集來說,哪個結點是哪個結點的父親,以及樹的形狀等資訊無需關注,整體形成乙個樹形結構才是最重要的。
並查集之所以高效的原因,是因為我們在必要的時候使用了路徑壓縮。也就是說,對於每個節點,一旦向上查詢到了一次根節點,我們就把這個節點到父親的邊直接連向根節點,這樣可以避免樹的高度太高。
對於並查集的實現,通常有幾個函式。下面我們依次介紹:
1、初始化
初始化的功能是根據輸入確定結點個數,並將所有結點的父節點初始化為自己,所有結點的高度設定為0。
**如下:
void init(int x)
執行了這個函式的操作之後,我們就建立了n個零散的結點。
2、查詢
查詢函式的功能是查詢當前結點的根節點,寫法有兩種,一種是進行路徑壓縮的,一種是沒有進行路徑壓縮的,根據題意而定。
未路徑壓縮**:
int find(int x)
路徑壓縮**:
int find(int x)
用一張圖來解釋一下路徑壓縮
根據find函式,我們可以得到7的根節點為6,如果進行路徑壓縮的話,pre[7]就會被修改為6,也就是7將直接連線到根節點,而不是連線到父節點4上。
3、合併
合併函式的功能是將兩個集合合併為乙個集合,但是需要判斷兩個集合的高度,把高度較低的集合合併到高度較高的集合中。
**:
void union(int x,int y)
{ x=find(x);
y=find(y);
if(x==y)
return ;
if(t[x]
推薦大家看一下挑戰程式設計競賽的並查集講解~
並查集及種類並查集
b站 並查集int find root int x return x int hebing int x,int y return0 檢驗 include using namespace std const int n 100 const int m 200 int parent n deep n i...
並查集的實現及優化
並查集是一種用於在森林中判斷子圖數量及點的歸屬的資料結構,由於其特殊的路徑壓縮操作,使得這一過程可以異常地快。並查集主要由乙個pre陣列以及兩個函式組成 find函式和join函式。pre陣列表示每一節點的前驅,最終已完成的並查集,每乙個子圖的所有點只有乙個前驅 這也是其高效的原因 而初始化的並查集...
並查集的簡單介紹
前幾天想把並查集這個結構搞清楚,但一直沒有動筆寫。因為要有輸出,印象才會更深刻些。這裡只是非常簡單的記錄一下。並查集,顧名思義,最主要的2大功能就是並 合併 查 查詢 合併 將2個不在同乙個集合內的元素所在的集合合併在同乙個集合。查詢 看看2個元素是否在 同乙個集合內。但是在 新建乙個這個結構的時候...