並查集 啟發式合併,路徑壓縮

2022-05-13 11:08:11 字數 394 閱讀 1565

一直沒想過自己寫的並查集的複雜度= =。。。看那一行**還挺竊喜——貼一下正版的啟發式合併,這樣複雜度就真正到了反阿克曼函式那什麼balabala

乙個優化是:把小的樹合併到大樹中,這樣會讓深度不太大。這個優化稱為啟發式合併。

乙個優化是把沿途上所有結點的父親改成根。這一步是順便的,不增加時間複雜度,卻使得今後的操作比較快。這個優化稱為路徑壓縮

用 p[i] 表示 i 的父親,而 rank[i] 表示 i 的秩,並用秩來代替深度做剛才提到的啟發式合併。

void makeset ( int x )

int findset ( int x )

return px ;

}void unionset ( int x , int y )

}

並查集的啟發式合併

在原來剛接觸並查集的時候,感覺確實很方便,也是認為並查集就那麼點東西,簡單方便,但是後來無意間發現了乙個並查集的啟發式合併,可以對並查集進行優化,它優化的理論是用乙個陣列來記錄每個節點的深度,每一次合併都把節點向深度 高度 大的節點上進行合併,從而對最後的 生成樹 深度進行了優化。受益匪淺,好長時間...

啟發式合併

啟發式合併 暴力合併 將兩個資料結構合併,只需要將小的資料結構中的元素乙個乙個的插入大的資料結構o n o n o n 如果題目只有插入操作沒有 總o n logn o nlogn o nlog n 因為每次合併,所有資料結構總大小為n,設兩個資料結構大小為a,b a b a,b a b a,b a...

啟發式合併

includeconst int n 5e5 5 int f n d n r n p n int find int i int unionn int i,int j int main 並查集 按秩啟發式合併 bzoj4668 冷戰 題目大意 給出n個軍工廠和m 個操作,操作分為兩類 0 u v,這次...