1.簡介
貪心算法(又稱貪婪算法)是指,在對(duì)問題求解時(shí),總是做出在當(dāng)前看來是最好的選擇。也就是說,不從整體最優(yōu)上加以考慮,他所做出的是在某種意義上的局部最優(yōu)解。
貪心算法不是對(duì)所有問題都能得到整體最優(yōu)解,關(guān)鍵是貪心策略的選擇,選擇的貪心策略必須具備無后效性,即某個(gè)狀態(tài)以前的過程不會(huì)影響以后的狀態(tài),只與當(dāng)前狀態(tài)有關(guān)。
2.思想
貪心算法的基本思路是從問題的某一個(gè)初始解出發(fā)一步一步地進(jìn)行,根據(jù)某個(gè)優(yōu)化測(cè)度,每一步都要確保能獲得局部最優(yōu)解。每一步只考慮一個(gè)數(shù)據(jù),他的選取應(yīng)該滿足局部優(yōu)化的條件,直到把所有數(shù)據(jù)枚舉完。
貪心算法的思想如下:
a)建立數(shù)學(xué)模型來描述問題;
b)把求解的問題分成若干個(gè)子問題;
c)對(duì)每一子問題求解,得到子問題的局部最優(yōu)解;
d)把子問題的解局部最優(yōu)解合成原來解問題的一個(gè)解。
與動(dòng)態(tài)規(guī)劃不同的是,貪心算法得到的是一個(gè)局部最優(yōu)解(即有可能不是最理想的),而動(dòng)態(tài)規(guī)劃算法得到的是一個(gè)全局最優(yōu)解(即必須是整體而言最理想的),一個(gè)有趣的事情是,動(dòng)態(tài)規(guī)劃中的01背包問題就是一個(gè)典型的貪心算法問題。
3.學(xué)習(xí)方法
由淺入深,不妨先將動(dòng)態(tài)規(guī)劃中的01背包問題弄熟悉,再來學(xué)習(xí)貪心算法的基礎(chǔ)思維,其實(shí)在很多時(shí)候自己并未發(fā)覺自己已經(jīng)是在使用貪心了,當(dāng)你基本掌握了一些貪心的概念的時(shí)候,可以做一些諸如裝箱問題,切割問題,區(qū)域分配問題的題目,鞏固自己的知識(shí)。
4.相關(guān)例題
有很多經(jīng)典的應(yīng)用,比如霍夫曼編碼(Huffman Coding)、Prim 和 Kruskal 最小生成樹算法、還有 Dijkstra 單源最短路徑算法,最小生成樹算法和最短路徑算法,甚至是一些暴力求解題目,都是使用了貪心的這種思維。
可以直接從dotcpp網(wǎng)站標(biāo)簽中搜索貪心即可,貪心算法在很多題目中均或多或少有一些思維的應(yīng)用,因此題目涵蓋非常廣闊,非常適合逐步練習(xí)。
1197 | 發(fā)工資咯 |
1453 | 藍(lán)橋杯歷屆試題-翻硬幣 |
1462 | 藍(lán)橋杯基礎(chǔ)練習(xí)VIP-Huffuman樹 |
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程