並查集(小白)

开始优化發表於2024-04-03

許久未更新今天小小的學習一下

讓我開始我們的學習之旅

並查集

引入

首先我們引入一個概念,並查集是管理元素所屬集合的資料結構,可以理解為一個集合 一棵樹---這一顆樹的每個節點都是一個元素。

比如圖中的元素1 ,2, 3, 4, 5 屬於一個集合, 元素6, 7, 8屬於一個集合 並查集就是實現所管元素的資料結構

支援操作

並查集支援兩個操作 合併(merge)與查詢(find)

1-合併: 合併兩個元素的集合


2-查詢: 查詢所屬元素所在的集合,也可以查詢兩個元素是否相同

程式碼實現

1-初始化(init)

對於單獨的一個元素來講,它的父親就是它自己,為了實現這個操作我們需要初始化,將每一個元素都定義為的父親自己

void init() {
    for (int i = 0; i <= N; i++) {
        fa[i] = i;
    }
}

  

2-查詢(find)

對於如圖我們在查詢元素的時候需要向上尋找直至找到根節點,對於這樣我們會發現的效率不是很高, 查詢過程中經過的每個元素都屬於該集合,我們可以將其直接連到根節點以加快後續查詢。就瞭解到了路徑壓縮這個功能了

int find(int x) {
    return fa[x] == x ? x : fa[x] = find(f[x]);
}

  

3-合併(merge)

我們需要將元素的合併在一起只需要合併兩個根節點就實現了

void merge(int x, int y) {
    fa[find(x)] = find(y);
}

  

相關文章