對點分治的一些新理解
阿新 • • 發佈:2021-07-14
點分治演算法分析
點分治用來處理有關數上路徑問題。
所有路徑對答案的貢獻其實可以分成,所有過一點的路徑+所有不過這點的路徑。
不過這點的路徑怎麼算?可以以這點為根到它的子樹裡分治解決。
所以現在問題只有:1、所有過這點的路徑怎麼解決?2、複雜度怎麼保證?
問題二:可以每次分治時以重心為根。這樣最多分治\(logn\)次
重心:滿足以此為根,所有兒子子樹大小的最大值最小的節點。重心有一個性質:以重心為根的樹,所有重心的兒子子樹的大小一定小於\(\frac{n}{2}\)。這個性質的證明跟某一經典的貪心證明很像(好像是把數軸上的所有物品移到哪個物品上的花費最小)。
這個性質保證了最多分\(logn\)
問題一:方法不是重點,點分治重點在於分治,把求書上路徑問題轉化成求樹上過一個點路徑的問題,而且代價只是複雜度多了一個\(log\)。
注意的點
計數問題中一個一個去記答案是很蠢的,除非答案的數量級很小。
除了計數問題之外,還有所有關於通過根節點路徑的最優化問題(選哪個為根),通常這類問題有單調性,可以判斷答案在某個子樹裡。然後普通方法複雜度不對,用點分治最多\(logn\)層子樹的性質優化演算法。