樹分治是基於樹上問題的一種處理問題的方式
它有非常巧妙地結構,,它利用的是樹的 邊等效 和點的無序性 對樹進行離散,抽象維護等效路徑 和 子樹關係的神奇演算法
分治樹有非常好的性質,把一些樹寫成分治樹是這樣:
可以注意到原樹的形態被離散,重新組合,但對於每乙個被離散後的子樹,改變的只是它的分治重心與父節點的關係,子樹內的關係是不會改變的
怎麼看出這種樹對比與原樹的優勢?
首先遍歷子樹的複雜度就不一樣,,例子如下:
樹越奇怪左邊的越大,差別越明顯
對於分治樹 由於每乙個節點都要往下遍歷子樹,所以每層數*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也不錯.一步一步動態描述線段樹的演算法過程.線...