算法课笔记系列(二)—— 贪心算法

贪心算法就是一种非常直观的算法,对于一个问题,只关心它目前最优的解决方案,不考虑未来的发展。但往往,这种只考虑现在的算法就是最优的算法。第一步将问题分为可分的一步一步,第二步对每一步进行当前的最优计算,第三部将得到的结果最优,往往是得到的全局最优的结果。

下面还是通过课上讲解的几个例子来深入学习贪心算法。

(1)区间调度

                    

如上图所示,第j个工作任务开始时间为sj,结束时间为fj。两个工作任务之间如果没有重叠区域,就认为它们是相容的。现在问题的目标是要找到可以同时相容的工作任务的最大子集,即最多数量。

现在对于这个问题考虑一些很自然的思路。针对这个问题,我们要选择工作。不难想出,选出所有与已经选好的工作任务相容的工作任务即可。那么如何对工作任务进行选择呢?有如下几种考虑:

1)  最早开始时间:对sj进行升序排列

2)  最早结束时间:对fj进行升序排列

3)  最短间隔:fj-sj进行升序排列

4)  最少冲突:对于每一个任务h,计数与它冲突的任务数cj。对cj进行升序排列

对于(1),(3)和(4)都能够找到反例来证明其不是最优。

                  

其中深色任务是我们选择的,但是都并不是正确的选择。

我们再来考虑第(2)种方案。对最早结束时间进行升序排列,该算法为贪心算法,即越多越早结束的任务,同时相容的工作更多的可能性更大。

                     

如果sj小于下一个任务的fj,那么这两个任务就是相容的。

该算法的复杂度为

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值