浅谈贪心算法
什么是貪心算法?
維基百科對其的定義如下:
貪心算法(英語:greedy algorithm),又稱貪婪算法,是一種在每一步選擇中都采取在當(dāng)前狀態(tài)下最好或最優(yōu)(即最有利)的選擇,從而希望導(dǎo)致結(jié)果是最好或最優(yōu)的算法。
貪心算法在有最優(yōu)子結(jié)構(gòu)的問題中尤為有效。最優(yōu)子結(jié)構(gòu)的意思是局部最優(yōu)解能決定全局最優(yōu)解。簡單地說,問題能夠分解成子問題來解決,子問題的最優(yōu)解能遞推到最終問題的最優(yōu)解。
貪心算法與動態(tài)規(guī)劃的不同在于它對每個子問題的解決方案都做出選擇,不能回退。動態(tài)規(guī)劃則會保存以前的運算結(jié)果,并根據(jù)以前的結(jié)果對當(dāng)前進(jìn)行選擇,有回退功能。
貪心法可以解決一些最優(yōu)化問題,如:求圖中的最小生成樹、求哈夫曼編碼……對于其他問題,貪心法一般不能得到我們所要求的答案。一旦一個問題可以通過貪心法來解決,那么貪心法一般是解決這個問題的最好辦法。由于貪心法的高效性以及其所求得的答案比較接近最優(yōu)結(jié)果,貪心法也可以用作輔助算法或者直接解決一些要求結(jié)果不特別精確的問題。
某種程度上,貪心算法和動態(tài)規(guī)劃有一定的相似性都是先分解子問題。但動態(tài)規(guī)劃實質(zhì)上是窮舉法,只是會省去重復(fù)計算,更像是一種途徑和方法而不是一種特殊算法。而貪心算法每次都選擇局部的最優(yōu)解,并不考慮這個局部最優(yōu)選擇對全局的影響,最后產(chǎn)生整體最優(yōu)解或其近似解。
貪心類問題一般需要設(shè)置當(dāng)前最佳情況和總體最佳情況,并根據(jù)當(dāng)前最佳情況不斷更新最佳情況。即設(shè)置xx_now,用于對比記錄當(dāng)前最佳情況改變前后的情況,再設(shè)置一個xx_all,比較當(dāng)前最佳情況和保存下來的總體最佳情況并再次保存下來。
例題見:
最大子序和
貪心之判斷子序列
貪心算法之檸檬水找零
貪心算法之分發(fā)餅干
貪心算法之買賣股票的最佳時機 II
總結(jié)
- 上一篇: 如何用PPT编制方案 (4)PPT
- 下一篇: oracle 11.2.0.3.4 ps