參考:算法分析與設(shè)計(jì)-貪婪心&動(dòng)歸
還在浪費(fèi)時(shí)間學(xué)貪婪心算法么?告訴你三個(gè)不需要學(xué)習(xí)貪婪心算法的理由歌逢!
每一步選擇中都采取在當(dāng)前狀態(tài)下最好或最優(yōu)(即最有利)的選擇巾钉,從而希望導(dǎo)致結(jié)果是最好或最優(yōu)的算法
介紹:
貪婪算法是一種每一步選擇中都采取在當(dāng)前狀態(tài)下最有利的選擇,從而希望導(dǎo)致結(jié)果是最好或最優(yōu)的算法
找錢例子:
題目:人民幣面額為100元秘案、50元砰苍、20元、10元阱高、5元赚导、2元、1元赤惊,現(xiàn)在每種數(shù)額都有無數(shù)多張吼旧。
輸入需要找零的金額,請(qǐng)以最少的貨幣張數(shù)找零。
例子:
? 輸入:17
? 輸出:[10,5,2]
分析:以最少的貨幣張數(shù)找零,那么就要盡量先選擇最大的面額進(jìn)行找零壮韭。選擇到一張面額之后,再對(duì)差額再此進(jìn)行找零厂置。
// 找零
function changeFund (num) {
let money = [100, 50, 20, 10, 5, 2, 1]
let pay = []
while (num) {
for (let i = 0; i < money.length; i++) {
if (money[i] <= num) {
pay.push(money[i])
num -= money[i]
break
}
}
}
return pay
}
console.log(changeFund(17))
console.log(changeFund(232))
貪婪的局限性:
貪婪算法是采取當(dāng)前的最優(yōu)解,希望求得在全局得最優(yōu)解魂角。但是局部最優(yōu)解不一定能導(dǎo)致全局的最優(yōu)解昵济。
只有選擇的貪婪策略具有無后效性,當(dāng)前的選擇、狀態(tài)并不會(huì)影響到以后的狀態(tài)。
比如上面找零的例子访忿,[100, 50, 20, 10, 5, 2, 1]
任意一張面額的金額大小都大于等于兩張比他小的面額之和瞧栗。
例如5> 2+1
; 100=50+50
;50>20+20
? 假如人民幣的面額為[10,7,5,3,1]
那么找零12應(yīng)選擇[7,5]
而不是以上算法找出的[10,1,1]
關(guān)于貪婪算法的局限性與貪婪心算法需要學(xué)到什么程度可以閱讀此博客自行考慮。還在浪費(fèi)時(shí)間學(xué)貪婪心算法么海铆?告訴你三個(gè)不需要學(xué)習(xí)貪婪心算法的理由迹恐!
個(gè)人覺得還是有必要了解基礎(chǔ)題型