动态规划和贪心算法的区别
要想清楚两者的区别,首先就要了解两者的基本概念与性质。
1. 贪心算法
- 基本思想:贪心算法并不从整体最优上加以考虑,它所做的选择只是在某种意义上的局部最优解。
- 基本要素:
最优子结构性质
和贪心选择性质。
该算法存在问题:
1.不能保证求得的最后解是最佳的;
2.不能用来求最大或最小解问题;
3.只能求满足某些约束条件的可行解的范围。实现该算法的过程:
从问题的某一初始解出发;
while 能朝给定总目标前进一步 do
求出可行解的一个解元素;
由所有解元素组合成问题的一个可行解经典例子:
比如中国的货币,只看元,有1元2元5元10元20、50、100
如果我要16元,可以拿16个1元,8个2元,但是怎么最少呢? 如果用贪心算,就是我每一次拿那张可能拿的最大的。
比如16,我第一次拿20拿不起,拿10元,OK,剩下6元,再拿个5元,剩下1元 也就是3张 10、5、1。
每次拿能拿的最大的,就是贪心。
但是一定注意,贪心得到的并不是最优解,也就是说用贪心不一定是拿的最少的张数 贪心只能得到一个比较好的解,而且贪心算法很好想得到。
再注意,为什么我们的钱可以用贪心呢?因为我们国家的钱的大小设计,正好可以使得贪心算法算出来的是最优解(一般是个国家的钱币都应该这么设计)。如果设计成别的样子情况就不同了
比如某国的钱币分为 1元3元4元 如果要拿6元钱 怎么拿?贪心的话 先拿4 再拿两个1 一共3张钱 实际最优呢? 两张3元就够了
2. 动态规划
基本思想:将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
基本要素:最优子结构性质
和重叠子问题性质
3. 贪心算法与动态规划的区别
共同点:两者都具有最优子结构性质
不同点:
- 动态规划算法中,
每步所做的选择往往依赖于相关子问题的解,因而只有在解出相关子问题时才能做出选择
。而贪心算法,仅在当前状态下做出最好选择,即局部最优选择
,然后再去解做出这个选择后产生的相应的子问题。 - 动态规划算法通常以
自底向上的方式解各子问题
,而贪心算法则通常自顶向下的方式进行
。
4.总结
求最优解的问题,从根本上说是一种对解空间的遍历
。最直接的暴力分析容易得到,最优解的解空间通常都是以指数阶增长,因此暴力穷举都是不可行的。最优解问题大部分都可以拆分成一个个的子问题
,把解空间的遍历视作对子问题树的遍历,则以某种形式对树整个的遍历一遍就可以求出最优解,如上面的分析,这是不可行的。贪心和动态规划本质上是对子问题树的一种修剪。两种算法要求问题都具有的一个性质就是“子问题最优性”。即,组成最优解的每一个子问题的解,对于这个子问题本身肯定也是最优的。
如果以自顶向下的方向看问题树(原问题作根),则,我们每次只需要向下遍历代表最优解的子树就可以保证会得到整体的最优解。形象一点说,可以简单的用一个值(最优值)代表整个子树,而不用去求出这个子树所可能代表的所有值。
动态规划方法代表了这一类问题的一般解法。我们自底向上(从叶子向根)构造子问题的解,对每一个子树的根,求出下面每一个叶子的值,并且以其中的最优值作为自身的值,其它的值舍弃。动态规划的代价就取决于可选择的数目(树的叉数)和子问题的的数目(树的节点数,或者是树的高度?)。
贪心算法是动态规划方法的一个特例。贪心特在,可以证明,每一个子树的根的值不取决于下面叶子的值,而只取决于当前问题的状况。换句话说,不需要知道一个节点所有子树的情况,就可以求出这个节点的值。
通常这个值都是对于当前的问题情况下,显而易见的“最优”情况。因此用“贪心”来描述这个算法的本质。由于贪心算法的这个特性,它对解空间树的遍历不需要自底向上,而只需要自根开始,选择最优的路,一直走到底就可以了。这样,与动态规划相比,它的代价只取决于子问题的数目,而选择数目总为1。
参考文章1
参考文章2
动态规划和贪心算法的区别相关推荐
- 从 活动选择问题 看动态规划和贪心算法的区别与联系
这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...
- (转)动态规划和贪心算法的区别
(转自)http://hi.baidu.com/35661327/blog/item/d5463e17f1e8d011972b439c.html 动态规划和贪心算法的区别 2009-07-27 13: ...
- 活动安排问题的 动态规划和贪心算法
这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...
- 浅谈动态规划和分治、贪心算法的区别
一个问题必须拥有重叠子问题和最优子结构,才能使用动态规划去解决. 一.动态规划与分治算法 分治和动态规划都是将问题分解为子问题,然后合并子问题的解得到原问题的解. 但是不用的是,分治法分解出的子问题是 ...
- 分治法、动态规划、贪心算法区别
联系 分治.动态规划.贪心算法都是把一个大的问题给分解成子问题,通过解决子问题来最终解决原问题的. 区别 分治: 子问题不重复时候更适合,重复也能用,效率低,最好动态规划. 动态规划: 重复的公共子问 ...
- 分治算法,动态规划算法和贪心算法的区别和联系
分治算法,动态规划算法和贪心算法的区别和联系 (一)分治算法 分治算法为什么叫分治算法? 分治这个名字可以分成两部: 第一部分是分,表示把一个原问题分解成很多个小问题,逐个解决; 第二部分是治, 表示 ...
- 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。
十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...
- 53. 最大子序和 golang (动态规划与贪心算法)
题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续 ...
- 动态规划法和贪心算法
动态规划法和贪心算法 csdn第一篇blog. 先说说写文章的好处: 第一,写文章是个学习的过程.写的过程中随着自己的思路的进行,会出现理解不清楚的地方,自然就会翻书或者google的搞明白. 第二, ...
最新文章
- Docker-Compose简介与Ubuntu Server 上安装Compose
- xp中mysql优化_XP加速技巧大盘点 看看那个最实用
- linux命令取ip,linux下命令取IP地址的多种方法
- 微信“拍一拍”新增“炸一炸”功能;爱奇艺 CEO:会费涨价是行业必然趋势;微软终止 Windows 10X 开发|极客头条...
- 走近源码:Redis的启动过程
- 【PS】4组318张超高清叠加层+PS动作图片素材
- java封装-猫狗宠物店案例
- 不忘初心,能偷懒就偷懒:C#操作Word文件
- 惠普笔记本恢复出厂系统
- 下载chrome的.crx文件
- 简单概述PCIe总线协议
- 笔记︱联邦学习与隐私计算的案例集锦(一)
- TensorFlow进阶--实现学习率随迭代次数下降
- 最新92kaifa开发的帝国cms7.5美nv主播视频网站源码 自适应手机端
- [Practical.Vim(2012.9)].Drew.Neil.Tip20学习摘要
- 断点续传服务端处理(http206)
- SINS工具箱介绍—各种初始对准方法
- 惠斯通电桥与运算放大器的输入失调电流和输入偏置电流
- 微信小程序之滔搏运动
- 用华为模拟器ENSP编写一个电子信息学院数据中心网络及机房规划设计(路由毕业设计)(思科配置电子信息学院数据中心网络及机房规划设计也有)
热门文章
- 使用 JIRA 4.0 + Greenhopper 4.0 进行项目状态跟踪(转)
- tomcat配置一个线程来调试ThreadLocal的代码问题
- Egret IDE中搜索,过滤文件,只搜索.ts
- 在线代码编辑器---codemirror插件
- canvas象棋 画图
- ASP.NET %%,%=%,%#%区别
- Android studio libs目录
- 转 Intellij中的常用快捷键
- Python3.5 报错:NameError: name 'reload' is not defined
- linux系统-软链接与硬链接区别