入門四種算法思想之一——貪心算法

首先我們應該知道,貪心算法和分治算法、回溯算法、動態規劃四種算法。只能說是幾種是算法思想,而並不是具體的算法,我們學會他們的目的是來指導我們設計具體的算法和編碼等。

      貪心算法,又稱爲貪婪法,即在對問題進行求解時,總是考慮當前情況下的最優解(如同人一樣,在面對一些情況時,總是選擇當前情況的最優解),而不是全局考慮下的最優解。

        這種方法就是將整個事件分爲若干個步驟,每一個步驟都按照貪心的策略,選取當前情況下的最優的選擇(局部最優),然後希望這所有最優解堆疊出來的結果也是最優解。

基本步驟

  • 將一個大的問題分解爲若干步(比如去走親戚要走n段路)
  • 每一步都使用貪婪算法,找到每一步的最優解(如果每段路都有n種走法,則選取最優的路段)
  • 將所有部分的最優解構成爲大的問題的一個解(將n段路合到一塊)

貪心算法存在的問題

  • 因爲每一步都僅僅按照當前情況的最優解來選擇,所以當按照全局考慮時,並不一定是最優解
  • 不能用來求最大最小問題,因爲結果本來就不一定是最優解

適用對象

    局部最優解合起來也是全局的最優解

再舉上面走路的問題,進行分析,當我們面對如何走路時,當不知道整體情況如何時,該怎樣選擇路程呢。即每走到一個路口都選擇當前情況下的最短路徑。

第一步:

      整段路程可以分爲n段

第二步:

      每個分叉即爲不同的選擇,紅色即爲每一段的最優解

  • 當在A時,有AC,AB兩條路,選擇短的AB。
  • 在B點時有BD,BE選擇最優解BE。
  • 在E點時,有EF,EG,選擇最優解EG。
  • 在G點時,無法選擇,則只能走G->AA這條路。

第三步:

      將每一段的最優解合併起來,即爲這段路程的一種解決方法(A->B->E->G->AA)

實際情況

       如上圖從A點走到AA點,看似紅線是每一步的都是當前情況下的最優解,但是從整體來看A->C->AA纔是整體情況下的最優解,所以貪心算法也存在很大問題,使用貪心算法,儘管每一步得到的結果都是最優解;但是從整體來看,得到的並非最優解。

 

或者另一個例子

現在有重爲100千克,80千克和1千克的石頭,當需要總重量一定時,如何選擇才能使石頭數量最少。

分析:

如果按照貪心算法來寫的話,若要使石頭數量最少,則需要先選擇重量最大的石頭,然後在往下找。

此時若需要240千克石頭,按照貪心算法則石頭組成爲2*100千克+40*1千克,42塊石頭

而實際最少方案爲3*80千克,3塊石頭。

 

所以在使用時,一定要分析好貪心算法的思想是否適用,從而再確定出最好的思想方法。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章