基本算法思想之貪心算法

貪心算法

基本概念
  • 概念
    所謂貪心算法,就是把整個問題分解成多個步驟,在每個步驟都選取當前步驟的最佳方案,知道所有步驟結束。對每一步驟,既不考慮之前步驟對當前步驟的影響,也不考慮當前步驟對後續步驟的影響,只需要選出當前步驟的最佳方案。簡單來說,就是走一步看一步,只考慮當前的狀況。

  • 理解
    瞭解了貪心算法的概念,下面我們來以最少硬幣問題爲例,介紹一下貪心算法的應用規則和侷限性。

    話說有一個人,他帶着面值分別爲 1元、5元和 10元的硬幣去買東西(每種面值的硬幣都很充足),但是,對於一件價格爲 27元 的商品,他希望用最少數量的硬幣來買這件商品,現在問你他要怎樣支付。
    按照常識,我們知道,要想支付的硬幣數量最少,要優先使用 兩個 面值爲 10元 的硬幣,然後再使用 一個 面值爲 5元 的硬幣,最後 兩個 使用 1元 的硬幣,這樣,我們使用使用的硬幣數量最少。

    上面說到的選擇支付方案就是貪心思想的應用。拿硬幣的時候,我們並沒有從整體出發,而是隻看當前,使當前使用的硬幣數量最少,再考慮下一個步驟。換句話說,就是 局部最優達到全局最優 ,從而得到解決問題的最佳方案。

    但是,局部最優一定就能夠達到全局最優嗎?答案是否定,甚至在有最優解的情況下無法得到這個最優解。
    同樣還是上面的問題,現在更改一下面值。
    (1)這個人有 1元、2元、4元、5元、6元 面值的硬幣,買一個 9元 的商品,按照貪心的思想,付錢的方案就是 6元X1 + 2元X1 + 1元X1 ,一共三個硬幣,但是很明顯,這不是我們希望的最佳方案,最佳方案是 5元X1 + 4元X1 ,一共兩個硬幣。
    (2)這個人現在換成了 2元、3元、5元的硬幣,還是支付 9元 ,還是按照貪心的思想,一個 5元硬幣,加上一個 3元硬幣,現在我們還需要 一個1元硬幣,但是他沒有 1元硬幣,所以此時無解。但是實際上是有解的,使用貪心的算法反而使問題陷入了無解。
    所以,局部最優並不一定會達到全局最優,貪心算法需要問題滿足一定條件。就上面的硬幣來說,要能夠使用貪心算法,面值必須滿足當 前面值大於比它小的所有硬幣的面值之和 ,這樣就可以使用貪心算法。對於任意麪值的硬幣,就需要採用動態規劃算法了,貪心算法就不能解決問題了。

  • 應用
    對貪心思想有了一定的瞭解之後,就看看什麼樣的問題可以使用貪心算法。

    當問題滿足下面的特徵時,可以應用貪心算法:
    1.最優子結構性質。簡單地說,當一個問題的最優解包含他的子問題的最優解,能夠由局部最優得到全局最優,就說這個問題有最優子結構性質。
    2.貪心選擇性質。也就是說,問題的最優解能夠在一系列
    子問題的最優解中通過選擇得到。

    貪心算法沒有固定的結構,關鍵在於如何選擇解題策略,與其說是算法,更像是一種思想,就是由局部最優擴展到全局最優的思想。
    雖然在某些問題中無法由貪心算法得到最優解(如旅行商問題),但是如果是只需要最優解的一個近似解,仍然可以使用貪心的算法。

發佈了9 篇原創文章 · 獲贊 1 · 訪問量 1347
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章