資料結構與演算法 2 並查集

2021-10-03 16:59:14 字數 1089 閱讀 7490

並查集被很多人認為是最簡潔而優雅的資料結構之一,主要用於解決一些元素分組的問題。它管理一系列不相交的集合,並支援兩種操作:

合併(union):把兩個不相交的集合合併為乙個集合。

查詢(find):查詢兩個元素是否在同乙個集合中。

並查集的重要思想在於,用集合中的乙個元素代表集合。我曾看過乙個有趣的比喻,把集合比喻成幫派,而代表元素則是幫主。

1.初始化

假如有編號為1, 2, 3, …, n的n個元素,我們用乙個陣列fa來儲存每個元素的父節點(因為每個元素有且只有乙個父節點,所以這是可行的)。一開始,我們先將它們的父節點設為自己。

int fa[maxn]

;inline

void

init

(int n)

2、查詢

利用遞迴的寫法實現對代表元素的查詢:一層一層訪問父節點,直至根節點(根節點的標誌就是父節點是本身)。要判斷兩個元素是否屬於同乙個集合,只需要看它們的根節點是否相同即可。

int

find

(int x)

3、合併

並操作也是很簡單的,先找到兩個集合的代表元素,然後將前者的父節點設為後者即可

inline

void

merge

(int i,

int j)

}

路徑壓縮優化後,並查集的時間複雜度已經比較低了,絕大多數不相交集合的合併查詢問題都能夠解決。然而,對於某些時間卡得很緊的題目,我們還可以進一步優化。我們應該把簡單的樹往複雜的樹上合併,而不是相反。因為這樣合併後,到根節點距離變長的節點個數比較少。我們用乙個陣列rank記錄每個根節點對應的樹的深度(如果不是根節點,其rank相當於以它作為根節點的子樹的深度)。一開始,把所有元素的rank(秩)設為1。合併時比較兩個根節點,把rank較小者往較大者上合併。

參考鏈結

xiang

資料結構與演算法之並查集

並查集結構可以用於 1 檢查兩個元素是否屬於同乙個集合 比如對於圖1這個例子來說,如果我們想要檢查節點d和節點e是否屬於同乙個集合,可以這樣操作 d節點往上找其父節點,一直往上找,直到某個節點的父節點是其本身,此時停止 找到了節點a e節點也按照相同的步驟往上找其父節點,找到節點a 如果這兩個節點往...

資料結構與演算法之並查集

並查集 union find 是一種高效的資料結構,主要的操作有 為方便敘述,把所有元素視作點,元素之間的關係視作線,存在聯絡便存在關係 需要注意的是,這裡的關係應當是1.自反的,2.對稱的,3.傳遞的 所謂合併,便是將兩個點之間 畫 一條線。又上邊的定義不難理解相連的若干點之間互相存在關係,這樣我...

演算法與資料結構(六)並查集

圖相關演算法的實現。一種不一樣的樹形結構 連線問題 connectivity problem 視覺化的來看連線問題 連線問題 左上右下是否是連線的呢?意義 實際應用中的作用 社交網路 facebook中使用者a和b中的聯絡 好友關係 是否能聯絡到。電影書籍,多 之間形成網路。網際網路網頁之間形成的網...