我们面对的是一个求最优解或统计之类的问题,这个问题基于“我们要模拟完成一个大任务”,这个大任务可以分成若干步骤,每个步骤有若干种决策,每个步骤完成后,就到达了一个阶段性状态
比如,你要从A地到Z地,没有直达,所以第一步需要到一个中间地点,比如H或I,第二步再前进,比如到P或Q,最后到达Z,每一步有若干决策,比如第一步你可以决定到H或I的中的某个,大致就是这样一个模型,可以自己画个地图看看
等等,你大概发现问题了,如果第一步到H和I都可以,第二步到P和Q都可以,那我每一步只选最优,不就用贪心得到结果了吗,没错,如果你需要经历的每个阶段状态跟决策无关,那就贪心得到结果好了,理解贪心了吗:)

然而现实情况可能是,你第一步的选择会影响后面的分支,比如你第一步可以选择到H或I,但是到了H后,你只能选择经过P或Q到Z了,而如果到了I,你只能选择R或S到Z,这样一来,即便第一步到H或I你选择了较好的一条路,也不保证最终结果最优,因为比如你选了H,那万一I-R-Z的路要比H开始到Z的路径短了更多,最优路径可能是A-I-R-Z,所以你要把这些路都尝试一遍,才知道哪个最优,理解穷举了么?:)

OK,我们稍微改下题设,假如从I出发不是到R和S,而是到Q或R,会如何

诚然,我们可以用穷举每条路来解决这个问题,需要穷举的路径数和上面的图一样,但是,我们可以有更快的办法,你不用将A-H-Q-Z和A-I-Q-Z两条路单独计算,因为他们有状态交点,结合第一张图的思想,可以敏锐地感觉到,我们只需要计算到每个有共同状态的位置求各阶段的最优,最后每阶段选最优组合贪心组合起来就行,因为各阶段完成的状态点是大家都有的嘛,因此,咱们先计算A-H-Q和A-I-Q,选个最好的,然后跟Q到Z中最好的拼起来,就是最优了,没必要把所有路径都搞一遍(虽然图里面Q到Z直达,但你可以发挥想象力,将其想象成各种分支的一条复杂道路),这样一来就把一个x^(a+b+c+...)的计算次数降低为x^a+x^b+x^c...,其中x代表每次的决策次数(简单点假设每次决策次数都一样),abc代表每个阶段的步骤数

因此,我们可以从A开始,向Z进行BFS,并对BFS中每个点保存最优状态,如果有不同的路径BFS到了同一个点,留最好的一条就行,比如上面这个,你的算法可能先从A-H-Q搜到了Q这个位置,之后从A-I-Q又到了这里,留最好的一条,最后一轮从PQR三个点到Z,就结束了,相对第二章图要少一次运算

如果你理解了,恭喜你已经能有效解决很多需要DP的问题了,同时还学会了解图论的单源最短路径问题呢

最后用经典的0-1背包问题做个例子,巩固一下吧,这个任务是,我们从N个物品选若干塞到可以承受最大重量W的包包里面,要价值最大,因此就可以将任务分成N个步骤,每个步骤面对第i号物品,决策有两条:选,还是放弃,这里的状态,就是影响之后步骤决策的因素,在这里,就是“背包的剩余空间”

比如,物品的重量是1,2,3,4,5,6,W=12,从头决策,0表示放弃,1表示选,BFS三次后有8种状态:
000 剩12
001 剩9
……(略)
110 剩9
……(略)
前三次步骤后,001和110到达了同样的状态,都是剩余可装重量9的东西,这样在剩下的决策中,这俩分支走的路都是一样的,跟你之前是选了001还是110没有任何关系(无后效性),因此只要看001价值大,还是110价值大就可以了,8个状态减少为7个,继续BFS下去,每一轮都合并同样状态,完成后,从最后一轮的所有状态中,找到价值最大的就ok了

由于状态最多有W+1个,进行N轮,因此复杂度O(NW),书上说的状态迁移方程的办法其实跟这个过程很类似,不过对于有些题目,比起BFS+状态合并,状态方程的分析可以做更好的优化,如引入单调队列什么的,但BFS+状态合并可以让你得到一个没有追求极限但是也比较快的解决方案了,结合具体问题有时候更适合,比如根据问题的实际需求,搜索可以限界剪枝减少工作量,我在工作中就用过,替换了同事从wiki抄的DP算法,效率能提升一些

作者:冒泡
链接:https://www.zhihu.com/question/39948290/answer/83942329
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

