算法設計 - 概述

算法設計 - 概述

如需轉載請註明出處: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章