真正了解貪心算法,這是一篇精華入門總結...

2021-02-20 AI數據派


本文介紹了貪心算法,是一種在每一步選擇中都採取在當前狀態下最有利的選擇,從而得到最優的算法。

貪心算法

英語:greedy algorithm,又稱貪婪算法,是一種在每一步選擇中都採取在當前狀態下最好或最優(即最有利)的選擇,從而希望導致結果是最好或最優的算法。

比如在旅行推銷員問題中,如果旅行員每次都選擇最近的城市,那這就是一種貪心算法。

貪心算法在有最優子結構的問題中尤為有效。最優子結構的意思是局部最優解能決定全局最優解。簡單地說,問題能夠分解成子問題來解決,子問題的最優解能遞推到最終問題的最優解。

貪心算法與動態規劃的不同在於它對每個子問題的解決方案都做出選擇,不能回退。動態規劃則會保存以前的運算結果,並根據以前的結果對當前進行選擇,有回退功能。

貪心法可以解決一些最優化問題,如:求圖中的最小生成樹、求哈夫曼編碼……對於其他問題,貪心法一般不能得到我們所要求的答案。一旦一個問題可以通過貪心法來解決,那麼貪心法一般是解決這個問題的最好辦法。由於貪心法的高效性以及其所求得的答案比較接近最優結果,貪心法也可以用作輔助算法或者直接解決一些要求結果不特別精確的問題。在不同情況,選擇最優的解,可能會導致辛普森悖論(Simpson's Paradox),不一定出現最優的解。

貪心算法在Data Science領域都被資泛應用,特別是金融工程。其中一個貪心算法例子就是Ensemble method

基本步驟

步驟1:從某個初始解出發;

步驟2:採用迭代的過程,當可以向目標前進一步時,就根據局部最優策略,得到一部分解,縮小問題規模;

步驟3:將所有解綜合起來。

案例:換酒問題題目

小區便利店正在促銷,用 numExchange 個空酒瓶可以兌換一瓶新酒。你購入了 numBottles 瓶酒。

如果喝掉了酒瓶中的酒,那麼酒瓶就會變成空的。

請你計算最多能喝到多少瓶酒。

示例 1

輸入:numBottles = 9, numExchange = 3輸出:13解釋:你可以用 3 個空酒瓶兌換 1 瓶酒。所以最多能喝到 9 + 3 + 1 = 13 瓶酒。

示例 2

輸入:numBottles = 15, numExchange = 4輸出:19解釋:你可以用 4 個空酒瓶兌換 1 瓶酒。所以最多能喝到 15 + 3 + 1 = 19 瓶酒。

分析

這道題貪心的維度非常明顯,直接暴露在題目表面,即當前喝完所有飲料後變為空瓶加上已有空瓶後,最大限度的、貪心的兌換飲料,依次類推,直到手上的空瓶不足以兌換出一瓶飲料止。

代碼

根據上述分析,兌現為代碼如下:

class Solution(object):
    def numWaterBottles(self, numBottles, numExchange):
        """
        :type numBottles: int
        :type numExchange: int
        :rtype: int
        """
        sumb = numBottles
        empty = numBottles
        while empty // numExchange:
            bottle = empty // numExchange # 兌酒數
            empty = bottle + empty % numExchange # 空瓶子數
            sumb += bottle

        return sumb

相關焦點

  • (貪心算法系列一)
    ❞周一本周正式開始了貪心算法,在關於貪心算法,你該了解這些!中,我們介紹了什麼是貪心以及貪心的套路。「貪心的本質是選擇每一階段的局部最優,從而達到全局最優。」有沒有啥套路呢?正是因為貪心算法有時候會感覺這是常識,本就應該這麼做!所以大家經常看到網上有人說這是一道貪心題目,有人是這不是。這裡說一下我的依據:「如果找到局部最優,然後推出整體最優,那麼就是貪心」,大家可以參考哈。
  • 小夕的算法入門之路
    小夕都快要成XX入門指導專業戶了QAQ,小夕是要寫人工智慧和計算機乾貨的啊喂~好吧,問小夕如何入門算法的小夥伴太多了,還是寫一篇文章吧。
  • 貪心算法:加油站
    可以看一下公眾號左下角的「算法匯總」,「算法匯總」已經把題目順序編排好了,文章順序即刷題順序,這是全網最詳細的刷題順序了,方便錄友們從頭打卡學習,「算法匯總」會持續更新!❞134.貪心算法(方法一)直接從全局進行貪心選擇,情況如下:情況一:如果gas的總和小於cost總和,那麼無論從哪裡出發,一定是跑不了一圈的情況二:rest[i] = gas[i]-cost[i]為一天剩下的油,i從0開始計算累加到最後一站,如果累加沒有出現負數,說明從0出發,油就沒有斷過,那麼0就是起點。
  • 詳解貪心算法
    也就是說貪心算法並不從整體最優考慮,它所作出的選擇只是在某種意義上的局部最優選擇。當然,希望貪心算法得到的最終結果也是整體最優的。雖然貪心算法不能對所有問題都得到整體最優解,但對許多問題它能產生整體最優解。如單源最短路經問題,最小生成樹問題等。在一些情況下,即使貪心算法不能得到整體最優解,其最終結果卻是最優解的很好近似。
  • 可能是關於 kNN 算法最詳細的入門總結
    其次,學習路徑一定程度地被魔化了:很多人說學機器學習要先去啃《西瓜書》、《統計學習方法》這些大篇幅的數學公式算法書,很容易讓新手放棄。要說它不對也有道理。一是可能你並沒有真正想去學它,沒發現它有用或者至少有趣的地方;二是機器學習真的沒有那麼難入門,前提是找到合適自己的方法。所以想清楚為什麼學和從哪兒開始學很重要。
  • 每日一道貪心算法
    貪心算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。貪心算法是很常見的算法之一,這是由於它簡單易行,構造貪心策略簡單。但是,它需要證明後才能真正運用到題目的算法中。一般來說,貪心算法的證明圍繞著整個問題的最優解一定由在貪心策略中存在的子問題的最優解得來的。 對於本例題中的3種貪心策略,都無法成立,即無法被證明,解釋如下: (1)貪心策略:選取價值最大者。
  • 程式設計師算法基礎——貪心算法
    前言貪心是人類自帶的能力,貪心算法是在貪心決策上進行統籌規劃的統稱。
  • 貪心算法:合併區間
    局部最優可以推出全局最優,找不出反例,試試貪心。那有同學問了,本來不就應該合併最大右邊界麼,這和貪心有啥關係?有時候貪心就是常識!intervals[i][1]);            } else {                result.push_back(intervals[i]);            }        }        return result;    }};空間複雜度:O(1),不算result數組(返回值所需容器佔的空間)總結
  • Java 實現貪心算法實例介紹
    假定問題可以分解,並且在過程的每一步都選擇局部最優即「貪心選擇」,那麼可以稱為貪心算法。這裡的重點是問題「可拆分」:即問題可以被描述為一組相似的子問題。大多數情況下,貪心算法都採用遞歸實現。即使有諸多限制,像計算資源限制、限制執行時間、API 或其它限制,貪心算法仍然有辦法找到合理的解決方案。
  • 一文詳解貪心算法
    也就是說貪心算法並不從整體最優考慮,它所作出的選擇只是在某種意義上的局部最優選擇。當然,希望貪心算法得到的最終結果也是整體最優的。雖然貪心算法不能對所有問題都得到整體最優解,但對許多問題它能產生整體最優解。如單源最短路經問題,最小生成樹問題等。在一些情況下,即使貪心算法不能得到整體最優解,其最終結果卻是最優解的很好近似。
  • 一文搞懂貪心算法
    顧名思義,貪心算法總是作出在當前看來最好的選擇。也就是說貪心算法並不從整體最優考慮,它所作出的選擇只是在某種意義上的局部最優選擇。當然,希望貪心算法得到的最終結果也是整體最優的。雖然貪心算法不能對所有問題都得到整體最優解,但對許多問題它能產生整體最優解。如單源最短路經問題,最小生成樹問題等。
  • 小白帶你學---貪心算法
    貪心算法(Greedy Algorithm) 簡介貪心算法,又名貪婪法,是尋找最優解問題的常用方法,這種方法模式一般將求解過程分成
  • 這幾道經典例題幫你輕鬆搞透貪心算法
    貪心算法最關鍵的部分在於貪心策略的選擇,貪心選擇的意思是對於所求問題的整體最優解可以通過一系列的局部最優選擇求得。而必須注意的是,貪心選擇必須具備無後效性,也就是某個狀態不會影響之前求得的局部最優解。運動貪心算法解決相應問題時會比較簡單和高效,省去了尋找全局最優解很多不必要的窮舉操作,由於貪心算法問題並沒有固定的貪心策略,所以唯一的難點就是找到帶求解問題的貪心策略,但畢竟熟能生巧嘛,算法的基本思想總是固定不變的。
  • 用經典例題輕鬆幫你搞定貪心算法
    貪心算法最關鍵的部分在於貪心策略的選擇,貪心選擇的意思是對於所求問題的整體最優解可以通過一系列的局部最優選擇求得。而必須注意的是,貪心選擇必須具備無後效性,也就是某個狀態不會影響之前求得的局部最優解。運動貪心算法解決相應問題時會比較簡單和高效,省去了尋找全局最優解很多不必要的窮舉操作,由於貪心算法問題並沒有固定的貪心策略,所以唯一的難點就是找到帶求解問題的貪心策略,但畢竟熟能生巧嘛,算法的基本思想總是固定不變的。
  • C語言最常用的貪心算法就這麼被攻克了
    貪心算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。貪心算法沒有固定的算法框架,算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備無後效性(即某個狀態以後的過程不會影響以前的狀態,只與當前狀態有關。)
  • leetcode算法之貪心
    今天來盤一盤 **貪心算法 ** 這類題目使用python刷題分類整理的筆記,請參考: https
  • 來見識一下貪心算法:Jump Game
    >在這個算法題中,我們將看到貪心算法的應用,今天要講的是LeetCode的第55號題目,Jump Game,這個題目是什麼意思呢?答案是可以的,因為雖然我們不能從0跳到1,但是可以從2直接跳到1,從這兩種情況下你能得到什麼啟示?以上兩種情況給我的啟示就是,能否跳到當前位置取決於當前位置之前的所有位置上的步數,有的同學會說這不是廢話嗎,是的,這是一句廢話,這句廢話會引導我們進一步思考,那就是這到底是怎麼的取決呢?
  • 跟耿老師學Java:貪心算法與老鼠走迷宮
    單擊閱讀原文下載原始碼:連結:https://pan.baidu.com/s/18EvAMu89mjxusQf_8LnPxA提取碼: 8ty61..貪心算法   貪心算法(又稱貪婪算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。
  • C語言最常用的貪心算法就這麼被攻略了
    貪心算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。貪心算法沒有固定的算法框架,算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備無後效性(即某個狀態以後的過程不會影響以前的狀態,只與當前狀態有關。)
  • 一個算法工程師的2020年終總結
    分成三個部分:個人篇,總結一下個人生活的一些變化。二、感悟篇,總結一下這一年自己感觸最大的幾個想法。三、未來篇、談談自己對未來的一些期許。個人總結1. 事業今年年初在搜狗實習,因為之前完全沒接觸過推薦,算是借著這個機會了解了推薦是幹什麼的,瀏覽了項亮的《推薦系統實踐》,也在工作中接觸了大數據處理、召回冷啟動等,但是整體來說因為各種原因還是收穫甚微。寒假早早開始刷題,看了看推薦領域的論文,總結了下基礎知識,過了過《百面機器學習》,然後暑期實習就陸續開始了。