總結 貪心演算法 貪心演算法入門總結

2021-10-25 13:05:50 字數 1684 閱讀 7222

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

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

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

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

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

貪心演算法在data science領域都被資泛應用,特別是金融工程。其中乙個貪心演算法例子就是ensemble method

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

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

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

小區便利店正在**,用 numexchange 個空酒瓶可以兌換一瓶新酒。你購入了 numbottles 瓶酒。

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

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

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

輸入: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

貪心演算法總結

第一套題主要用貪心演算法來解決問題,貪心演算法簡單來說就是從區域性最優解,進而求得整體最優解,其中難點就是選擇貪心標準,貪心標準的選擇選的巧妙問題就會變的很簡單,比如第一題搬桌子的題,就是把房間轉化為對應的走廊號,問題就簡化了很多。貪心演算法的題目有的可以很簡單的看出來,常見典型的題有,揹包問題,最...

貪心演算法總結

在求最優解問題的過程中,依據某種貪心標準,從問題的初始狀態出發,直接去求每一步的最優解,通過若干次的貪心選擇,最終得出整個問題的最優解,這種求解方法就是貪心演算法。從貪心演算法的定義可以看出,貪心演算法不是從整體上考慮問題,它所做出的選擇只是在某種意義上的區域性最優解,而由問題自身的特性決定了該題運...

貪心演算法總結

貪心演算法聽課的時候本著一重迴圈排序,找到區域性最優解,迴圈一次由區域性最優過渡到整體最優,這種單一的模式,後來做到田忌賽馬問題開始發現貪心並不只是乙個迴圈來解決的問題思想,他更多的應該更加強調的是尋找區域性最優解由區域性最優的最優即為最終解的過程 不一定要用到迴圈也不一定只用一次迴圈 其中主要的幾...