許久未更新今天小小的學習一下
讓我開始我們的學習之旅
並查集
引入
首先我們引入一個概念,並查集是管理元素所屬集合的資料結構,可以理解為一個集合 一棵樹---這一顆樹的每個節點都是一個元素。
比如圖中的元素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); }