分而治之 (D&C) 和動態程式設計 (DP) 是偉大的演算法 - Franc0
Divide and Conquer (D&C:分而治之) 和Dynamic Programming (DP:動態程式設計)是偉大的演算法技術,兩者都將給定的問題分解為子問題並解決子問題(banq注:還原論 思維)。你如何選擇它們來解決特定的問題呢?
要回答這個問題,您首先需要了解子問題是否重疊。如果它們不重疊,您應該使用分而治之。如果它們重疊,您應該使用動態程式設計 。
分而治之 (D&C)
讓我們考慮將問題 P 分解為 2 個較小的子問題 S1 和 S2。使用 D&C,您會:
- 分別解決S1和S2;
- 以某種方式組合它們兩個S1和S2
- 得到答案結果P
一個經典的例子是歸併排序,您可以通過以下方式對陣列進行排序:
- 將其劃分為 2 個子陣列
- 對 2 個子陣列進行獨立 排序
- 合併已排序的子陣列以獲得原始排序
這是兩個子問題沒有重疊、沒有相互依賴以找到解決方案。(banq:類似DDD有界上下文劃分)
動態程式設計 (DP)
對於 DP,您需要意識到的第一件事是 S1 和 S2 重疊。這是什麼意思 ?基本上,S1 和 S2 之間存在相互依賴關係。
假設 S2 依賴於 S1。這意味著必須先解決 S1,然後才能解決 S2。這正是 DP 在以自下而上的方式實施時所做的。
- 首先解決S1並記住結果。
- 利用 S1 的記憶結果求解 S2(S2 取決於 S1)
- 使用 S2 和 S1 的解求解 P。
您需要做的就是從底部 (S1) 開始並逐漸(通過 S2)向上 (P) 移動。
一個經典的例子是斐波那契數列:f(n) = f(n-1) + f(n-2)。f(n-1) 的解取決於 f(n-2) 的解。DP解決方案:
- 首先解決較小的數字的問題
- 重用這個值來計算較大的值
- 到最終值
相關文章
- 動態 DP
- 併發程式設計中一種經典的分而治之的思想!!程式設計
- 動態程式設計(DynamicProgramming)程式設計
- 動態規劃演算法(DP)學習<1>動態規劃演算法
- 什麼是分而治之?
- 說說你對分而治之、動態規劃的理解?區別?動態規劃
- 動態規劃(DP)動態規劃
- 5k和5萬程式設計師的差距原來是在於10大程式設計禁忌!程式設計師
- DP動態規劃-爬塔(雙層dp)動態規劃
- Java安全之Javassist動態程式設計Java程式設計
- 淺談Java和SAP ABAP的靜態代理和動態代理,以及ABAP面向切面程式設計的嘗試Java程式設計
- 什麼是分而治之?什麼是WBS?
- 好程式設計師大資料培訓分享Hive的靜態分割槽與動態分割槽程式設計師大資料Hive
- 程式設計隨想:基於歷史狀態的演算法程式設計演算法
- [譯] 偉大設計與好設計之間區別是什麼?這裡告訴你真相
- 十大程式設計演算法助程式設計師走上高手之路演算法程式設計師
- JAVA_動態代理AOP切面程式設計Java程式設計
- 低程式碼是程式設計發展的大勢所趨?程式設計
- 百練4124:海賊王之偉大航路(狀壓DP)
- 物件導向程式設計和根本狀態物件程式設計
- 關於心態建設,程式設計和自學程式設計
- SPOJ GSS3 (動態dp)S3
- [動態規劃] 區間 dp動態規劃
- (C++)DP動態規劃C++動態規劃
- 動態dp複習筆記筆記
- 好程式設計師大資料開發之掌握Hive的靜態分割槽與動態分割槽程式設計師大資料Hive
- Java中的超程式設計與動態代理技術Java程式設計
- 大齡程式設計師找不到工作,程式設計師真的是吃青春飯的嗎?程式設計師
- 2020年廣東工業大學第十屆文遠知行杯新生程式設計競賽 A.肥豬的鋼琴床(dp動態規劃)程式設計動態規劃
- Flink的狀態程式設計和容錯機制(四)程式設計
- 程式設計師的三階段,薪資的三大“關”,你對程式設計到底持有的是一種什麼樣的態度?程式設計師
- 動態規劃之經典數學期望和概率DP動態規劃
- 資料結構而非演算法是程式設計的核心 - theartofmachinery資料結構演算法程式設計Mac
- 對於 CF1107E 中 dp 狀態設計的一點想法
- DDD本質是分而治之的分析方法 - James Hickey
- 如何設計和維護本地動態IP池?
- 動態dp & 矩陣加速遞推矩陣
- 動態規劃篇——線性DP動態規劃