學習筆記 並查集

2021-08-18 11:36:02 字數 1161 閱讀 3688

這是乙個可以實現合併與查詢(元素間關係判定)用來維護多集合(功能多樣化)的超牛批的可以動態維護的樹形結構。

這個演算法只要是實現集合元素關係的型別都可以用到,又是線性時間複雜度,而且最關鍵的是它是個高階資料結構,翻譯過來就是這個可以動態維護,所以我覺得這個用途比單純的演算法要好,實際應用比較大,而且這個方法可能不是唯一的,但是用這個方法可以做很多題,比如二分圖中用到動態維護就只能用這個方法,但是這個方法也有不可替代性,不如線段樹經常可以被其他資料結構替代,所以必須注意,可能有奇效。

注意:這是乙個需要思考的**,邊寫邊思考,因為這是個非常靈活的資料結構

int pa[maxn];

void initial(int x)//初始化

int find(int x)//路徑壓縮,還有一種優化是啟發式合併,一起用效果更好,但是不加時間複雜度也很小

bool judge(int x,int y)

void merge(int x,int y)//這裡是為了後面的帶權並查集

注意:初始化容易寫掉,但是很容易檢查出來

理解:

1. mr.he為了突出這個資料結構的簡單性非要寫成一排,我表示我可以把整個程式寫成兩排(^~^)

2. 這裡的時間複雜度可以看做線性的,因為有路徑壓縮,時間複雜度是個」反阿克曼函式」,一般來說這個值小於4,因此可以當做是線性的。

3. 基於這四種操作可以延伸多種操作

不用路徑壓縮,啟發式合併是一種可以還原的並查集。

它的原理就是記錄下每個並查集的高度(元素個數也可以),然後讓合併的高度盡量低。

它的時間複雜度是o(nlogn)的。

需要還原的話就在修改的時候記錄下連線的兩個點的原資訊存入棧中,然後把棧中的資訊一次還原。

假刪除:乙個結點被刪除之後建立新的結點,把該結點通過乙個陣列對映到新的結點上去,之後所有的操作都在新結點上進行。

用左閉右開的方法或者左開右閉,要考慮到pa陣列清零要多一位。

那麼本質我們應該歸結到並查集,最右邊的元素是pa,還可以加路徑壓縮,算是一種很活的用法了,**也不難,很基礎,甚至是不全的並查集。

同時,以後用大步跳躍就用並查集的方法,加上路徑壓縮,那麼就可以當做線性時間複雜度了

注意:這裡如果不是為了像廣告印刷那種後續處理需要,不需要用左閉右開,不影響結果,只是注意有些地方要處理

並查集學習筆記

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

並查集 學習筆記

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

並查集學習筆記

也算是磕磕絆絆,斷斷續續的學歷一段時間並查集了吧,也是時候改寫乙個blog總結一下啦。先說一下普通並查集吧。普通並查集就是單純的把某些可以連起來的點用一條有向邊連起來,表示他們屬於 一類 例如hdu1213,這就是乙個並查集的裸題,直接把輸入的點合併,之後統計有幾個點的祖先是自己就行。ac incl...