啟發式合併

2022-05-07 21:06:10 字數 527 閱讀 3101

啟發式合併是對集合合併類問題的一種高效處理方式。

• 通常啟發式合併優化的是合併多個相同資料結構的時間,通過暴力的合併來

將兩個相同

的資料結構合併,從而使得維護的零散資訊(性質)逐漸合一。

• 舉個十分簡單的例子:起初有 n 個陣列,且每個陣列有且僅有 1 個數,接下

來有 n-1 個指令,需要你每次合併兩個指定陣列(將其中乙個陣列中的數一

個乙個插入另乙個陣列)。使插入操作的次數最少。

• 最壞需要插入 nlogn次。做法:每次合併兩個陣列時,首先比較兩個陣列的

大小,將小陣列中的數暴力插入大陣列中就可以了。

• 證明:對於每乙個數,考慮何時會對其進行插入操作。顯然是它所在的集合

大小比另乙個集合小的時候。也就是說,在每次它被進行插入操作的合併指

令後,它所在的集合大小會翻至少一倍,那麼顯然最多翻 logn 次啊。所以這

樣合併集合的時間複雜度是 nlogn 的。

一些題目:

啟發式合併

啟發式合併 暴力合併 將兩個資料結構合併,只需要將小的資料結構中的元素乙個乙個的插入大的資料結構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 不能接受。可以觀察到,合併的時間複雜度只與被合併的鏈長度有關,所以可以想到優化...