淺談啟發式合並
本篇隨筆簡單淺談一下啟發式合並。
啟發式合並的概念
顧名思義,啟發式合並解決的是合並類的問題。
現在給一個最基本的合並問題。
我們要把\(N\)個集合,總共\(M\)個元素合並成一個大集合。
很容易得出,最壞的情況下需要合並\(N\)次,每次合並\(M\)個元素,也就是\(O(MN)\)的時間復雜度。
(一個集合有所有元素,然后傻呵的一直把這個最大的往空集里合並,合並了\(N\)次)
然后我們想,這種合並策略山P就山P在把最大的往小的里合並。
同樣的問題,如果我們把小的往大的里合,是不是就快很多?
看看這個思路,是不是很像拍腦門臨時得出來的?
是不是很受啟發?
好了,它就叫啟發式合並。
其思路是:每次把較小集合往較大集合里合並。
其原理是,因為是較小集合往較大集合里合,於是較小集合的元素個數被擴充了至少一倍,也就是變成了原來的二倍多,這樣的話,我們就能保證,最壞的合並次數是\(O(\log N)\)。
啟發式合並的應用
在剛剛講過的概念中,我們可以得知啟發式合並是對數據結構的一種合並,比如多棵樹、集合、線性數據結構等等。
當然我們最常見的還是並查集的啟發式合並優化。
在此不過多贅述,具體的應用請讀者通過具體題目自行體會。