1. 分治法算法
基本思想:將一個規模爲n的問題分解爲k個規模較小的子問題,這些字問題互相獨立且與原問題相同。遞歸的解這些子問題,而後將各子問題的階合併獲得原問題的解。設計
eg:排序
二分搜索:給定已排序好的額n個元素,如今要在這n個元素中找出一特定元素x遞歸
歸併排序 快速排序效率
2. 動態規劃搜索
動態規劃與分治法相似,其基本思想也是講待求解問題分解成若干個子問題,先求解子問題,而後從這些子問題的解獲得原問題的解。與分治法不一樣的是適用於動態規劃法求解的問題,經分解獲得的子問題每每不是相互獨立的。若用分治法來解這類問題,則經分解獲得的子問題每每不是相互獨立的。若用分治法來解這類問題,則分解獲得的子問題數目太多,以致於最後解決原問題須要耗費指數時間,然而不一樣子問題數目經常只有多項式量級。在用分治法求解時,有些子問題被重複計算了許屢次。若是咱們可以保存已解決的子問題的答案,而在須要時再找出以求得的答案,這樣就能夠避免大量的重複計算,從而獲得多項式時間的算法。爲了達到這個目的,咱們能夠用一個表來記錄全部已解決的子問題的答案。無論子問題之後是否被用到,只要它被計算過,就將其結果填入表中。這就是動態規劃法的基本思路。具體的動態規劃算法多種多樣,但它們都具備相同的填表格式。動態規劃
能夠用動態規劃算法解決問題所具備的兩個重要性質:時間
最優子結構性質:當問題的最優解包含了其子問題的最優解時,稱該問題具備最優子結構性質。在動態規劃算法中,問題的最優子結構性質使得咱們可以以自底向上的方式遞歸從子問題的最優解逐步構造出整個問題的最優解。同時,它也使得咱們能在相對小的子問題空間中考慮問題。表格
子問題重疊性:在用遞歸法自頂向下解此問題時,每次產生的子問題並不老是新問題,有些子問題被反覆計算屢次。動態規劃正是利用了這些子問題的重疊性質,對每個子問題只解一次,然後將其保存在一個表格中,當再次須要解此問題時,只是簡單地用常數時間查看一下結果。一般不一樣的子問題個數隨輸入問題的大小呈多項式增加。所以,用動態規劃算法只須要多項式時間,從而得到較高的解題效率。
動態規劃算法一般用於求解具備某種最優性質的問題。在這類問題中,可能會有許多可行解。每個解都對應一個值,咱們但願找到具備最優值(最大值或最小值)的那個解。設計一個動態規劃算法,一般按以下的幾個步驟進行:
前三個步驟是動態規劃的基本步驟,在只須要求出最優值的情形,第四步能夠省去。若須要求出問題的一個最優解,則必須執行步驟4,在步驟3中計算最優值時,一般需記錄更多的信息,以便在步驟4中根據所記錄的信息,快速構造一個最優解。
eg:
矩陣連乘問題:給定n個矩陣{A1,A2,.....,An},其中Ai與Ai+1是可乘的,咱們要計算出n個矩陣的連乘積。
3. 貪心算法
當一個問題具備最優子結構性質時,咱們會想到用動態規劃法去求解。但有時會有更簡單有效的辦法。
能夠用貪心算法求解的的問題通常具備兩個重要的性質:貪心選擇性和最優子結構性質。
貪心選擇性:指所求問題的總體最優解能夠經過一系列局部最優的選擇來達到。這是貪心算法可行的第一個基本要素,也是貪心算法與動態規劃算法的主要區別。在動態規劃算法中,每步所做的選擇每每依賴於相關子問題的解,於是只有在接觸相關子問題後,才能作出選擇。貪心算法中,僅在當前狀態下作出最好選擇,即局部最優選擇,而後再去解做出這個選擇後產生的相應子問題。貪心算法所做的貪心選擇能夠依賴於以往所作過的選擇,但毫不依賴於未來所做的選擇,也不依賴於子問題的解。正式因爲這種差異,動態規劃算法一般以自底向上的方式解各子問題,而貪心算法則一般以自頂向下的方式進行,以迭代的方式做出相繼的貪心選擇,每作一次貪心選擇就將所求問題簡化爲一個規模更小的子問題。
最優子結構性質:當一個問題的最優解包含着它的子問題的最優解時,稱此問題具備最優子結構性質。問題所具備的這個性質是該問題可用動態規劃算法和貪心算法求解的一個關鍵特徵。