並查集總結

2021-08-02 04:45:06 字數 1492 閱讀 3886

注:此博文是在老師上課之後總結的,屬於課堂筆記,大部分摘自老師提供的課件。

並查集總結總結兩點就是「並」和「查」。

並查集是一種樹型的資料結構,用於處理一些不相交集合(disjoint sets)的合併及查詢問題。常常在使用中以森林來表示。

集就是讓每個元素構成乙個單元素的集合,也就是按一定順序將屬於同一組的元素所在的集合合併。

將編號分別為1…n的n個物件劃分為不相交集合,在每個集合中,選擇其中某個元素代表所在集合。

(1)元素間是否有聯絡:判斷兩個元素是否屬於同乙個集合;(查)

(2)建立元素間的聯絡:只需合併兩個元素各自所屬的集合。(並)

用編號最小的元素標記所在集合;

定義乙個陣列parent[1..n] ,其中parent[i] 表示元素i 所在的集合,初始情況是parent[i]=i。

parent[i]的值有兩種情況,因為其值表示乙個集合。

不相交集合: , , ,

這樣定義乙個陣列有兩個好處

如:merge( 5, 10 ),只需在1和2間連邊即可。

/*查:找x所在樹的根*/

root(x)

/*並:將x、y所在樹的根結點連起來,ry為rx的父結點*/

merge(x, y)

每次查詢的時候,如果路徑較長,則修改資訊,以便下次查詢的時候速度更快。

第一步,找到根結點。

第二步,修改查詢路徑上的所有節點,將它們都指向根結點。

路徑壓縮後(如下圖),再判斷2個元素是否同集合,則其時間複雜度由o(n)降低到o(1)

路徑壓縮演算法改進的地方在於find查詢根演算法的改變。找到跟節點,修改查詢路徑上的所有節點,將它們都指向根結點。

/*路徑壓縮查詢根演算法*/

root(x)

return r;

}merge(x, y)

//另一種寫法(遞迴寫法)

root(x)

merge(x, y)

最終筆記於2017-6-6。

並查集 總結

自己學完後總結一下吧,並查集,我的理解就是乙個查詢與合併,用乙個find函式來查詢自己的祖先也就是根節點,在這過程中還可以進行路徑壓縮,就是讓這個點直接變到根節點之下,還有就是合併,找出這兩個點的根節點,如果根節點不相同的話,就將乙個根節點放到另乙個根節點下面。這道題的就是用並查集做,找出總共有幾個...

並查集總結

用自己的理解來寫好了 有些地方可能不對 不定時更新理解 操作主要為三步 一 初始化 void init 二 查詢 這個為路徑壓縮 就是每次查詢時更新 查詢節點 x 上面所有節點直接使他們連向根節點 每次查詢更新 int find int x 另一種路徑壓縮 不過麻煩了些 作為理解 int find ...

並查集總結

並查集是一種管理元素分組的資料結構,是使用樹形結構實現的 作用 1 查詢元素a,b是否屬於同一組 2 合併元素a,b所在的組 只能進行合併,無法進行分割 注意 為避免退化發生,需進行以下操作 1 對於每棵樹,記錄數的高度rank 2 合併時如果兩棵樹的rank不同,從rank小的向rank大的連邊 ...