分而治之 (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解決方案:
- 首先解決較小的數字的問題
- 重用這個值來計算較大的值
- 到最終值
相關文章
- 偉大的女程式設計師們程式設計師
- 為什麼程式設計師是一個偉大的職業程式設計師
- 如何成為偉大的程式設計師?程式設計師
- 偉大程式設計師的十大特質程式設計師
- 偉大程式設計師的十個特質程式設計師
- 最偉大的計算機程式設計師是如何誕生的?—解讀高德納計算機程式設計師
- 歷史上最偉大的12位程式設計師程式設計師
- 歷史上最偉大的 12 位程式設計師程式設計師
- 適用於偉大互動設計的 UI 原則UI
- 成為偉大程式設計師的 10 個要點程式設計師
- 我們身邊偉大的女程式設計師們程式設計師
- 如何成為一個偉大的 JavaScript 程式設計師JavaScript程式設計師
- C# 4.0中的動態型別和動態程式設計C#型別程式設計
- 改變計算技術的偉大演算法演算法
- 為什麼程式設計師也能成為偉大的CEO程式設計師
- 計算機程式設計領域最偉大的20個發明計算機程式設計
- Java動態程式設計---動態代理Java程式設計
- 併發程式設計中一種經典的分而治之的思想!!程式設計
- 最偉大的計算機程式設計師是如何誕生的?——解讀高德納(Donald E.Knuth)計算機程式設計師
- 動態規劃演算法(DP)學習<1>動態規劃演算法
- 說說你對分而治之、動態規劃的理解?區別?動態規劃
- 動態程式設計(DynamicProgramming)程式設計
- 動態規劃(DP)動態規劃
- DP動態規劃-爬塔(雙層dp)動態規劃
- [譯] 偉大設計與好設計之間區別是什麼?這裡告訴你真相
- 動態程式設計之classloader程式設計
- 利用偉大的原則設計一個糟糕的網站網站
- “快速排序演算法”問題的分而治之演算法排序演算法
- JAVA平臺是最偉大的發明!Java
- 細數二十世紀最偉大的10大演算法演算法
- 5k和5萬程式設計師的差距原來是在於10大程式設計禁忌!程式設計師
- Java安全之Javassist動態程式設計Java程式設計
- ABAP 動態程式設計-FIELD-SYMBOLS程式設計Symbol
- ABAP動態程式設計-DESCRIBE FIELD程式設計
- 老派程式設計師——徒手實現偉大成就程式設計師
- 二十世紀最偉大的十大經典演算法演算法
- 淺談Java和SAP ABAP的靜態代理和動態代理,以及ABAP面向切面程式設計的嘗試Java程式設計
- SPOJ GSS3 (動態dp)S3