贪心 穷举 动态规划 区别相关推荐

  1. 算法设计之—直接 遍历/穷举法、贪心算法、动态规划、回溯法、EM方法

    算法是对完成特定问题的程序执行序列描述,表象为从问题初始状态到问题结束状态的所有路径之中寻找可行路径,若无先验经验,根据执行方式不同可以划分为无规则和有规则(启发式)方法. 无规则方法为穷举,改进方法 ...

  2. java递归实现汉字组词穷举_01背包各种算法代码实现总结(穷举,贪心,动态,递归,回溯,分支限界)...

    2020-05-22 所有背包问题实现的例子都是下面这张图 01背包实现之--穷举法: 1.我的难点: (1)在用穷举法实现代码的时候,我自己做的时候认为最难的就是怎么将那么多种情况表示出来,一开开始 ...

  3. 《数据科学家养成手册》第十一章------算法学1(穷举,分治,回溯,贪心,迭代)

    1.对于计算机学科的人员,无论是怎么样子的工作都是需要了解算法的-----从而获得解决日常问题的基本的思路 2.计算机底层的数理计算逻辑仍然是"与""或"&qu ...

  4. 常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)

    博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501 目录 1.穷举法 2.贪心算法 3.递归与分治算法 4.回溯算法 5.数值概率 ...

  5. 贪心算法和动态规划的区别

    一.动态规划  动态规划(简称DP)的思想是把一个大的问题进行拆分,细分成一个个小的子问题,且能够从这些小的子问题的解当中推导出原问题的解. 性质 1.最优子结构性:既所拆分的子问题的解是最优解. 2 ...

  6. 贪心法和动态规划法的区别

    动态规划和贪心算法的区别 动态规划和贪心算法都是一种递推算法  均用局部最优解来推导全局最优解 不同点:  贪心算法:  1.贪心算法中,作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推 ...

  7. 动态规划从理论到实践-深入理解贪心/分治/回溯/动态规划的算法思想

    摘要:本文主要讲解常见的四种算法,分别为贪心算法:第一步选择最优的走法,算法不能做到全局最优:分治算法:一种处理问题的思想,使用递归来实现:回溯算法:我们枚举所有的解,找到满足期望的解,可以把求解过程 ...

  8. java获取数组穷举_被BAT疯抢的Java工程师,都是怎么拿到年薪50W的offer

    怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名遭到BAT疯抢的架构师. 那么遭到BAT疯抢的架构师应该有怎样的技术知识体系,这不仅是一个刚刚踏入职场的初级程序员也是工作三五年之 ...

  9. 【最优化方法】穷举法 vs. 爬山法 vs. 模拟退火算法 vs. 遗传算法 vs. 蚁群算法

    一. 穷举法 列举所有可能,然后一个个去,得到最优的结果.如图一,需要从A点一直走到G点,才能知道,F是最高的(最优解).这种算法得到的最优解肯定是最好的,但也是效率最低的.穷举法虽然能得到最好的最优 ...

  10. 穷举法求最大公共子序列C语言,算法--最长公共子序列(LongestCommon Subsequence, LCS)...

    定义: 两个字符串共有的最长的子序列(可不连续),最长公共字符串(Longest CommonSubstring)是两个字符串共有的最长的连续字符串. 方法:穷举法,动态规划 动态规划法的简介: &l ...

最新文章

  1. PL/SQL -- 动态SQL调用包中函数或过程
  2. 我与 美国作家 21天精通C++ 作者 Rao的对话:
  3. Java-Maven(四):Eclipse集成Maven环境配置
  4. Java渐变进度条_Android ProgressBar自定义图片进度,自定义渐变色进度条
  5. 深入理解position:relative 与 position:absolute(divb相对于diva进行绝对定位)
  6. 9、 InnoDB行锁
  7. SAP Smartforms 条码打印
  8. 小朋友嘴里的“金钥匙”,良品小食仙、小鹿蓝蓝们要如何拿到?
  9. LoRaWAN的四大优势及适用领域
  10. 网龙面试后多久有回应_回应面试问题
  11. MySql、PowerDesigner、JDBC 的关系
  12. mac 黑窗口连接mysql_mac系统下mysql环境变量设置及远程连接
  13. PCA(主成分分析)的工作原理
  14. AJAX访问JSON数据
  15. sentinel卫星_常用的遥感卫星数据(一)哨兵
  16. MCU芯片通信接口设计
  17. 世界上最复杂的函数_世界上最伟大的10个公式,其中一个人尽皆知
  18. 高通QCS603/QCS605物联网系统芯片介绍,QCS603/QCS605处理器参数比较
  19. 5.4QBXT 模拟赛 (Rank1 机械键盘 蛤蛤)
  20. 考研还是工作?回过头来反思我当初为何没考研

热门文章

  1. 标准I/O缓冲:全缓冲、行缓冲、无缓冲
  2. 举例说明在SQL中,DELETE语句与DROP TABLE的区别
  3. exception内置对象
  4. 二、三层交换机与路由器
  5. mysql存表情出错的解决方案(类似\xF0\x9F\x98\x86\xF0\x9F)
  6. 通过企业账号邀请开发者(不需要支付99刀,在真机上调试)
  7. jquerymobile多页面切换
  8. 使用sshfs挂载服务器文件系统,用curlftpfs挂载FTP服务器
  9. 基于C#在Mongodb的Skip-Limit和Where-Limit的分页对比 并且含mongodb帮助类的源码
  10. [深入理解C++(一)]类型转换(Type Casting)