1. 贪婪法定义

贪婪法,又称贪心算法,是寻找最优解问题的常用方法,这种方法模式一般将求解过程分成若干个步骤,但每个步骤都应用贪心原则,选取当前状态下最好的或最优的选择(局部最有利的选择),并以此希望最后堆叠出的结果也是最好或最优的解。

贪婪法的每次决策都以当前情况为基础并根据某个最优原则进行选择,不从整体上考虑其他各种可能的情况。

2. 贪婪法劣势

贪婪法与其他方法最大的不同在于,贪婪法每一步选择完局部最优解之后就确定了,不再进行回溯处理,也就是说,每一个步骤的局部最优解确定以后,就不再修改,直到算法结束。

因为不进行回溯处理,贪婪法只在很少的情况下可以得到真正的最优解,比如最短路径问题、图的最小生成树问题。在大多数情况下,由于选择策略的“短视”,贪婪法会错过真正的最优解,而得不到问题的真正答案。

但是贪婪法简单、高效,省去了为找最优解可能需要的穷举操作,可以得到与最优解比较接近的近似最优解,通常作为其他算法的辅助算法来使用。

3. 设计步骤

贪婪法的基本设计思想有以下三个步骤:

  • 建立对问题精确描述的数学模型,包括定义最优解的模型;
  • 将问题分解为一系列的子问题,同时定义子问题的最优解结构;
  • 应用贪心原则确定每个子问题的局部最优解,并根据最优解的模型,用子问题的局部最优解堆叠出全局最优解。

举个例子:某国发行的货币有 25 分、10 分、5 分和 1 分四种硬币,如果你是售货员且要找给客户 41 分钱的硬币,如何安排才能找给客人的钱既正确且硬币的个数又最少?

这个问题的子问题定义就是从四种币值的硬币中选择一枚,使这个硬币的币值和其他已经选择的硬币的币值总和不超过 41 分钱。

子问题的最优解结构就是在之前的步骤已经选择的硬币再加上当前选择的一枚硬币,当然,选择的策略是贪婪策略,即在币值总和不超过 41 的前提下选择币值最大的那种硬币。按照这个策略,第一步会选择 25 分的硬币一枚,第二步会选择 10 分的硬币一枚,第三步会选择 5 分的硬币一枚,第四步会选择 1 分的硬币一枚,总共需要 4 枚硬币。

上面的例子得到的确实是一个最优解,但是很多情况下贪婪法都不能得到最优解。同样以找零钱为例,假如,某国货币发行为 25 分、20 分、5 分和 1 分四种硬币,这时候找 41 分钱的最优策略是 2 枚 20 分的硬币加上 1 枚 1 分硬币,一共 3 枚硬币,但是用贪婪法得到的结果却是 1 枚 25 分硬币、3 枚 5 分硬币和 1 枚 1 分硬币,一共 5 枚硬币。

4. 实例

贪婪法的经典例子—— 0-1 背包问题:有 N 件物品和一个承重为 C 的背包(也可定义为体积),每件物品的重量是 wi,价值是 pi,求解将哪几件物品装入背包可使这些物品在重量总和不超过 C 的情况下价值总和最大。

背包问题(Knapsack Problem)是此类组合优化的 NP 完全问题的统称,如货箱装载问题、货船载物问题等,因问题最初来源于如何选择最合适的物品装在背包中而得名,这个问题隐含了一个条件,每个物品只有一件,也就是限定每件物品只能选择 0 个或 1 个,因此又被称为 0-1 背包问题。

来看一个具体的例子,有一个背包,最多能承载重量为 C=150 的物品,现在有 7 个物品(物品不能分割成任意大小),编号为 1~7,重量分别是 wi=[35,30,60,50,40,10,25],价值分别是 pi=[10,40,30,50,35,40,30],现在从这 7 个物品中选择一个或多个装入背包,要求在物品总重量不超过 C 的前提下,所装入的物品总价值最高。

常见的贪婪策略:

  1. 根据物品价值选择,每次都选价值最高的物品;
  2. 根据物品重量选择,每次都选择重量最轻的物品;
  3. 定义一个价值密度的概念,每次选择都选价值密度最高的物品,物品的价值密度 si 定义为 pi/wi;

