並查集學習筆記 zz

2021-09-30 06:46:44 字數 1233 閱讀 2164

ps:從今天開始開始認真的按順序把acm程式設計競賽的演算法系統的學習一下,並做好的筆記整理,好多可能援引其他人的課件或者部落格,我會寫出出處的,當然大部分是我自己的原創的,希望各位看官大牛們指教;

言歸正傳,並查集。

並查集維基百科中是這樣描述的:並查集是一種樹型的資料結構,用於處理一些不相交集合(disjoint sets)的合併及查詢問題。常常在使用中以森林來表示。我看到有資料上有寫可以用陣列實現,可以用鍊錶實現,看得我糊里糊塗的,感覺用樹的結構來寫實現起來容易,效率也很高;

並查集簡單的說就是把乙個集合的元素用乙個標號來表示,每個節點的最終祖先節點就標記為這個標號。

並查集有三個操作:初始化,合併,查詢。

我先貼兩個我寫的**來照著**來說比較容易些,讀者也容易讀些,本人的**寫得不是很簡潔明瞭,希望大牛們指出不足之處

上述為簡單的樸素的並查集,不帶任何的優化

chushihua(int n)根據名字也可以看出是初始化函式,也可以看出我的英語很爛,:-)。初始化的時候將每個節點的父節點設為本身,構造一群指向自己的節點的集合;

max_size設定的是節點的個數,father陣列記錄的是節點父節點,初始為指向自己。

psfind()傳入乙個節點的標號,根據標號來尋找其屬於集合的標號。找到節點的父節點的標號是其本身就是這個集合的標號,即根節點。

psunion(int root1,int root2)傳入連個節點root1,root2,找到兩個節點屬於的集合標號,然後當不相等的時候合併兩個結合就可以了,至於怎麼合併,只要把乙個節點的標號設定為另乙個節點就可以了。

以上就是乙個樸素的並查集,不帶任何的優化的,當乙個集合所形成的樹是乙個偏的很厲害的樹,形成乙個鏈狀的樹(所有節點都是在父節點的左鏈上)。每次尋找都是很浪費時間的。對n個節點的尋找的複雜度達到o(n^2)的。

下面我們來看兩個優化:

1:rank陣列的引入,啟發式函式

2:路徑壓縮;

以上就是帶有兩個優化的**;

當沒次查詢節點的標號的時候,不是找到了就大功告成了,而是把這條路徑上的所有的節點的標號就ok了,複雜度接近線性的好像接近o(5*n),是個函式乘以n,細緻的演算法複雜度分析黑書上都是有的。

rank陣列記錄的是乙個集合形成樹的深度,合併的時候把深度小的根節點的父節點設為深度大的那個根節點就ok了的。

貌似並查集簡單的就這些了。

這個是維基百科關於並查集的東東。

稍後我會寫上這些題目的自己做的思路和解題報告,歡迎指教;

希望大家切題快樂,明天寫解題報告上傳。

並查集學習筆記

並查集是一種用來管理資料分組狀況的資料結構,可以進行合併操作,但無法進行分割。並查集的結構 並查集也是用樹形結構來實現的,但不是二叉樹。每個資料,元素對應乙個節點,每個組對應一棵樹。並查集的實現 並查集有幾個基本操作初始化 查詢樹的根 合併x,y所屬集合 判斷x,y是否屬於同一集合。查詢是查詢樹的根...

並查集 學習筆記

並查集是由一組互不相交的集合組成的乙個集合結構,並在此集合上定義了運算union和find。即並查集中的元素本身是集合,他們是某個集合的子集,並查集是由這些集合組成的集合結構。並查集上有兩個最基本的運算,find和union。函式find搜尋給定元素i所在的子集合,並返回該自己喝 union運算將兩...

學習筆記 並查集

這是乙個可以實現合併與查詢 元素間關係判定 用來維護多集合 功能多樣化 的超牛批的可以動態維護的樹形結構。這個演算法只要是實現集合元素關係的型別都可以用到,又是線性時間複雜度,而且最關鍵的是它是個高階資料結構,翻譯過來就是這個可以動態維護,所以我覺得這個用途比單純的演算法要好,實際應用比較大,而且這...