贪心算法(Greedy Algorithm)理论篇
求解最优化问题的算法通常需要经过一系列的步骤,在每个步骤都面临多种选择。对于许多最优化问题,使用动态规划算法来求解最优解问题有点大材小用,可以使用更简单、更高效的算法,如贪心算法。贪心算法在每一步都做出当时看起来最佳的选择,也就是局部最优的选择,寄希望这样的选择能导致全局最优解。
贪心算法并不保证得到最优解,但很多问题确实可以求得最优解。贪心算法通常是自顶向下的设计:做出一个选择,然后求解剩下的那个子问题,而不是自底向上地求解出很多子问题,然后再做出选择。
贪心算法原理
贪心算法通过做出一系列选择来求出问题的最优解。在每个决策点,贪心算法做出在当时看似最佳的选择。这种启发式策略并不能保证总能找到最优解,但对有些问题确实有效。可以按照如下步骤设计贪心算法:
(1) 将最优化问题转换成这种形式:对其做出一次选择后,只剩下一个子问题需要求解。
(2) 证明做出贪心选择后,原问题总是存在最优解,即贪心选择总是安全的。
(3) 证明做出贪心选择后,剩余的子问题满足性质:其最优解与贪心选择组合即可得到原问题的最优解,这样就得到了最优子结构。
如何证明一个贪心算法是否能求解一个最优解问题?并没有普适的方法。但贪心选择性质和最优化子结构是两个关键要素。
贪心选择性质(Greedy-Choice Property)
贪心选择性质是指可以通过做出局部最优(贪心)选择来构造全局最优。也就是说,当进行选择时,只需要做出当前问题中看起来最优的选择,则不必考虑子问题的解。
在动态规划中,每个步骤都要进行一次选择,但选择通常依赖于子问题的解。因此,通常以一种自底向上的方式求解动态规划的问题:先求解较小的子问题,然后是较大的子问题。而在贪心算法中,总是做出当前看起来最佳的选择,然后求解剩下的唯一的子问题。贪心算法进行选择时,可能依赖之前的选择,但不依赖任何将来的选择或子问题的选择。因此,动态规划是先求解子问题然后才能进行第一次选择,贪心算法在进行第一次选择之前不求解任何子问题。
注意,必须证明每个步骤做出的贪心选择能生成全局最优解。否则,这个问题可能无法用贪心算法获取最优解。
最优子结构
如果一个问题的最优解包含其子问题的最优解,则称此问题具有最优子结构性质。(与动态规划中最新子结构概念一致)
当使用贪心算法时,通常使用更为直接的最优子结构。通过使用贪心选择得到子问题后,接下来需要做的就是论证,将子问题的最优解与贪心选择组合在一起后能生成原问题的最优解。这种方法隐含地对子问题使用了数学归纳法,证明在每个步骤进行贪心选择会生成原问题的最优解。
贪心算法和动态规划
贪心算法和动态规划都利用最优子结构性质。
动态规划算法将问题划分为多个子问题,然后将这些子问题的最优解整合成原问题的一个最优解。在确定该将哪些子问题用于最优解时,要考虑几种选择。贪心算法只需考虑一个选择(即贪心的选择),进而完成贪心方法的过程。
贪心算法和动态规划最大的不同在于,动态规划会首先寻找子问题的最优解,然后在其中进行选择,则贪心算法是首先做出一次“贪心”选择(在局部看来最优的选择),然后求解选出的子问题,从而不必费心求解所有可能相关的子问题。
贪心算法的实现方法
贪心算法通常使用自顶向下的思想设计:做出一个选择,然后求解剩下的子问题,而不是自底向上地求解出子问题,然后再做出选择。在实现方式上,又可细分为基于递归的贪心算法和基于迭代的贪心算法。
拟阵和贪心算法
贪心算法的背后有一个相当复杂的理论,它是基于一种称为“拟阵”(matroid)的抽象组合结构。虽然该理论不能涵盖贪心方法适用的所有情况,但它确实覆盖了很多有实际意义的情况。而且,这种理论的扩展还覆盖了其他应用。更多拟阵相关的理论可参考《算法导论》一书或专业数据书籍。
参考
《算法导论》 第十六章 贪心算法 第三版 Tomas H. Cormen etc. 殷建平 等译
《算法设计与分析基础》 第九章 贪婪技术 第三版 Anany Levitin 著 潘彦 译
贪心算法(Greedy Algorithm)理论篇相关推荐
- 动态规划(Dynamic Programming)与贪心算法(Greedy Algorithm)
文章目录 动态规划算法(Dynamic Programming) 动态规划问题的属性 应用实例:最长公共子序列问题(Longest Common Subsequence, LCS) 贪心算法(Gree ...
- 贪心算法(Greedy Algorithm)最小生成树 克鲁斯卡尔算法(Kruskal#39;s algorithm)
克鲁斯卡尔算法(Kruskal's algorithm)它既是古典最低的一个简单的了解生成树算法. 这充分反映了这一点贪心算法的精髓.该方法可以通常的图被表示.图选择这里借用Wikipedia在.非常 ...
- 贪心算法 (Greedy Algorithm)
贪心算法 如果要简要得描述这个算法的话就是,首先边的权重排序.(从小到大)循环的判断是否需要选择这里的边.判断的依据则是边的两个顶点是否已经连通,如果连通则继续下一条.不连通就选择使其连通. http ...
- 贪心(Greedy Algorithm)
贪心(Greedy Algorithm) 贪心 44.通配符匹配 45.跳跃游戏 II 55.跳跃游戏 122.买卖股票的最佳时机II 134.加油站 135.分发糖果 179.最大数 277.搜寻名 ...
- java贪心算法几个经典例子_经典算法思想5——贪心(greedy algorithm)
贪心算法,是指在对问题求解时,总是做出再当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是某种意义上的局部最优解. 贪心算法没有固定算法框架,算法设计的关键是贪心策略的选择.必须注 ...
- 贪心算法(Greedy Algorithms)
1.贪心法的设计思想 贪心算法在解决问题的策略上目光短浅, 只根据当前已有的信息就做出选择,而且 一旦做出了选择,不管将来有什么结果,这个选择都不会改变.换言之,贪心法并不是从整体最优考虑,它所做出的 ...
- 贪心算法|Greedy Algorithms(背包问题)
贪心算法是一种用于优化问题的简单.直观的算法.该算法在寻找整体最优解的过程中,每一步都进行最优选择.贪心算法在一些问题上是非常成功的,例如用于压缩数据的霍夫曼编码,或者用于通过图寻找最短路径的Dijk ...
- 贪心算法 Greedy
目录 基本思想 简单题目 455 分发饼干 1005 K次取反后最大化的数组和 860 柠檬水找零 序列问题 376 摆动序列 738 单调递增的数字 股票问题 122 买卖股票的最佳时机Ⅱ 两个维度 ...
- 【算法学习】贪心算法
参考算导第三版第16章 贪心算法 文章目录 1. 活动选择问题 1.1 活动选择问题的最优子结构 1.2 贪心选择 1.3 递归贪心算法 1.4 迭代贪心算法 2. 贪心算法原理 2.1 贪心选择性质 ...
- leetcode 贪心_贪心算法:给我最好的,现在就要!
每次做选择的时候都做出当下最好的选择,而不考虑将来的后果.并且期望最终得到的结果是全局最优的. --贪心算法 - Greedy Algorithm 什么时候该使用贪心算法 针对一组数据,定义了限制值. ...
最新文章
- jquery 设置css样式
- 闯荡北京卖枣的临县人:同有一个“红枣美梦”(2张)
- html手机pc不同页面,PC端和手机端如何同时生成静态页
- Python configparser模块
- git 未能顺利结束(退出码1)
- 脆弱的是生命 不脆弱的是精神 雅安 挺住!
- ruby+selenium-webdriver一步一步完成自动化测试(5)—–多个测试用例
- cisco设备vlan,trunk,以太网通道管理
- 语音识别软件_语音识别软件是什么_离线语音识别软件_企业服务汇
- 10 年前被删的初恋,凌晨 1 点突然加我…屌丝的眼泪
- 将页面强制保持在所属框架中
- BottomNavigationView+ViewPager+Fragment 底部导航按钮
- [Maven实战-许晓斌]-[第二章]-2.6 NetBeans上面安装Maven插件
- 数据字典chm制作教程
- 联想台式计算机亮度怎么调,Lenovo笔记本电脑如何调节屏幕亮度
- 香港理工大学计算机系 主任,我校与香港理工大学合作MScIS项目第七期开学
- 在计算机中 汉字系统把一个汉字表示为,计算机问题汉字系统在计算机内把一个汉字表示 – 手机爱问...
- matplotlib——pyplot和pylab区别
- xp系统设置ntp服务器,xp设置ntp服务器地址
- 日常英语---十一、MapleStory/Monsters/Level 201-210(Dark Demon Eagle Rider)