贪心算法证明

贪心算法证明

贪心性质

用贪心算法解决的题目需要满足以下性质:

  • 最优子结构:一个问题的最优解包含其子问题的最优解。
  • 贪心选择性:所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。

对比动态规划

DP满足

  • 最优子结构:一个问题的最优解包含其子问题的最优解。
  • 重叠子问题:在问题的求解过程中,很多子问题的解将被多次使用。

贪心算法设计

  1. 设计贪心选择方法:
    • 贪心选择方法
    • 剩余子问题
  2. 证明:对于 1 中贪心选择来说 所求解的问题具有最优子结构
  3. 证明:对于 1 中贪心选择算法来说 所求解的问题具有贪心选择性
    • 归纳法:证明在每一步做得都比其它算法好 从而最终产生了一个最优解
    • 交换论证法:在保证最优性不变前提下 从一个最优解逐步替换 最终得到贪心算法的解
  4. 按照 1 中设计的贪心选择方法设计算法

例子

例 Maximum Cardinality Disjoint Interval Problem

问题描述:给一些时间片段集合T={(a1,b1)(a2,b2),。。。,(an,bn)},找出一个元素个数最多的子集S,子集中的每个元素的时间片段没有交叉。

Greedy Algorithm: 每次都选所有interval 中bi最小的那个,把(ai,bi)加入S,然后把(ai,bi)在T中删除,同时把T中所有和(ai,bi)有交叉的interval删除,然后再在T中找最小的bj,循环上面的操作,直到没有可以在添加的。

证明上面说的Greedy Algorithm是最优的。

下面就用第一个证明的步骤来证。

我们的Greedy Algorithm记为A,假设A不是最优的,那么就一定存在一个O,O是和A最相近的一个最优的算法,最相近是指和O和A的前K-1个选择都相同,第K个是不同的。

假设对于A,A第k个选择的是(ai,bi);而O第K个选择的是(aj,bj)。从A的定义我们可以直到,bi<=bj。

现在我们构造一个O',O' = O-(aj,bj)+(ai,bi)。

1)很显然,O'是这个问题的一个解,也就是说O'中的intervals没有重叠的。

在O'中,(ai,bi)前的intervals和A中的一样,所以前一部分没有重叠。在(ai,bi)后的intervals和O中的一样,所以也没有重叠,同时bi<=bj,所以(ai,bi)也不会和它相邻的重叠,所以O'中的所有intervals都没有重叠。

2)O'是一个最优解,因为他的intervals的个数和O一样。

综上,我们找到了一个最优解O',它和A具有的共同的intervals有K个,这和我们前提假设最多有k-1个相矛盾,所以,A是最优的。证毕。

全部评论

相关推荐

dao_yi:投了1000个左右,回消息的很少,要简历然后说过几天联系的都没有消息了,约面试的基本都是3000左右,足够在当地生活,最后去了一个武汉的3000,干了两天回来考研了,感觉这个行业加班是常态,看能不能考研上岸找个国企,或者大厂。
点赞 评论 收藏
分享
面了这么多场试,总有公司总喜欢压力面一个小时面试+手撕,哪里不会就点哪里,说了不会不会还继续追着问不尊重求职者,稍微有些细节记不清了,就开始怀疑项目真实性以及人格让求职者开摄像头但是自己不开,说话声音还贼小,pardon几次就开始不耐烦的不知道这个算不算,手撕的时候,面试官人跑了。。。最后快结束才来
一纸丿繁华丶:你换位思考一下,自己在职场被领导push麻了,身心俱疲,现在有个机会让你放松一下,体验一把上位者的感觉,还能看着那些高学历人才、未来自己的竞争者,抓耳挠腮、手足无措的样子,没给你当场笑出来就不错了,理解一下面试官吧。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务