目錄啟發式合併, 就是把n個大小為1的集合合併為乙個大小為n的集合的一種方法. 其複雜度為\(o(n\log n)\)
這種方法被廣泛應用在各種毒瘤資料結構(樹套樹)中.....
啟發式合併的演算法很簡單, 就是當要合併兩個集合 \(s1, s2\)時, 將大小較小的合併至大小較大的
//偽**
if(|s1| < |s2|)
for all x in s1: s2.insert(x);
clear(s1);
else
for all x in s2: s1.insert(x);
clear(s2);
為啥這個優化有這麼好的效果呢?
複雜度證明: 考慮貢獻法.將其複雜度式寫為 \(t(n) = \max_(t(k)+t(n-k)+\min(k, n-k)\ )\)乙個元素從乙個集合被加入另乙個集合時, 所在集合的規模至少擴大一倍. 如果沒有分離操作且元素數目有限, 合併的次數是o(log n)的.
因為有n個元素, 所以複雜度o(n log n)
通過以上證明, 所有類似這樣的遞迴式, 其解都是 \(o(n\log n)\)
啟發式合併
啟發式合併 暴力合併 將兩個資料結構合併,只需要將小的資料結構中的元素乙個乙個的插入大的資料結構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,這次...
啟發式合併
啟發式合併本質上是一種優化的暴力,可用於擁有穩定結構的資料結構。考慮夢幻布丁 hnoi2009 顯然的暴力思路是用鍊錶維護每種顏色的位置,然後每次修改的時候暴力合併兩條鏈。不難證明,這樣的最壞時間複雜度將達到 o n 2 不能接受。可以觀察到,合併的時間複雜度只與被合併的鏈長度有關,所以可以想到優化...