轉載:http://hi.baidu.com/abcdcamey/item/0d1d6746c9ef4616896d10ac算法
動態規劃和貪心算法的區別
動態規劃和貪心算法都是一種遞推算法
均有局部最優解來推導全局最優解
不一樣點:
貪心算法:
1.貪心算法中,做出的每步貪心決策都沒法改變,由於貪心策略是由上一步的最優解推導下一步的最優解,而上一部以前的最優解則不做保留。
2.由(1)中的介紹,能夠知道貪心法正確的條件是:每一步的最優解必定包含上一步的最優解。
動態規劃算法:
1.全局最優解中必定包含某個局部最優解,但不必定包含前一個局部最優解,所以須要記錄以前的全部最優解
2.動態規劃的關鍵是狀態轉移方程,即如何由以求出的局部最優解來推導全局最優解
3.邊界條件:即最簡單的,能夠直接得出的局部最優解
==============================================================================
貪心算法與動態規劃
貪心法的基本思路:
從問題的某一個初始解出發逐步逼近給定的目標,以儘量快的地求得更好的解。當達到某算法中的某一步不能再繼續前進時,算法中止。
該算法存在問題:
1. 不能保證求得的最後解是最佳的;
2. 不能用來求最大或最小解問題;
3. 只能求知足某些約束條件的可行解的範圍。實現該算法的過程:
從問題的某一初始解出發;
while 能朝給定總目標前進一步 do
求出可行解的一個解元素;
由全部解元素組合成問題的一個可行解
貪心算法最經典的例子,給錢問題。
好比中國的貨幣,只看元,有1元2元5元10元20、50、100
若是我要16元,能夠拿16個1元,8個2元,可是怎麼最少呢?
若是用貪心算,就是我每一次拿那張可能拿的最大的。
好比16,我第一次拿20拿不起,拿10元,OK,剩下6元,再拿個5元,剩下1元
也就是3張 十、五、1。
每次拿能拿的最大的,就是貪心。
可是必定注意,貪心獲得的並非最優解,也就是說用貪心不必定是拿的最少的張數
貪心只能獲得一個比較好的解,並且貪心算法很好想獲得。
再注意,爲何咱們的錢能夠用貪心呢?由於咱們國家的錢的大小設計,正好可使得貪心算法算出來的是最優解(通常是個國家的錢幣都應該這麼設計)。若是設計成別的樣子狀況就不一樣了
好比某國的錢幣分爲 1元3元4元
若是要拿6元錢 怎麼拿?貪心的話 先拿4 再拿兩個1 一共3張錢
實際最優呢? 兩張3元就夠了
求最優解的問題,從根本上說是一種對解空間的遍歷。最直接的暴力分析容易獲得,最優解的解空間一般都是以指數階增加,所以暴力窮舉都是不可行的。
最優解問題大部分均可以拆分紅一個個的子問題,把解空間的遍歷視做對子問題樹的遍歷,則以某種形式對樹整個的遍歷一遍就能夠求出最優解,如上面的分析,這是不可行的。
貪心和動態規劃本質上是對子問題樹的一種修剪。兩種算法要求問題都具備的一個性質就是「子問題最優性」。即,組成最優解的每個子問題的解,對於這個子問題自己確定也是最優的。若是以自頂向下的方向看問題樹(原問題做根),則,咱們每次只須要向下遍歷表明最優解的子樹就能夠保證會獲得總體的最優解。形象一點說,能夠簡單的用一個值(最優值)表明整個子樹,而不用去求出這個子樹所可能表明的全部值。
動態規劃方法表明了這一類問題的通常解法。咱們自底向上(從葉子向根)構造子問題的解,對每個子樹的根,求出下面每個葉子的值,而且以其中的最優值做爲自身的值,其它的值捨棄。動態規劃的代價就取決於可選擇的數目(樹的叉數)和子問題的的數目(樹的節點數,或者是樹的高度?)。
貪心算法是動態規劃方法的一個特例。貪心特在,能夠證實,每個子樹的根的值不取決於下面葉子的值,而只取決於當前問題的情況。換句話說,不須要知道一個節點全部子樹的狀況,就能夠求出這個節點的值。一般這個值都是對於當前的問題狀況下,顯而易見的「最優」狀況。所以用「貪心」來描述這個算法的本質。因爲貪心算法的這個特性,它對解空間樹的遍歷不須要自底向上,而只須要自根開始,選擇最優的路,一直走到底就能夠了。這樣,與動態規劃相比,它的代價只取決於子問題的數目,而選擇數目總爲1。spa