算法設計 - 概述
如需轉載請註明出處:http://blog.csdn.net/qingyixiaoxia 微信號:qingyixiaoxia
熟知的算法設計思路有五類:分治,回溯,分枝限界,動態規劃,貪心。本文作爲一個對算法設計的概述,着眼於討論五點:其一,五類算法設計思路的引入;其二,枚舉決策類算法的解空間樹;其三,枚舉決策類算法的分類;其四,算法的遞歸實現和遞推實現;其四,如何選擇一個算法設計思路;
如需轉載請註明出處:http://blog.csdn.net/qingyixiaoxia 微信號:qingyixiaoxia
一 五類算法設計思路的引入
一個問題之所以需要運用算法來解決,是因爲其規模比較大,很難用簡單的邏輯直接求解之。
運用算法解決問題,基本思路是不斷降低問題的規模,並用較小問題的解求得較大問題的解。
不同的算法設計思路的區別,本質是降低問題規模的方法方式不同。如下:
不同的算法設計思路,降低問題規模的方式不同。
對應的,由較小問題求得較大問題的方式也不同。
分部分割算法,和枚舉決策算法,各自過程特徵大致如下:
1. 分割分部類算法的過程特徵:
父問題可以分爲若干組成部分,每個組成部分又有與父問題一樣的組成特徵。例如遍歷樹時,樹與其子樹;
父問題的解,可以基於組成特徵,由子問題的解合併得之。例如遍歷樹時,樹的遍歷結果,由子樹的遍歷結果合併得之。
2. 枚舉決策類算法的過程特徵:
父問題通過枚舉一個步驟上的所有決策分支,可以得到若干縮小了規模的子問題。而且這些子問題可以用相同的方式枚舉決策分支來進一步降低規模,直至規模降低到可以直接求解。例如,迷宮類問題,在某個位置節點上,可以通過枚舉下一步所有可以走向的節點,來減少未來需要進行的探測,從而降低問題規模。
父問題的解,由各個子問題的解按需進行某種PK,來父問題的解。例如,求解最短步數的迷宮類問題,在某個位置節點上,通過對其所有子問題解的步數進行PK,得到該節點的解。
如需轉載請註明出處:http://blog.csdn.net/qingyixiaoxia 微信號:qingyixiaoxia
二 枚舉決策類算法的解空間樹
1. 枚舉決策類算法,就計算過程而言,分爲兩種:DFS,BFS。
DFS:深度優先,先求得一個分支的解,再求下一條分支的解;
BFS:廣度優先,各條分支,”層序”枚舉下一步驟的所有分支;
2. 枚舉決策類算法,把所有的決策枚舉展開後是一顆樹,此樹稱爲解空間樹。
DFS的求解過程,相當於對解空間樹做深度優先遍歷;
BFS的求解過程,相當於對解空間樹做廣度優先遍歷;
如需轉載請註明出處:http://blog.csdn.net/qingyixiaoxia 微信號:qingyixiaoxia
三 枚舉決策類問題的分類
根據問題解空間樹的特徵,遍歷解空間間的方式,優化遍歷的方法,枚舉決策類算法有三種:
1. 回溯
解空間樹的特徵:解空間樹中沒有交疊子問題;
遍歷解空間樹的方式:DFS;
優化遍歷的方法:根據實際情況進行剪枝處理;
2. 分枝限界
解空間樹的特徵:解空間樹中沒有交疊子問題;
遍歷解空間樹的方式:BFS,或者排序分支+BFS;
優化遍歷的方法:根據實際情況對分支進行取捨;
3. 動態規劃
解空間樹的特徵:解空間樹中有交疊子問題,且滿足最優子結構特徵;
遍歷解空間樹的方式:DFS;
優化遍歷的方法:求解過程中存儲交疊子問題的解;
如需轉載請註明出處:http://blog.csdn.net/qingyixiaoxia 微信號:qingyixiaoxia
四 算法的遞歸實現和遞推實現
無論分割分部,還是枚舉決策。無論是DFS還是BFS。無論回溯,分枝限界,還是動態規劃。都有遞推和遞歸兩種實現方式。
1. 遞推實現:
自底向上實現,通過棧或者隊列控制行進過程。
2. 遞歸實現:
自頂向下實現,通過函數遞歸描述和控制行進過程。
如需轉載請註明出處:http://blog.csdn.net/qingyixiaoxia 微信號:qingyixiaoxia
五 如何選擇一個算法設計思路
TBD
如需轉載請註明出處:http://blog.csdn.net/qingyixiaoxia 微信號:qingyixiaoxia