貪心算法


一、概述

1.設計思想

貪心算法通過一系列選擇來得到問題的解,所做的每個選擇都是當前狀態下局部最好選擇,即貪心選擇。

貪心算法並不從整體最優上加以考慮,所做的選擇只是在某種意義上的局部選擇,在一些情況下,即使貪心算法不能得到整體最優解,但其最終結果確實最優解的很好的近似解。

2.基本要素

(1)貪心選擇性質

貪心算法所做的選擇可以依賴以往所做過的選擇,但絕不依賴將來所做的選擇,也不依賴子問題的解。

(2)最優子結構性質

當一個問題的最優解中包含了子問題的最優解時,則稱該問題具有最優子結構特性。

3.存在的問題

(1)不能保證求得的最后解是最佳的;
(2)不能用來求最大或最小解問題;
(3)只能求滿足某些約束條件的可行解的范圍。

4.算法比較

  名稱                   同               異
貪心算法 都要求問題具有最優子結構性質

不依賴將來和子問題的解

自頂向下進行求解

具有貪心選擇性質

動態規划算法

往往依賴相關子問題的解

自底向上進行求解

具有重疊子問題性質

 

 

 

 

 

二、例題總結

1.活動安排問題

【問題描述】 設有n個活動的集合E={1,2,…,n},其中每個活動都要求使用同一資源(如演講會場等),而在同一時間內只有一個活動能使用這一資源。每個活動i都有一個要求使用該資源的起始時間si和結束時間fi,如果選擇了活動i,則它在半開區間[si,fi)與區間[sj,fj)內占用資源。若區間[si,fi)與區間[sj,fj)不相交,則稱活動i和j是相容的,也就是說,當si≥fj或sj≥fi時,活動i與活動j相容。

【算法設計】由於活動占用資源的時間沒有限制,因此,選擇最早結束時間作為貪心策略更加合理,目的是使剩余時間段最大化,以便安排盡可能多相容的活動。

【算法實現】

數組f中元素按結束時間非降序排列,若未按此序排列,可以用O(nlogn)做時間重排。

 

2.背包問題

【問題描述】 設背包容量為C,n個物品,物品價值和重量為v[i],w[i]。物品可以只裝一部分。

【算法設計】不存在0-1要求,先裝單價最貴的,再裝單價次貴的,依此貪心策略一直進行下去,直到背包裝滿。

【算法實現】 O(nlogn)

3.最優裝載問題

【問題描述】設有一輪船能裝載的貨物重量為C,有n個集裝箱,重量為w[i],問怎樣可以裝盡可能多的集裝箱。

【算法設計】先裝最輕的,再裝次輕的,依此貪心策略一直進行下去,直到輪船裝滿。

【算法實現】 O(nlogn)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM