贪心算法的基本思想和求解步骤_漫画:五分钟学会贪心算法

aef4811cc37a90fa5e805e5a20bee933.png

欢迎关注微信公众号:视学算法,回复【学习】即可获得5T程序员全栈资料。

d0994ad3edafe777a94febb5bd3f5f59.png
633870d6a6748f2b58007b0fd0593ead.png
560e88e6f290666dbe4164c92195ac40.png
bd15771eee91f74adc4e655aec4dd413.png
9108145614cc089b7bf808190da55eca.png

假设一个问题比较复杂,暂时找不到全局最优解,那么我们可以考虑把原问题拆成几个小问题(分而治之思想)分别求每个小问题的最优解,再把这些“局部最优解”叠起来,就“当作”整个问题的最优解了。

349a499ec645b008bfad8d1b46930a56.png
95e81a78433066cba0c02829b2a1559b.png
386d149ced0b57d0b272f5594eda634f.png
e84e0abb527694d683d742415fa23b0b.png
53b14dd9e747bf2b42f9544d4ee02a5f.png

没毛病?没毛病走两步看看?? ! !

贪心算法的三步走!

第一步

明确到底什么是最优解?明确下来之后用小本本记下来!

第二步

明确什么是子问题的最优解?再用小本本记下来!

第三步

分别求出子问题的最优解再堆叠出全局最优解?这步不用记!

就是这么简单!

29e4b9b0d49f7677255cf4a42aa9af44.png

0-1背包问题

有一个背包,最多能承载150斤的重量,现在有7个物品,重量分别为[35, 30, 60, 50, 40, 10, 25],它们的价值分别为[10, 40, 30, 50, 35, 40, 30],,阿广,如果是你的话,应该如何选择才能使得我们的背包背走最多价值的物品?

5ccc7a80b68dcde0d0d6c1543ea00db0.png
ac7f15097c8e40930827e236fcc46c05.png

按照刚才说的步骤实操一下吧!

没毛病?没毛病走两步看看?? ! !

贪心算法的三步走!

第一步

明确到底什么是最优解?

af447a094ffb6ffc50525d44bf53c52e.png
6703ba475b5c533a97de374e78ee7c9c.png

第二步

明确什么是子问题的最优解?再用小本本记下来!

f2ef731ce0f126fb7abe4b274e22261b.png
e6adce64086a57cb6420c595db380c0c.png
10720614320be2416190a4063ae3d8dd.png

第三步

分别求出子问题的最优解再堆叠出全局最优解?

按照制订的规则(价值)进行计算,顺序是:4 2 6 5 。

最终的总重量是:130。

最终的总价值是:165

9da3da7a8fdd95379b8a54bf8c7778dc.png
8eef056c6ecd93f77b87a8845cd16c0c.png

按照制订的规则(重量)进行计算,顺序是:6 7 2 1 5 。

最终的总重量是:140。

最终的总价值是:155

可以看到,重量优先是没有价值优先的策略更好。

7134183728b62761d75c269f8d69799e.png
aa2174fc71045f8dfb96e529c3f0a510.png
46f810dfa57ccda3ad2087222e080411.png

按照制订的规则(单位密度)进行计算,顺序是:6 2 7 4 1。

最终的总重量是:150。

最终的总价值是:170

可以看到,单位密度这个策略比之前的价值策略和重量策略都要好。

8c0499bfef578e2ba681ebcd53cf252f.png
49d8709917c48ab426810a3a6d4948c6.png
09e2337a73e42ee5898a93b8e383467a.png

贪心算法三个核心问题!!!

3a9360e504416b5d81b32eb8b1000054.png
b8a33c9ef7526a7bd3ccaa5ed4dbbf0c.png

是的,阿广,你说的基本意思正确!

下面我总结一下使用贪心算法的前提:

1、原问题复杂度过高

2、求全局最优解的数学模型难以建立

3、求全局最优解的计算量过大

4、没有太大必要一定要求出全局最优解,“比较优”就可以。

那么几乎99.99999999999%就要使用贪心算法的思想来解决问题。

5727a0ef5c53ce0d5b0ed155f6d04c7b.png
9553eddd36ce36fba977a9ac5127871a.png

按串行任务分

时间串行的任务,按子任务来分解,即每一步都是在前一步的基础上再选择当前的最优解。

按规模递减分

规模较大的复杂问题,可以借助递归思想(见第2课),分解成一个规模小一点点的问题,循环解决,当最后一步的求解完成后就得到了所谓的“全局最优解”。

按并行任务分

这种问题的任务不分先后,可能是并行的,可以分别求解后,再按一定的规则(比如某种配比公式)将其组合后得到最终解。

4ce7a5a51d3cb3d462c9b0415e828e54.png
899bf14ad3257f1a4b6fe1154108bba4.png
34e8177fc7bfecce8f999a761c2691e8.png
136beb933a1d8e5e9687191a6a8b9176.png

成本

耗费多少资源,花掉多少编程时间。

速度

计算量是否过大,计算速度能否满足要求。

价值

得到了最优解与次优解是否真的有那么大的差别,还是说差别可以忽略。

e5161b57b5fdb6019db310a1c2a9ac21.png

算法可以贪心

因为算法贪心可以解决

生活中的大部分问题

人啊

千万不要贪心

因为人贪心可以带来

生活中的大部分困难

侈则多欲

君子多欲则恋慕富贵

枉道速祸

289c7df0ea9460b3356d8dbc6a33b9fd.png
7d2b8adb1ea935f36c22352469708151.gif

欢迎关注微信公众号:视学算法,回复【学习】即可获得5T程序员全栈资料。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值