还在浪费时间学贪婪心算法么?告诉你三个不需要学习贪婪心算法的理由!
每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法
介绍:
贪婪算法是一种每一步选择中都采取在当前状态下最有利的选择,从而希望导致结果是最好或最优的算法
找钱例子:
题目:人民币面额为100元、50元、20元、10元、5元、2元、1元,现在每种数额都有无数多张。
输入需要找零的金额,请以最少的货币张数找零。
例子:
输入:17
输出:[10,5,2]
分析:以最少的货币张数找零,那么就要尽量先选择最大的面额进行找零。选择到一张面额之后,再对差额再此进行找零。
// 找零
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))
贪婪的局限性:
贪婪算法是采取当前的最优解,希望求得在全局得最优解。但是局部最优解不一定能导致全局的最优解。
只有选择的贪婪策略具有无后效性,当前的选择、状态并不会影响到以后的状态。
比如上面找零的例子,[100, 50, 20, 10, 5, 2, 1]
任意一张面额的金额大小都大于等于两张比他小的面额之和。
例如5> 2+1
; 100=50+50
;50>20+20
假如人民币的面额为[10,7,5,3,1]
那么找零12应选择[7,5]
而不是以上算法找出的[10,1,1]
关于贪婪算法的局限性与贪婪心算法需要学到什么程度可以阅读此博客自行考虑。还在浪费时间学贪婪心算法么?告诉你三个不需要学习贪婪心算法的理由!
个人觉得还是有必要了解基础题型