對於樹分治演算法的初步理解

2021-09-30 14:15:16 字數 883 閱讀 2905

樹分治是基於樹上問題的一種處理問題的方式

它有非常巧妙地結構,,它利用的是樹的 邊等效 和點的無序性 對樹進行離散,抽象維護等效路徑 和 子樹關係的神奇演算法

分治樹有非常好的性質,把一些樹寫成分治樹是這樣:

可以注意到原樹的形態被離散,重新組合,但對於每乙個被離散後的子樹,改變的只是它的分治重心與父節點的關係,子樹內的關係是不會改變的

怎麼看出這種樹對比與原樹的優勢?

首先遍歷子樹的複雜度就不一樣,,例子如下:

樹越奇怪左邊的越大,差別越明顯

對於分治樹  由於每乙個節點都要往下遍歷子樹,所以每層數*n 就是 o(nlogn)

而對於鏈    同樣的操作,可以達到 o(n^2)的級別  (n+n-1+n-1+n-2+n-2.....)

但對於分治樹而言,它犧牲了原來的結構來換取高速的結構,所以如果子樹和父節點有路徑關係,它就完了

所以,樹的分治演算法除了分治樹、還有容斥;

對於孤立的子樹,我們把子樹所有的資訊dfs一遍,都加起來,然後,再便利每個子節點,在原樹的形態上減掉不合法的,這樣就處理完了當前根節點的所有情況,

所有的其他子樹就都是孤立的了,可以繼續遞迴進行、

是乙個常數比較大的o(nlogn)

對於每乙個分治重心,進行n級別的運算、檢驗,複雜度如下:

所以樹分治往往用於每個子樹孤立部分的統計問題,,可以犧牲子樹和根節點的關係來優化子樹結構。

綜上,樹分治演算法的核心為  樹結構的優化

最大連續和,對於分治法的初步理解

紫書中所講到的分治法第一次碰 是有些懵逼的,結合陳越姥姥對於演算法的引例的講解,算是大概明白了是怎麼回事。我們知道乙個經典問題是求一段序列中的最大連續和。有三種做法可以解決 一是暴力三層巢狀迴圈直接求出所有的連續序列和,進行比較即可 二是求出所有字首和,之後後者減前者,算出每段的序列和比較。前面兩者...

對於虛擬dom的初步理解

頻繁且複雜的dom操作通常是前端效能瓶頸的產生點,vue提供了虛擬dom的解決辦法 所謂虛擬dom,其實就是用js來模擬dom結構,把dom的變化操作放在js層來做,儘量減少對dom的操作.虛擬的dom的核心思想是 對複雜的文件dom結構,提供一種方便的工具,進行最小化地dom操作。這句話,也許過於...

線段樹初步理解

原本這兩天在搞網路流的.但最近幾次網賽多次遇到了線段樹的題目.意識到線段樹還是重要的.所以今天就初步的了解了線段樹最簡單的應用.單點更新.今天學習線段樹主要是看notonlysuccess大牛的模板 風格非常好.很適合初學線段樹的來參考.網上的一些ppt也不錯.一步一步動態描述線段樹的演算法過程.線...