分治,剃刀,奧卡姆


分治在於剔除重復。

“如無必要,勿增實體” (Entities should not be multiplied unnecessarily)

Numquam ponenda est pluralitas sine necessitate.(避重趨輕)
Pluralitas non est ponenda sine necessitate.(避繁逐簡)
Frustra fit per plura quod potest fieri per pauciora.(以簡御繁)
Entia non sunt multiplicanda praeter necessitatem.(避虛就實)
一、信息:序列與樹

樹上的log是輕重兒子,啟發式合並。

而序列上則是分治。

線段樹本身就是一種分治。

序列上的分治是二分。樹結構其實可以看成特殊的序列。

而分治本身在於繼承。

繼承是為了不必重復計算。類比記憶化搜索。

序列上,如CDQ分治,如奇襲,本質上都是多對多地共用已經處理出來的信息。而不是每一次去單獨算。

仔細想想樹狀數組之所以能快也是種信息共享的結構。

樹狀數組:單點修改,區間查詢。改為差分數組可做到區間修改,單點查詢。

同時序列上的二分,mid能覆蓋所有中間分割位置。

實際上原本是n^2的點對,每對點都有關系。通過二分(實際上是枚舉斷點(分為 貢獻—接受 部分))使接受的部分能夠共享貢獻的部分的貢獻。

實現的關鍵在於1、每個點都對整個序列有影響。(n^2點對)。則可以分出接受和貢獻的部分。

2、每個點的貢獻可以單獨計算。不能單獨算可以考慮公式移項。(奇襲,天天愛跑步)。

在增加數值,查詢數值時,可以考慮數據結構維護(CDQ的樹狀數組)。或者只用一個數組或桶。

對於區間,我們可以分為內部和外部來討論,從而寫出分治。那么對於樹,我們也可以分為子樹內部,子樹對根,(可能還有子樹對子樹)來考慮。

如果要先處理所有子樹信息,再處理根節點,且子樹的信息要累加到根上,且信息處理有繼承關系:

1、每個節點開空間記錄所有信息。

2、為了降低復雜度,可以繼承信息多的部分,從而做到每次只額外增加較少的信息,處理較少的信息。

  根據輕重子樹分(輕重根據信息分,而非子樹大小),可以每次增加不超過1/2.

  從而實現log的復雜度。

二:同類信息的簡化

  背包DP中有數量物品的二進制拆分。

三:運動與轉移

  造成重復的除了信息,還有運動/變化/轉移。為了簡化若干相同的連續的轉移,出現了快速冪、矩陣快速冪。

而它們的必要條件是轉移滿足結合律。

順便一提,快速冪是把底數的乘法變為指數的加法,並且自乘相當於指數乘2,二進制中即為左移一位。

如果一個個乘,相當於把base又算了一遍。乘法本身就是對加法的優化,用兩個較小的數表示一個較大的數。擴展到快速冪就是讓指數乘2。

類似的還有lca抬根(ST表)。也是對一系列不斷重復操作(向上抬)的簡化。ST表既可lca抬根優化轉移,也可RMQ存儲區間信息。

大體來說,對於轉移的簡化重復,一是快速冪從低位到高位枚舉二進制,二是lca抬根的二進制從高位到低位拼湊。

LAST:

尋找冗余。

信息是物質,轉移是運動。剔除重復。避免不必要的事、物。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM