並查集實現(c )

2021-08-28 11:47:46 字數 1090 閱讀 4935

1.何為並查集?並查集是一種樹型的資料結構,用於處理一些不相交集合的合併及查詢問題,簡單的說就是對集合操作的一種資料結構。

2.做什麼用:考慮這樣乙個問題—— 若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。 規定:x和y是親戚,y和z是親戚,那麼x和z也是親戚。如果x,y是親戚,那麼x的親戚都是y的親戚,y的親戚也都是x的親戚。乙個家族可以看做乙個集合,所以這裡有兩個集合,需要判斷其中的兩個成員是否在乙個集合內。

3.並查集的實現: 顧名思義  並查集需要幹的事情就是合併查詢,  合併就是將兩個不相關的集合相關聯,查詢就是查成員的所在集合。因此實現上  就是兩個函式 乙個find()   乙個 join(),   下面先看**:

// 並查集

#ifndef _unitfindset_h_

#define _unitfindset_h_

#define max_num 1024

class unitefindset

;unitefindset::unitefindset(int num)

int unitefindset::find(int root)

while(son != root) //路徑壓縮優化,

return root;

}void unitefindset::join(int root1, int root2)

bool unitefindset::isconnect(int root1, int root2)

#endif

不難看出,核心的**就是find() 函式, 在unitefindset裡,有乙個 陣列par,  它存放的是父節點資訊,例如i的父節點就是 par[i],find 函式做的事情就是 找到屬於自己的 「老大」,即根節點。

路徑壓縮,則是 為了後續查詢方便,因為當資料量很大的時候,頻繁的向上查詢根節點時影響效能,因此當做完一次find

時,將根節點下的所有子節點  直接連在根節點上面。

C 實現並查集

將n個不同的元素分成一組不相交的集合。開始時,每個元素就是乙個集合,然後按規律將兩個集合進行合併。假如已知有n個人和m對好友關係 存於陣列r 如果兩個人是直接的或間接的好友關係 好友的好友的好友.則認為他們屬於同一好友圈,請求出這n個人中有幾個好友圈。例如 n 5,m 3,r 表示有5個人,1和2是...

C 並查集 森林實現

使用森林儲存集合之間的關係,屬於同一集合的不同元素,都有乙個相同的根節點,代表著這個集合。當進行查詢某元素屬於哪個集合時,即遍歷該元素到根節點,返回根節點所代表的集合 遍歷過程中使用路徑壓縮的優化演算法,使整體樹的形狀更加扁平,從而優化查詢的時間複雜度。當進行合併時,即將兩顆子樹合併為一棵樹,將一棵...

並查集 並查集

本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...