求解最优化问题的算法通常需要经过一系列的步骤,在每个步骤都面临多种选择。对于许多最优化问题,使用动态规划算法来求解最优解问题有点大材小用,可以使用更简单、更高效的算法,如贪心算法。贪心算法在每一步都做出当时看起来最佳的选择,也就是局部最优的选择,寄希望这样的选择能导致全局最优解。
贪心算法并不保证得到最优解,但很多问题确实可以求得最优解。贪心算法通常是自顶向下的设计:做出一个选择,然后求解剩下的那个子问题,而不是自底向上地求解出很多子问题,然后再做出选择。

贪心算法原理

贪心算法通过做出一系列选择来求出问题的最优解。在每个决策点,贪心算法做出在当时看似最佳的选择。这种启发式策略并不能保证总能找到最优解,但对有些问题确实有效。可以按照如下步骤设计贪心算法:
(1) 将最优化问题转换成这种形式:对其做出一次选择后,只剩下一个子问题需要求解。
(2) 证明做出贪心选择后,原问题总是存在最优解,即贪心选择总是安全的。
(3) 证明做出贪心选择后,剩余的子问题满足性质:其最优解与贪心选择组合即可得到原问题的最优解,这样就得到了最优子结构。
如何证明一个贪心算法是否能求解一个最优解问题?并没有普适的方法。但贪心选择性质最优化子结构是两个关键要素。

贪心选择性质(Greedy-Choice Property)

贪心选择性质是指可以通过做出局部最优(贪心)选择来构造全局最优。也就是说,当进行选择时,只需要做出当前问题中看起来最优的选择,则不必考虑子问题的解。
在动态规划中,每个步骤都要进行一次选择,但选择通常依赖于子问题的解。因此,通常以一种自底向上的方式求解动态规划的问题:先求解较小的子问题,然后是较大的子问题。而在贪心算法中,总是做出当前看起来最佳的选择,然后求解剩下的唯一的子问题。贪心算法进行选择时,可能依赖之前的选择,但不依赖任何将来的选择或子问题的选择。因此,动态规划是先求解子问题然后才能进行第一次选择,贪心算法在进行第一次选择之前不求解任何子问题。
注意,必须证明每个步骤做出的贪心选择能生成全局最优解。否则,这个问题可能无法用贪心算法获取最优解。

最优子结构

如果一个问题的最优解包含其子问题的最优解,则称此问题具有最优子结构性质。(与动态规划中最新子结构概念一致)
当使用贪心算法时,通常使用更为直接的最优子结构。通过使用贪心选择得到子问题后,接下来需要做的就是论证,将子问题的最优解与贪心选择组合在一起后能生成原问题的最优解。这种方法隐含地对子问题使用了数学归纳法,证明在每个步骤进行贪心选择会生成原问题的最优解。

贪心算法和动态规划

贪心算法和动态规划都利用最优子结构性质。
动态规划算法将问题划分为多个子问题,然后将这些子问题的最优解整合成原问题的一个最优解。在确定该将哪些子问题用于最优解时,要考虑几种选择。贪心算法只需考虑一个选择(即贪心的选择),进而完成贪心方法的过程。
贪心算法和动态规划最大的不同在于,动态规划会首先寻找子问题的最优解,然后在其中进行选择,则贪心算法是首先做出一次“贪心”选择(在局部看来最优的选择),然后求解选出的子问题,从而不必费心求解所有可能相关的子问题。

贪心算法的实现方法

贪心算法通常使用自顶向下的思想设计:做出一个选择,然后求解剩下的子问题,而不是自底向上地求解出子问题,然后再做出选择。在实现方式上,又可细分为基于递归的贪心算法和基于迭代的贪心算法。

拟阵和贪心算法

贪心算法的背后有一个相当复杂的理论,它是基于一种称为“拟阵”(matroid)的抽象组合结构。虽然该理论不能涵盖贪心方法适用的所有情况,但它确实覆盖了很多有实际意义的情况。而且,这种理论的扩展还覆盖了其他应用。更多拟阵相关的理论可参考《算法导论》一书或专业数据书籍。

参考

《算法导论》 第十六章 贪心算法 第三版 Tomas H. Cormen etc. 殷建平 等译
《算法设计与分析基础》 第九章 贪婪技术 第三版 Anany Levitin 著 潘彦 译

