貪心算法

參考:http://blog.csdn.net/a925907195/article/details/41314549

一、基本概念

所謂貪心算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的局部最優解。
貪心算法沒有固定的算法框架,算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備無后效性,即某個狀態以后的過程不會影響以前的狀態,只與當前狀態有關。
所以對所采用的貪心策略一定要仔細分析其是否滿足無后效性。

</br>

二、貪心算法的基本思路

1.建立數學模型來描述問題。
2.把求解的問題分成若干個子問題。
3.對每一子問題求解,得到子問題的局部最優解。
4.把子問題的解局部最優解合成原來解問題的一個解。

利用貪心算法解題,需要解決兩個問題:

  • 一是問題是否適合用貪心法求解。我們看一個找幣的例子,如果一個貨幣系統有三種幣值,面值分別為一角、五分和一分,求最小找幣數時,可以用貪心法求解;如果將這三種幣值改為一角一分、五分和一分,就不能使用貪心法求解。用貪心法解題很方便,但它的適用范圍很小,判斷一個問題是否適合用貪心法求解,目前還沒有一個通用的方法,在信息學競賽中,需要憑個人的經驗來判斷。
  • 二是確定了可以用貪心算法之后,如何選擇一個貪心標準,才能保證得到問題的最優解。在選擇貪心標準時,我們要對所選的貪心標準進行驗證才能使用,不要被表面上看似正確的貪心標準所迷惑,

</br>

三、貪心算法的實現框架

從問題的某一初始解出發;
while (能朝給定總目標前進一步)
{
利用可行的決策,求出可行解的一個解元素;
}
由所有解元素組合成問題的一個可行解;

</br>

四、經典例子

[均分紙牌]有N堆紙牌,編號分別為1,2,…,n。每堆上有若干張,但紙牌總數必為n的倍數.可以在任一堆上取若干張紙牌,然后移動。移牌的規則為:在編號為1上取的紙牌,只能移到編號為2的堆上;在編號為n的堆上取的紙牌,只能移到編號為n-1的堆上;其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上。現在要求找出一種移動方法,用最少的移動次數使每堆上紙牌數都一樣多。例如:n=4,4堆紙牌分別為:① 9 ② 8 ③ 17 ④ 6 移動三次可以達到目的:從③取4張牌放到④ 再從③區3張放到②然后從②去1張放到①。
輸入輸出樣例:4
9 8 17 6
屏幕顯示:3

算法分析:設a[i]為第I堆紙牌的張數(0<=I<=n),v為均分后每堆紙牌的張數,s為最小移動次數。
我們用貪心算法,按照從左到右的順序移動紙牌。如第I堆的紙牌數不等于平均值,則移動一次(即s加1),分兩種情況移動:
1.若a[i]>v,則將a[i]-v張從第I堆移動到第I+1堆;
2.若a[i]<v,則將v-a[i]張從第I+1堆移動到第I堆。
為了設計的方便,我們把這兩種情況統一看作是將a[i]-v從第I堆移動到第I+1堆,移動后有a[i]=v; a[I+1]=a[I+1]+a[i]-v.
在從第I+1堆取出紙牌補充第I堆的過程中可能回出現第I+1堆的紙牌小于零的情況。
如n=3,三堆指派數為1 2 27 ,這時v=10,為了使第一堆為10,要從第二堆移9張到第一堆,而第二堆只有2張可以移,這是不是意味著剛才使用貪心法是錯誤的呢?
我們繼續按規則分析移牌過程,從第二堆移出9張到第一堆后,第一堆有10張,第二堆剩下-7張,在從第三堆移動17張到第二堆,剛好三堆紙牌都是10,最后結果是對的,我們在移動過程中,只是改變了移動的順序,而移動次數不便,因此此題使用貪心法可行的。

[最大整數]設有n個正整數,將它們連接成一排,組成一個最大的多位整數。
例如:n=3時,3個整數13,312,343,連成的最大整數為34331213。
又如:n=4時,4個整數7,13,4,246,連成的最大整數為7424613。
輸入:n
N個數
輸出:連成的多位數
算法分析:此題很容易想到使用貪心法,在考試時有很多同學把整數按從大到小的順序連接起來,測試題目的例子也都符合,但最后測試的結果卻不全對。按這種標準,我們很容易找到反例:12,121應該組成12121而非12112,那么是不是相互包含的時候就從小到大呢?也不一定,如12,123就是12312而非12123,這種情況就有很多種了。是不是此題不能用貪心法呢?
其實此題可以用貪心法來求解,只是剛才的標準不對,正確的標準是:先把整數轉換成字符串,然后在比較a+b和b+a,如果a+b>=b+a,就把a排在b的前面,反之則把a排在b的后面。

Leetcode典型題:
122 Best Time to Buy and Sell Stock II
134 Gas Station
402 Remove K Digits

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 非準程序員請繞道,這篇文章不是你想看的。(而且很長,雖然滿滿的干貨) 寫下這個字的時間點是23:53,是時候關掉電...
    謝培陽閱讀 1,242評論 1 5
  • 概述 在前文中解釋了動態規劃的基本思想,動態規劃通過將一個問題劃分為規模更小的有限個子問題進行求解,一般用于求解最...
    CodingTech閱讀 2,707評論 0 10
  • 貪心算法 當具有最優子結構性質的時候,可以使用動態規劃算法也可以使用貪心算法 最優子結構性質、貪心選擇性質 雖然貪...
    冰源閱讀 1,026評論 0 0
  • 在現代社會,管理能力已成為國際化人才的一種必備素養,美國《財富》雜志多年前就曾斷言:到2010年,項目管理將成為美...
    Oliviakar閱讀 338評論 0 0
  • 筆者寫這篇連載紀實文章,僅僅只是為了記錄自己在美國職業保齡球聯盟中作為保齡球員,以及起步做保齡球教練的點滴心得,沒...
    北美K哥閱讀 864評論 0 6