算法设计思想(2)— 贪婪法相关推荐

  1. 第1-2课:算法设计常用思想之贪婪法

    算法作为智力活动的结果,并不是随机头脑风暴活动的产物,虽然因人而异,会有不同的结果,但是基本上它应该是遵循一定规律的活动结果.首先,它需要一些基础性的知识作为这种智力活动的着力点,比如相关领域的数学知 ...

  2. 1-2、算法设计常用思想之贪婪法

    文章内容来自王晓华老师 贪心算法,是寻找最优解问题的常用方法 这种方法模式一般将求解过程分成若干个步骤,但每个步骤都应用贪心原则,选取当前状态下最好的或最优的选择(局部最有利的选择),并以此希望最后堆 ...

  3. (十五)算法设计思想之“回溯算法”

    算法设计思想之"回溯算法" 回溯算法是什么? 什么问题适合用回溯算法解决? 适合回溯算法解决的问题 全排列 LeetCode:46.全排列 LeetCode:78.子集 思考题 回 ...

  4. (十四)算法设计思想之“贪心算法”

    算法设计思想之"贪心算法" 贪心算法是什么 LeetCode:455.分饼干 LeetCode:122.买卖股票的最佳时机II 思考题 贪心算法是什么 贪心算法是算法设计中的一种方 ...

  5. (十三)算法设计思想之“动态规划”

    算法设计思想之"动态规划" 动态规划是什么? 动态规划的步骤 LeetCode:70.爬楼梯 LeetCode:198.打家劫舍 思考题 动态规划是什么? 动态规划是算法设计中的一 ...

  6. (十二)算法设计思想之“分而治之”

    算法设计思想之"分而治之" 分而治之是是什么 场景一:归并排序 场景二:快速排序 LeetCode:374.猜数字大小 LeetCode:226.翻转二叉树 LeetCode:10 ...

  7. 算法设计与分析_[04] 天牛须算法设计思想分析

    原文链接: https://arxiv.org/abs/1710.10724​arxiv.org 算法实现: 首先,初始化参数 ,分别代表初始解,初始的搜索范围,以及更新步长,且通过原文我们知道: 在 ...

  8. 五大算法设计思想,你都知道吗?

    作者:叫我不矜持 链接:https://www.jianshu.com/p/bf8b0668d191 一.分治法 1.概念: 将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分 ...

  9. 求一个任意实数c的算术平方根g的算法设计思想_算法复习第四篇——贪心法

    公元2020年5月5日,距离算法考试仅剩4天. 一.知识归纳 1.设计思想 只根据当前已有的信息就做出选择,而且一旦做出了选择,将来无论如何都不能更改 不从整体最优考虑,所做的选择只是在某种意义上的局 ...

最新文章

  1. 结合Android去水印APP谈谈分区存储
  2. 在VS2010中使用wxWidgets 2.9.3
  3. 之全能忙内_临沧大名山茶:喝过诸多忙肺茶,但你不知道什么是“隔年香”
  4. leetcode 433. Minimum Genetic Mutation | 433. 最小基因变化(图的DFS)
  5. php 什么时候传引用,什么时候在PHP中使用传递引用?
  6. 被扎克伯格销毁的笔记本,暗藏 Facebook 所有成败
  7. 34. HTTP服务的七层架构技术解析及运用
  8. CentOS 5.11下Oracle 11G R2 Dataguard搭建
  9. 简单的小说阅读网站JavaWeb项目
  10. css3优惠券的样式集合
  11. 学UI设计要学哪些软件
  12. 腾讯裁员,裁出“财务自由”
  13. HDU:2188悼念512汶川大地震遇难同胞——选拔志愿者 (威佐夫博弈)
  14. html折叠 手风琴效果,jQuery制作效果超棒的手风琴折叠菜单
  15. DCM4CHEE-ARC-LIGHT
  16. HACKTHEBOX——Blocky
  17. SSD测试专题(三)
  18. eSIM的基本原理、相关标准、产业和应用
  19. 刘克亚十二条营销铁律
  20. DB2ADVIS returning error -220

热门文章

  1. 淘宝获取单笔订单信息服务端调用API及流程
  2. @Transactional注解最容易忽视的三个失效场景!
  3. 2022-2028年中国刨花板市场投资分析及前景预测报告(全卷)
  4. Python+OpenCV 图像处理系列(4)—— 图像像素的读写、算术运算、逻辑运算及像素的统计
  5. SQL case when
  6. 卷积池化计算 深度学习
  7. Python xrange() 函数
  8. 什么是GStreamer?
  9. 从C到C++过渡的3个原因
  10. 2021年大数据Spark(二十二):内核原理