演算法課筆記系列(二) 貪心演算法

2021-07-10 16:21:40 字數 3441 閱讀 4532

貪心演算法就是一種非常直觀的演算法,對於乙個問題,只關心它目前最優的解決方案,不考慮未來的發展。但往往,這種只考慮現在的演算法就是最優的演算法。第一步將問題分為可分的一步一步,第二步對每一步進行當前的最優計算,第三部將得到的結果最優,往往是得到的全域性最優的結果。

下面還是通過課上講解的幾個例子來深入學習貪心演算法。

(1)區間排程

如上圖所示,第j個工作任務開始時間為sj,結束時間為fj。兩個工作任務之間如果沒有重疊區域,就認為它們是相容的。現在問題的目標是要找到可以同時相容的工作任務的最大子集,即最多數量。

現在對於這個問題考慮一些很自然的思路。針對這個問題,我們要選擇工作。不難想出,選出所有與已經選好的工作任務相容的工作任務即可。那麼如何對工作任務進行選擇呢?有如下幾種考慮:

3)  最短間隔:fj-sj進行公升序排列

4)  最少衝突:對於每乙個任務h,計數與它衝突的任務數cj。對cj進行公升序排列

對於(1),(3)和(4)都能夠找到反例來證明其不是最優。

其中深色任務是我們選擇的,但是都並不是正確的選擇。

我們再來考慮第(2)種方案。對最早結束時間進行公升序排列,該演算法為貪心演算法,即越多越早結束的任務,同時相容的工作更多的可能性更大。

如果sj小於下乙個任務的fj,那麼這兩個任務就是相容的。

該演算法的複雜度為

對於乙個問題,我們首先使用貪心演算法得出乙個結果,再與它的最優解(可能不止乙個)進行比較,看該貪心演算法是否為最優。比較方法可以通過找反例,或者通過交換來證明。

證明如下:

假設該貪心演算法不是最優的,那麼我們來看會發生什麼。

令i1,i2,…ik代表通過貪心演算法選擇的任務的集合,j1,j2,…jk代表最優的解決方案選擇的任務的集合,假設對於兩個集合前r個值一一對應相等的元素個數的最大值為r。

即下乙個i(r+1)

任務在j(r+1)任務之前結束,那麼將i(r+1)替換j(r+1),那麼原結論仍然成立(i(r+1)任務在j(r+1)任務之前結束),但是現在兩個集合一一對應相等的元素個數的最大值變為r+1,與原來的假設矛盾。因此得證。

(2)區間分割

現有如下場景:

每一場講座j開始時間為sj,結束時間為fj。現在需要找到能夠安排所有講座需要的最少的教室數量,要求在同乙個教室不能有講座衝突。由圖可以看出來,這需要使用4個教室來安排10場講座。

經過安排,可以變成下面這樣:

現在就只占用了3個教室就將所有的講座安排好,保證了沒有衝突。

針對這個問題我們是在教室固定的情況下選擇講座。乙個開集的集合深度是可以包含任意給定時間段最大的數量(如下圖)。按照定義,需要的教室數量大於等於深度。

針對這個問題的分析,我們一開始就貪心的將所有講座按照開始時間一一安排到相容的教室,直到不能繼續在當天安排為止。同一間教室不會安排兩個時間衝突的講座。這樣得到的結果被證明是最優的。

該演算法的複雜度為, 證明過程略

(3)最小延遲排程

單一資源程序一次只處理乙個任務。任務j需要tj個單位的處理時間,在dj截止。如果j開始時間為s,那麼結束時間為fj =sj + tj。因此,延遲為

與第乙個問題類似,可以從最短處理時間優先處理,最短截止時間處理和最小的間隔(dj-tj)時間處理,我們使用貪心演算法的思路是最早deadline的工作最先做,最直觀的想法。並證明該思路就是最優。其餘兩種演算法的反例如下:

如果採用最短的處理時間最小處理,那麼就是先處理第1個,這樣的話,這樣延遲時間為1,但是如果先處理第2個,則延遲時間為0;

如果採用最短間隔時間來處理,在該例子中,則先處理第2個,那麼延遲時間為9,但如果先處理第1個,則延遲時間為2.

由此我們的貪心演算法思路為:

該演算法的複雜度仍為。證明過程如下:

(四)最優離線快取

儲存k個條目,有cache hit和cache miss,目標為最小化cache miss的數量。可以採用farthest-in-future方法為最優。

(五)選擇斷點

從princeton開車到palo alto,沿途會有加油站,加滿是c,目標是使得能夠盡可能的停下來加油。

一種貪心的思路即,開車到不能不停的時候,才停下來加油。

該演算法的複雜度仍為,使用二分查詢來選擇每一次停下的點p。

(六)換硬幣

給定一定數額的零錢,1,5,10,25,100,找出乙個方法可以使用最少數量的硬幣給顧客。貪心的思路即,從最大的數額開始,再從第二大的數額開始找,一直找直到找完。

事實上,該貪心演算法對於美國錢幣是最優演算法,但是最優一些國家的不同額度的錢幣來看,並不是最優的,甚至都不能找到可行解。

如下例子:

總結這節課所講:

method

complexity

interval scheduling

earliest-finishing

o(nlogn)

interval partition

earliest-starting

o(nlogn)

minimize max lateness

earliest deadline

o(nlogn)

optimal cache miss

farthest-in-future

selecting breakpoints

go as far as you can

o(nlogn)

coin changing

change as large as possible

o(nlogn)

對於貪心演算法的設計:

step + strategy(選擇候選項) +merge

貪心演算法 筆記

揹包相關問題。1.給出n 個物品,第i 個物體的重量為wi 選擇盡量多的物體,使得總重量不超過 c 按照物品重量從到小排序 2.部分揹包問題。有 n個物體,第 i 個物體的重量為wi 價值為vi 在總重量超過c的情況下讓總價值盡量高。按照 價值除以重量的值 排序 乘船問題。有 n 個人,第 i個人的...

貪心演算法筆記

貪心演算法總是作出在當前看來最好的選擇,所作出的選擇只是在某種意義上的區域性最優選擇。雖然貪心演算法不能對所有問題都得到整體最優解,但對許多問題它能產生整體最優解。如單源最短路經問題,最小生成樹問題等。在一些情況下,即使貪心演算法不能得到整體最優解,其最終結果卻是最優解的很好近似。貪心演算法和動態規...

第10課 貪心演算法

貪心演算法是一種在每一步選擇中都採取在當前狀態下最好或最優 即最有 利 的選擇,從而希望導致結果是全域性最好或最優的演算法。貪心演算法與動態規劃的不同在於它對每個子問題的解決方案都做出選擇,不能回退。動態規劃則會儲存以前的運算結果,並根據以前的結果對當前進行選擇,有回退功能。貪心法可以解決一些最優化...