對於分治演算法來說,其演算法設計策略主要分為三個步驟:
1.我們要講乙個大問題分解成一些列規模大小基本相同的子問題
2.解決這些子問題(這裡通常會用到一些遞迴法)
3.最後將其結果合併。
這種策略可用的主要基礎來自其工作量的平衡性。典型情況下,它能幫我們講乙個複雜度平方級別的運算降低到線性級別。我們所介紹的歸併排序,快速排序以及集合中的最近點懟問題都是這方面的重要例子。
在某些情況下(例如在某有序序列中搜尋,或選取中間項時),我們還可以剪枝掉相關子問題以外的分支問題,以獲取從根節點道相關葉節點之間的子問題路徑,從而產生一些更為有效的演算法。
另外這些子問題的結構也是可以用二分搜尋樹來明確表示的。該樹上的每個節點都大於其左子樹上的所有節點,而小於其右子樹上的所有節點。這意味著:
1.二分搜尋樹可以通過根節點的遍歷來實現。
2.另外如果我們直接向其插入一些隨機值,搜尋樹本身在通常情況下是依然能維持平衡的,但也可能通過某些節點劃分為或轉換操作來對樹結構進行再平衡,以確保在最糟糕的情況下仍只需對數級執行時間。
點分治小結
終於理解了點分治。不過感覺這東西的拓展一定很高深。bzoj3697 套路 乙個個子樹列舉,單獨考慮根出發的貢獻。點分治的本質就是合併相同的資訊來優化複雜度。xjoi 第k大 給定一棵帶權值的樹,求每個點出發的第k小距離。可以在dfs序上分塊,維護全域性第k大然後一遍dfs。點分 常見的在點分樹上統計...
cdq分治小結
一般的分治,眾所周知的,是通過將大的問題拆小,然後對小問題的答案進行合併得到大問題的答案,但是cdq分治不是。我們知道,分治時,將乙個區間從中間斬開,分兩半處理,cdq分治在處理完之後,不是合併答案,而是計算左區間對右區間的貢獻,這樣子可以將維度降低,問題就更好做了。現在有 n nn 個二元組,每個...
點分治小結
最近學了學點分治,畢竟oj上都搞了個專題了。以乙個點為界限,將一棵樹分成若干個子樹,當劃分到一定規模,就對每個子樹分別進行求解 我們為了保證時間,所以要使子樹大小盡量小。如何找到最優的點呢?就是重心!重心是什麼?1.求當前樹重心。2.計算答案。3.走到相鄰未操作的節點進行第1步。暴力 o n 找到乙...