貪心演算法是指在對問題求解時,總是做出在當前看來是最好的選擇。不從整體最優考慮,只做出在某種意義上的區域性最優選擇。
貪心演算法不是對所有問題都能得到整體最優解,但對許多問題它能產生整體最優解。如單源最短路徑問題,最小生成樹問題等。在一些情況下,即使貪心演算法不能得到整體最優解,其最終結果卻是最優解的很好近似。由於貪心法的高效性以及其所求得的答案比較接近最優結果,貪心法也可以用作輔助演算法或者直接解決一些要求結果不特別精確的問題。
解題的一般步驟是:
1、 建立數學模型來描述問題;
2、把求解的問題分成若干個子問題;
3、 對每一子問題求解,得到子問題的區域性最優解;
4、把子問題的區域性最優解合成原來問題的乙個解。
1. 活動選擇問題
有n個需要在同一天使用同乙個教室的活動 a1, a2, …, an,教室同一時刻只能由乙個活動使用。每個活動 ai 都有乙個 開始時間si 和 結束時間fi 。一旦被選擇後,活動ai就佔據半開時間區間[si,fi)。如果[si,fi]和[sj,fj]互不重疊,ai和aj兩個活動就可以被安排在這一天。
該問題就是要安排這些活動使得盡量多的活動能不衝突的舉行。例如下圖所示的活動集合s,其中各項活動按照結束時間單調遞增排序。
貪心策略應該是每次選取結束時間最早的活動。
用貪心法的話思想很簡單:活動越早結束,剩餘的時間是不是越多?那我就選擇最早結束的那個活動,找到後在剩下的活動中再找最早結束的不就得了?這也是把各項活動按照結束時間單調遞增排序的原因。
public
class
activetime
}/**
* @param actives 活動集合
* @param starttime 教室的開始使用時間
* @param endtime 教室的結束使用時間
*/public
static list
getbestactives
(list
actives,
int starttime,
int endtime)
}return bestactives;}}
/** * 活動類 active
*/class
active
implements
comparable
public
intgetstarttime()
public
void
setstarttime
(int starttime)
public
intgetendtime()
public
void
setendtime
(int endtime)
@override
public string tostring()
//活動排序時按照結束時間公升序
@override
public
intcompareto
(active o)
elseif(
this
.endtime == o.endtime)
else
}}
五大常用演算法 貪心演算法
一 基本概念 所謂貪心演算法是指,在對問題求解時,總是做出在 當前看來是最好的選擇 也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的 區域性最優解 貪心演算法沒有固定的演算法框架,演算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略...
五大常用演算法 貪心演算法
貪心演算法是指 在每一步求解的步驟中,它要求 貪婪 的選擇最佳操作,並希望通過一系列的最優選擇,能夠產生乙個問題的 全域性的 最優解。貪心演算法每一步必須滿足一下條件 1 可行的 即它必須滿足問題的約束。2 區域性最優 他是當前步驟中所有可行選擇中最佳的區域性選擇。3 不可取消 即選擇一旦做出,在演...
五大演算法三 貪心演算法
一 基本概念 所謂貪心演算法是指,在對問題求解時,總是做出在 當前看來是最好的選擇 也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的 區域性最優解 貪心演算法沒有固定的演算法框架,演算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略...