"貪心....是好事,貪心是對的,貪心是成功的"
貪心演算法(又稱
貪婪演算法
)是指,在對
問題求解
時總是做出在當前看來是最好的選擇。不從整體最優上加以考慮,他所做出的僅是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。
——即使乙個貪心演算法不能精確得到最優解,它也能夠產生乙個保證接近於最優解的解
分析風格
i)貪心演算法領先概念
ii)交換論證
著名應用
圖中的最短路徑
最小生成樹問題
實現資料壓縮構造huffman碼
最小生成樹與長期研究的聚類問題之間有趣關係
最小費用有向樹問題
區間排程:貪心演算法領先
區間排程問題:
我們有一組需求,第i個需求始於s(i)且止於f(i)的時間區間相對應
如果沒有兩個需求在時間上重疊,我們就說需求的子集是相容的
我們的目標是接受乙個最大的相容子集:最優子集
貪心演算法
初始 令r是所有需求的集合,設a為空
while r不空
選擇乙個有最小結束時間的需求i屬於r
把i加到a中
從r中刪除與需求i不相容的所有需求
endwhile
返回集合a作為被接受的需求集合
命題:
a是乙個相容的需求集——用i1,i2,..,in表示易證
對所有指標r<=k,有f(i~r)<=f(j~r)——(設最優集合o用j1,j2,....,jn表示)
歸納,當i=1時顯然成立
當f(i~r-1)<=f(j~r-1)時,f(j~r-1)<=s(j~r),所以f(i~r-1)<=s(j~r)
根據構造原理,j~r考慮在a集i~r構造中,所以f(i~r)<=f(j~r)
歸納成立
貪心演算法返回乙個最優的集合a
反證,如果a不是最優的(k個),那麼o一定有更多的需求(m個)
設m>k,令r=k,由f(i~k)<=f(j~k),r非空,然而演算法結束,矛盾
推廣
i)動態排程:排程員在獲悉全部需求集合之前做出接受或者拒絕某個需求的決定,
如果排程員為收集其他資訊而話費過多時間,需求者可能會失去耐心放棄而離開
ii)加權排程:需求附加的價值(權),每個需求 i可能有乙個vi值
——最後的目標是令∑vi最大
乙個有關的問題:排程所有的區間
問題即用最少的行數(資源)覆蓋所有的需求
區間集合的深度:通過時間線上任何一點的最大區間數
命題:在任何區間劃分的例項中,資源數必須至少是區間集合的深度易證
演算法:
為集合深度
任意打破區間的並列,根據開始時間排序
設i1,i2,.....,in為上述時間排序for j-1,2,...,n
for 每個按照上述次序領先於ij並且與它重疊的區間ii,從對ij的考慮中排除ii的標籤
endfor
if 在中存在任何還沒有被排除的標籤
then分配乙個沒被排除的標籤給ij
else
保留ij不分配標籤
endif
endfor
命題:執行上述演算法,每個區間將被分配乙個標籤,且沒有兩個重疊的區間接受同樣的標籤1)先指出不會有區間在結束時分配不到標籤,假設存在t個區間在次序上比它早且重疊,那麼1+t<=d,於是t<=d-1,那麼至少還有1個標籤可以用
2)考慮任何兩個重疊的區間,i時間次序上領先i『,那麼演算法考慮i時候,i』已經被排除標籤
定理:上述貪心演算法使用與集合深度等量的資源為每個區間安排乙個資源,這是所需資源的最優數量
最小延遲排程——乙個交換論證
每個任務有最晚完成時間di,和需要持續的時間ti。
真實安排這些任務時,每個任務真實的開始時間si和結束時間fi。稱乙個任務的延遲時間為fi-di。
目的:找乙個安排任務的方案,使所有任務的總的延遲最小。
設計演算法:
1)按長度ti的次序順序排列,短任務盡快結束——不妥
2)di-ti——有效鬆弛時間增長對任務排序——不妥
3)最早截止時間優先
分析演算法:
交換論證——考慮乙個最優排程o,逐步修改,每步確保其最優性,最終轉化為最優排程
空閒時間——存在任務要做,機器卻空閒,流失的時間
命題:存在乙個沒有空閒時間的最優排程
命題:所有沒有逆序也沒有空閒時間的排程有相同的最大延遲
定理:存在乙個既沒有逆序也公尺有空閒時間的最優的排程
交換逆序,最大延遲不大於之前o的最大延遲
定理:由這個貪心演算法產生的排程a有最優的最大延遲
經典貪心演算法 貪心演算法概述
貪心演算法具有最優子問題結構,它的特點是 短視 每次選擇對當前局面最有利的決策,來一步步獲得最優解。我個人認為,貪心不是乙個具體的方法,而是一類方法,貪心演算法的關鍵不在於想到,而在於正確性的證明。要證明乙個貪心演算法是正確的,需要證明我們可以把乙個最優解逐步轉化為我們用貪心演算法所得到的解,而解不...
《趣學演算法》之貪心演算法(上)
乙個貪心演算法總是做出當前最好的選擇,也就是說,它期望通過區域性最優選擇從而得到全域性最優的解決方案。演算法導論 貪心演算法秘籍 有一天,加勒比海盜們截獲了一艘裝滿古董的貨船,每件古董都價值連城,一旦打碎就失去價值。雖然海盜船足夠大,但載重量為 c,每件古董的重量為 wi 海盜們該如何把盡可能多數量...
演算法 貪心演算法
把乙個複雜問題分解為一系列較為簡單的區域性最優選擇,每乙個選擇都是對當前解的乙個擴充套件,知道獲得問題的完整解。在解決問題的策略上目光短淺,只根據當前已有的資訊做出選擇,而且一旦做出了選擇,不管將來有什麼結果這個選擇都不會改變。換言之,貪心法並不是從整體最優考慮,它所做出的選擇只是在某種意義上的區域...