贪心算法

本文介绍了贪心算法,其框架包括可选与已选对象集合、判断和解评价函数等。将其与动态规划对比,指出贪心不一定得全局最优,但效率更高。还列举了贪心算法在凑零钱、活动安排、0->1背包问题中的应用,强调能否得全局最优取决于贪心策略选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

贪心算法框架

贪心算法(greedy algorithm)是一个容易想象但难以证明的算法,算法框架包括:


可选对象集合S,S是全集;
已选对象集合T;
判断解是否合法的函数isValid(T);
评价解的函数payoff(T);


目标:从S中选出T,使isValid(T)为True,同时,满足payoff(T)最大;
做法:从空集开始,每次增加一个元素使当前payoff最大
最后求解完成需要验证是不是全局最优

贪心算法与动态规划的比较

贪心算法不一定得到全局最优解,动态规划是全局最优的,两者的递推公式也有差别;
动态规划:
opt(x)=max{opt(y)+payoff(y,x)}opt(x)=max\left \{ opt(y)+payoff(y,x) \right \}opt(x)=max{opt(y)+payoff(y,x)}
yyy是能到达xxx的所有可能状态,payoff(y,x)payoff(y,x)payoff(y,x)是状态yyy到状态xxx的收益;
贪心算法:
opt(x)=opt(y)+max{payoff(y,x)}opt(x)=opt(y)+max\left \{ payoff(y,x) \right \}opt(x)=opt(y)+max{payoff(y,x)}
在一定程度上反映了一个现象,动态规划和贪心算法都是逐步优化,但动态规划可以求出当前所有状态的最优解;而贪心算法针对的是当前可选状态的最优解,再简单与上一步最优解相加,个人认为这使贪心算法的定位属于局部最优;
贪心算法应该属于动态规划的升级,在max计算上看出少了很多其他可能状态,因此效率更高,但其要求也就相应上升,所以只有当贪心的策略选择合适才能获得和DP一样的全局最优解;

贪心算法的应用

凑零钱问题
假设现在要用{1,2,5}三种面值的硬币凑nnn分钱,同时使硬币数量最少,如果按照贪心算法的思想,则应该先用5分硬币凑钱,再用2分硬币,最后使用1分硬币;这里似乎可以得到全局最优;
但注意,并不是这样的问题都可以用贪心得到全局最优,如果面值改成{1,2,5,7},现在就要凑10分钱,显然用2个5分硬币就是全局最优了,但贪心会需要3个硬币:1分,2分,7分各一个硬币;显然这不是全局最优
活动安排
现在有很多活动,第iii个活动的开始时间和结束时间是[si,fi][s_{i},f_{i}][si,fi],而目前只有一个教室,活动时间不能相交,如何安排可以让这一天内的活动数量最多;
假如现在就制定了一个贪心的策略:按照活动结束时间排序,找出所有不冲突的活动,安排这些活动即可;
实现上很好理解,但要证明它可以做到全局最优是很困难的;
如果选择其他贪心策略:
1.按照活动结束时间排序,找出所有不冲突的活动;
2.按照活动时长排序,安排时长短且不冲突的活动;
这两个策略均可以找到反例,证明不是全局最优;因此,贪心算法不一定可以得到全局最优,同一个问题,能否得到全局最优解,关键取决于贪心策略的选择;
0->1背包问题
注意这个问题不是"整数0/1背包问题",而是:一个背包容量有限,现在有很多物品,每种物品有自己的价值和重量,每个物品可以拿走任意比例部分,价值也按照拿走的比例计算,如何选取物品使得背包可以承受且价值最大?
同样,这可以用贪心算法解决,并且得到全局最优解,分析如下:
由于物品可以划分比例,现在就先用每个物品的价格除以其质量,得到一个价值重量比,从价值重量比最高的物品开始一份一份地拿,容易想象,每次拿到的都是剩余集合中payoffpayoffpayoff最高的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值