首页 > > > 算法浅谈——怪盗基德的珠宝选择问题与贪心算法
点击上方蓝字,和我一起学技术。

1
在开始今天的文章之前,我们先来讲一个故事:

我们每次做决定的时候都选择当下回报最多的选项,这种算法叫做贪心法。就好像我们面临三个珠宝去选择最值钱的那个一样,但是当下回报最多并不代表最终的回报最多,所以我们不能只靠眼前的收益来决策。也就是说贪心法是会有反例的。
贪心法有反例这个结论并不难,很容易想明白,难的是我们如何判断当前的问题下,能不能使用贪心算法呢?尤其是我们可能一时半会想不出反例的情况下。
有一个比较取巧的方法叫做均等假设法,这个名字是我取的,没听说过很正常,不用纠结。事实上课本当中谈及贪心算法,也根本不会阐述这个问题,然而这个问题在实际当中又是非常重要的。那么,什么叫均等假设法呢?很简单,就是假设我们在某次决策的时候,面临两个势均力敌的选项,我们通过判断这两个选项最终的结果是否一致来判断贪心算法是否成立。如果两个均等的选项最终结果一致,那么贪心算法可行,否则不可行。
2
我们还用刚才基德的问题举例:
假设这次基德偷的不再是珠宝,而是非常昂贵的香水,并且假设香水混合之后不会影响它的价值。现在有ABC三瓶香水,每瓶的体积分别是6,5,5价值分别是10,5,5。而基德的瓶子体积是10,显然基德应该先装价值是10的A香水。当基德装完了A香水之后, 瓶子体积还有剩余,这个时候他应该装B香水呢还是C香水?
因为B和C香水的价值是一样的,我们试一下就知道,不论我们选B还是C都对最终的结果没有影响。也就是说这两个选项既是均等的,并且它的最终结果也是均等的。那么这个时候,我们就认为贪心算法是可行的。
上述的原理我想大家应该都能看明白,不过可能还会有人有这样一个疑问。我要判断两个选项最终的结果是否一样,既然都能做这样的判断了,那么显然应该早就知道贪心法可不可行了,这怎么还能称为是验证贪心法是否可行的方法呢?
答案也很简单,说起来我们是判断最终的结果是否一致,但实际上,我们只需要判断接下来的若干个中间结果,就可以判断最终结果了。最终结果的说法只是为了表述更加准确,毕竟这不是一个数学上严格的证明方法,而只是我们自己用来推测的方法。
3
我们再来看另一个例子:

我们假设会议一共有n个,开始的时间是
假设存在两个会议的开始时间一样,结束时间不同。那么在当前算法下,这两个会议是均等的。假设这两个会议一个是
正解应该是按照结束时间排序,依次安排。我们同样用均等假设法来判断,假设存在两个会议的结束时间一样,并且都能够被安排,它们的时间分别是
你可能会问,如果存在一个
以上就是我自创的均等假设法。
4
最后,我们再回到最开始的故事,如果我们是基德,我们真的应该拿B和C吗?
答案是不应该,拿B和C的收益当然是最大的,但是有两个问题。ABC三个珠宝的体积只差了1,我们靠肉眼真的能估算出来,我们拿了A就装不下B或者C了吗?再说,开的柜子越多,被发现的概率也就越大,我们真的可以拿到两个宝石吗?
显然,在现实生活当中贪心法是行不通的,还是应该三思而后行。
本文到这里就结束了,喜欢本文的同学,请点个“在看”或者转发吧。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69966956/viewspace-3136834/ ,如需转载,请注明出处,否则将追究法律责任。