1、分治法(遞歸算法)算法
說明:許多算法在結構上是遞歸的,爲了解決某一問題,算法須要一次或屢次遞歸的調用自身以解決緊密相關的若干子問題,這些算法遵循分治法的思想:將原問題分解爲幾個規模較小但相似於原問題的子問題,遞歸的求解這些子問題而後在合併這些子問題的解來創建原問題的解。函數
分治模式在每層遞歸時都有三個步驟:優化
1)分解,分解原問題爲若干子問題,這些子問題是原問題規模較小的實例。編碼
2)解決,解決這些子問題,遞歸的求解這些子問題。當子問題的規模足夠小則直接求解。排序
3)合併,這些子問題的解構成原問題的解。遞歸
2、動態規劃二叉樹
動態規劃(dynamic programming)與分治方法類似,都是組合子問題的解來求解原問題。分治方法將問題劃分爲互不相交的子問題,遞歸的求解子問題,再將他們的解組合起來,求出原問題的解。與之相反,動態規劃應用於子問題重疊的狀況,即不一樣子問題具備公共的子子問題(子問題的求解是遞歸進行的),將其劃分爲更小的子子問題。而動態規劃算法對每一個子子問題只求解一次,將其解保存在一個表格中,從而無需每次求解一個子子問題時都從新計算,避免了這種沒必要要的計算工做。programming
動態規劃方法一般用來求解最優化的問題,這類問題能夠有不少可行解,咱們但願尋找具備最優值的解,稱這樣的解爲問題的一個最優解,由於可能有多個解達到最優值。方法
應用動態規劃求解問題的通常條件數據
1)最優子結構
若是一個問題的最優解包含其子問題的最優解,稱此問題具備最優子結構性質。(具備最優子結構可能也能夠應用貪心策略)
2)重疊子問題
子問題空間足夠小,即問題的遞歸算法會反覆的求解相同的子問題,而不是一直生成新的子問題。不一樣子問題的總數是輸入規模的多項式函數爲好。若是遞歸算法反覆求解相同的子問題,稱最優化問題具備重疊子問題性質。與之相對,適合用分治方法求解的問題一般在遞歸的每一步都生成全新的子問題。動態規劃算法利用重疊子問題的性質,對每一個子問題求解一次,將解存入一張表中,當再次須要這個子問題時直接查表,每次查表的代價爲常量時間。
3、貪心算法
貪心算法是經過作出一系列選擇來求出問題的最優解,在每一個決策點,他作出當時看起來最佳的選擇。這種啓發式策略並不保證能夠獲得最優解,但對有些問題確實有效。
使用貪心選擇的兩個條件:
1)局部最優,經過作出局部最優選擇來構造全局最優解,即對於最優化問題,經過貪心選擇局部最優,只剩下一個子問題須要求解。
2)最優子結構,和動態規劃問題類似,一個問題的最優解包含子問題的最優解。
小結:
在每一個貪心算法之下都有一個對應的動態規劃算法。對於貪心算法,肯定規則的關鍵因素和所求問題的關鍵因素相一致,好比活動集合選擇,就將按照活動結束時間排序。哈夫曼編碼須要將用詞頻率低的詞編碼長度比較長,就按照頻率進行二叉樹構造。
在此算法中介紹了哈夫曼編碼,主要是經過對頻率排序,構造二叉樹。感受這種模型,適合於訪問頻率低的數據須要放到樹底下的這種狀況。