贪心算法(Greedy Algorithm)理论篇相关推荐

  1. 动态规划(Dynamic Programming)与贪心算法(Greedy Algorithm)

    文章目录 动态规划算法(Dynamic Programming) 动态规划问题的属性 应用实例:最长公共子序列问题(Longest Common Subsequence, LCS) 贪心算法(Gree ...

  2. 贪心算法(Greedy Algorithm)最小生成树 克鲁斯卡尔算法(Kruskal#39;s algorithm)

    克鲁斯卡尔算法(Kruskal's algorithm)它既是古典最低的一个简单的了解生成树算法. 这充分反映了这一点贪心算法的精髓.该方法可以通常的图被表示.图选择这里借用Wikipedia在.非常 ...

  3. 贪心算法 (Greedy Algorithm)

    贪心算法 如果要简要得描述这个算法的话就是,首先边的权重排序.(从小到大)循环的判断是否需要选择这里的边.判断的依据则是边的两个顶点是否已经连通,如果连通则继续下一条.不连通就选择使其连通. http ...

  4. 贪心(Greedy Algorithm)

    贪心(Greedy Algorithm) 贪心 44.通配符匹配 45.跳跃游戏 II 55.跳跃游戏 122.买卖股票的最佳时机II 134.加油站 135.分发糖果 179.最大数 277.搜寻名 ...

  5. java贪心算法几个经典例子_经典算法思想5——贪心(greedy algorithm)

    贪心算法,是指在对问题求解时,总是做出再当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是某种意义上的局部最优解. 贪心算法没有固定算法框架,算法设计的关键是贪心策略的选择.必须注 ...

  6. 贪心算法(Greedy Algorithms)

    1.贪心法的设计思想 贪心算法在解决问题的策略上目光短浅, 只根据当前已有的信息就做出选择,而且 一旦做出了选择,不管将来有什么结果,这个选择都不会改变.换言之,贪心法并不是从整体最优考虑,它所做出的 ...

  7. 贪心算法|Greedy Algorithms(背包问题)

    贪心算法是一种用于优化问题的简单.直观的算法.该算法在寻找整体最优解的过程中,每一步都进行最优选择.贪心算法在一些问题上是非常成功的,例如用于压缩数据的霍夫曼编码,或者用于通过图寻找最短路径的Dijk ...

  8. 贪心算法 Greedy

    目录 基本思想 简单题目 455 分发饼干 1005 K次取反后最大化的数组和 860 柠檬水找零 序列问题 376 摆动序列 738 单调递增的数字 股票问题 122 买卖股票的最佳时机Ⅱ 两个维度 ...

  9. 【算法学习】贪心算法

    参考算导第三版第16章 贪心算法 文章目录 1. 活动选择问题 1.1 活动选择问题的最优子结构 1.2 贪心选择 1.3 递归贪心算法 1.4 迭代贪心算法 2. 贪心算法原理 2.1 贪心选择性质 ...

  10. leetcode 贪心_贪心算法:给我最好的,现在就要!

    每次做选择的时候都做出当下最好的选择,而不考虑将来的后果.并且期望最终得到的结果是全局最优的. --贪心算法 - Greedy Algorithm 什么时候该使用贪心算法 针对一组数据,定义了限制值. ...

最新文章

  1. jquery 设置css样式
  2. 闯荡北京卖枣的临县人:同有一个“红枣美梦”(2张)
  3. html手机pc不同页面,PC端和手机端如何同时生成静态页
  4. Python configparser模块
  5. git 未能顺利结束(退出码1)
  6. 脆弱的是生命 不脆弱的是精神 雅安 挺住!
  7. ruby+selenium-webdriver一步一步完成自动化测试(5)—–多个测试用例
  8. cisco设备vlan,trunk,以太网通道管理
  9. 语音识别软件_语音识别软件是什么_离线语音识别软件_企业服务汇
  10. 10 年前被删的初恋,凌晨 1 点突然加我…屌丝的眼泪
  11. 将页面强制保持在所属框架中
  12. BottomNavigationView+ViewPager+Fragment 底部导航按钮
  13. [Maven实战-许晓斌]-[第二章]-2.6 NetBeans上面安装Maven插件
  14. 数据字典chm制作教程
  15. 联想台式计算机亮度怎么调,Lenovo笔记本电脑如何调节屏幕亮度
  16. 香港理工大学计算机系 主任,我校与香港理工大学合作MScIS项目第七期开学
  17. 在计算机中 汉字系统把一个汉字表示为,计算机问题汉字系统在计算机内把一个汉字表示 – 手机爱问...
  18. matplotlib——pyplot和pylab区别
  19. xp系统设置ntp服务器,xp设置ntp服务器地址
  20. 日常英语---十一、MapleStory/Monsters/Level 201-210(Dark Demon Eagle Rider)

热门文章

  1. 百度文库上传总是被私有,如何正确上传百度文库
  2. 通识3——1080i、1080p、2K、4K是什么意思?
  3. java map put map_关于Java中有关Map中put方法理解
  4. java中put是什么意思_关于java:请求参数和PUT方法
  5. StudentManageSystem(学生管理系统)
  6. 批量webp格式转换成jpg操作方法
  7. 分治法_乒乓球比赛赛程安排(C语言)
  8. Retinanet论文解读
  9. 拆弹实验-phase_4
  10. Excel精选28个实用技巧实例学习