一、兩種重要算法思想: 動態規劃,貪心算法算法
二、動態規劃:性能
基本原理:動態規劃英文名dynamic programming。其中pogramming指的是表格法,而非編寫計算機程序。所以,能夠初步得出動態規劃的基本思想:將一個具備最優子結構性質的問題分紅若干個子問題,在求解過程當中,記錄下子問題的結果,存儲在一個表格中,使得公共的子問題只須要計算一次。書中給出的基本原理:動態規劃將問題分紅若干個相互重疊的子問題,遞歸的求解子問題,保存子問題的解,再將它們的解組合起來,求出原問題的解。優化
從基本原理中能夠看出動態規劃須要知足兩個條件,最優子結構和子問題重疊。編碼
最優子結構:書中定義:問題的最優解由相關子問題的最優解組合而成,一個問題的最優解包含其子問題的最優解。典型的有揹包問題和鋼條切割我問題。所謂子問題就是一中組合,將一個問題分紅許多子問題的集合。某個子問題轉化爲問題時,所須要的代價是固定的。spa
通常這類問題的解題過程:(本身總結)orm
畫出子問題圖(相似於逆拓撲排序的圖,子問題必須在問題前面完成)排序
用數學表達式構建出問題的最優解和子問題最優解之間的代數表達式遞歸
一般採用自底向上的方法進行遞歸地求解問題的解,自底下上的含義是從最小的子問題求起。數學
保存每一步求出的子問題的最優解原理
利用計算出的信息構造一個最優解
三、貪心算法:
基本原理:從初始狀態出發,每步都通過貪心選擇,最終獲得問題的最優解。
含義: 將每一步都當作是當前最佳的選擇,作到局部最優化,直到沒法選擇爲止。寄但願於局部最優的選擇可以致使全局最優解。
兩個實例:最小生成樹算法和單源最短路徑算法,以及集合覆蓋問題的貪心啓發式算法。
prim算法:將集合A當作是一棵樹,每次選擇剩餘的節點中與這棵樹造成的邊的權值最小的點加入到集合A中造成新的樹,循壞調用該過程,知道全部的點都已經放入到集合A中。初始時隨機選擇一個節點放入到集合A中。
kruskal算法:在全部鏈接森林中兩顆不一樣樹的邊裏面,找到權重最小的邊(u,v),並將其加入到集合A中,循環調用該過程,直到全部的點已經放入到集合A中
貪心選擇:當進行選擇時,咱們直接做在當前問題看來是最優的選擇,而沒必要考慮子問題的解。這與動態規劃不一樣,動態規劃當前問題依賴於較小的子問題。而貪心算法中作當前問題最優選擇,這樣每步以後只須要作一個子問題的解。
也必須知足最優子結構的性質,即一個問題的最優解包含其子問題的最優解。
那麼,如何區分何時使用動態規劃,何時使用貪心算法呢?
典型的兩個問題,0-1揹包和分數揹包。二者都具備最優子結構性質,可是貪心算法只能用來求分數揹包的問題,而不能用來求0-1揹包的問題。即只有分數揹包具備貪心選擇性。
我得總結(不必定對):具備貪心選擇性的一類問題是:每次作選擇時只有性能不一樣,而代價是同樣的。那麼這樣每次的選擇都是最好的,最終會獲得最好的結果。
哈夫曼編碼也使用貪心選擇算法。每次選擇待編碼的字符都選擇在剩餘的字符中出現次數最多的