【算法•日更•第三期】最貼切的貪心算法講解

▎敢問此間貪心爲什麼物?html

『引入』算法

  在平時咱們在解決一些事情時都會用到貪心的思想,我能夠實誠的告訴你,你可能已經會貪心了。spa

  好比說,在咱們買東西時,同種物品絕對是買便宜的那一家的貨啦,好比說西紅柿若是一家賣1元/斤,那麼你確定不會買1.2元/斤的。3d

  再好比說:你正在打遊戲,假如忽然天上掉下了一個箱子,那麼給你一個選擇,你要一個裝着大師劍的箱子,仍是要一個裝着一個爛大街的小木棍的箱子,固然,你必定會選擇前者。htm

  若是你會這樣作,那麼,恭喜你,你已經學會貪心了。blog

『貪心算法』遊戲

  貪心算法(又稱貪婪算法)是指,在對問題求解時,老是作出在當前看來是最好的選擇。也就是說,不從總體最優上加以考慮,他所作出的是在某種意義上的局部最優解(copy自百度)get

  說白了就是不管什麼狀況下都要取當前最優的方法,好比說我要去學校,假如學校在南面,那麼我必定會向南走,不然都會繞遠。數學

『計算機實例』it

  

  如上圖所示,這是一個有6個格子的方格陣,要求從每列中取出一個數,使總和最大。

  顯然,這道題是能夠貪心的,只要取每列中的最大的數就能夠了。

▎這麼簡單爲何不用?

『引入』

  

  如上圖所示,這是三塊蘋果,按大小分爲了大塊、中塊、小塊,那麼我們來作一個遊戲:不限時間,一共三塊,每吃完一塊後能夠接着吃剩下的,那麼比比誰吃得多。

  按照貪心的思路來講,絕對拼手速先吃到大塊,接下來呢?剩下啥吃啥唄。

  可是若是用動態規劃的思路的話,我會先吃小塊,不管對方吃中塊仍是大塊,都會趕在他吃完前拿走剩下的第三塊(若是這也比不過,你直接認慫就好了),顯然,任意兩塊都會比一塊多。

『貪心不必定是最優的』

  由上面生活中的例子能夠看出,貪心每次只選擇當前最優的方案,卻不在意這個選擇對整個大問題是否最優,顯然,對於這個問題來講這是不正確的。

  這正是貪心與動態規劃的不一樣。

『一個正常的例子』

  仍是以前的圖:

  

  可是題變了,如今我要從左下角走到右上角,求走過路徑上的最大值。

  要求:

  1)走過的格子不能再走;

  2)只能向上或向右;

  貪心算法求解:1 -> 3 -> 4 -> 6 。

  動態規劃求解:1 -> 2 -> 10 -> 6 。

  顯然動態規劃的解纔是最優的,而貪心卻不是。

 ▎怎樣才能貪心?

『貪心選擇』

  貪心選擇是指所求問題的總體最優解能夠經過一系列局部最優的選擇,即貪心選擇來達到。這是貪心算法可行的第一個基本要素,也是貪心算法與動態規劃算法的主要區別。貪心選擇是採用從頂向下、以迭代的方法作出相繼選擇,每作一次貪心選擇就將所求問題簡化爲一個規模更小的子問題。對於一個具體問題,要肯定它是否具備貪心選擇的性質,咱們必須證實每一步所做的貪心選擇最終能獲得問題的最優解。一般能夠首先證實問題的一個總體最優解,是從貪心選擇開始的,並且做了貪心選擇後,原問題簡化爲一個規模更小的相似子問題。而後,用數學概括法證實,經過每一步貪心選擇,最終可獲得問題的一個總體最優解。(copy自百度)

  一句話歸納這一堆(tuo)話:就是說必須得讓每一次的選擇都得是當前最優的。

『最優子結構』

  當一個問題的最優解包含其子問題的最優解時,稱此問題具備最優子結構性質。運用貪心策略在每一次轉化時都取得了最優解。問題的最優子結構性質是該問題可用貪心算法或動態規劃算法求解的關鍵特徵。貪心算法的每一次操做都對結果產生直接影響,而動態規劃則不是。貪心算法對每一個子問題的解決方案都作出選擇,不能回退;動態規劃則會根據之前的選擇結果對當前進行選擇,有回退功能。動態規劃主要運用於二維或三維問題,而貪心通常是一維問題 。(copy自百度)

  一句話歸納這一堆(tuo)話:就是說這道題必須得保證每一次的當前最優選擇對於全局來講都是最優的。


 

  所以,只有同時知足貪心選擇和最優子結構的題才能用到貪心。

 

原文出處:https://www.cnblogs.com/TFLS-gzr/p/11142693.html

相關文章
相關標籤/搜索