分治、动态规划、贪婪  之 算法分析

分治与动态规划都用到了递归的思想,但是对他们之间的区别在概念上一直比较模糊,今天附带贪婪选择稍微整理一下他们。

算法之道上说,标准分治、动态规划、贪婪选择称得上是孙子兵法的下、中、上策。标准分治虽然将大问题分解成小问题,但是每个小问题都需要解决,相当于逢城必攻实属下策;动态规划则聪明地发现,很多子问题都相同,那么重复的子问题可以不用重复计算,就是不对每个城市进行攻破,从而节省精力和兵力,但仍然需要攻克子问题中的相当部分,属于中策;而贪婪选择则将子问题限于一个,即将攻城数量减少到了最低,从而最大限度上减少了精力和兵力,属于上策。不过就像兵法里所云,上策运用地不好,就有失策的时候。贪婪思想运用地不当,或者在条件不充分或不明朗的条件下用,则会大败而归。

从另一个方面看,三种策略都为了在求解问题的时候成本尽量低,因此,从这个方面看,三种策略的目标一致,但是标准分治策略的目标只是获得问题的解,动态规划和贪婪选择不仅是要获得一个解,而且应该是个最优解,因此贪婪选择和动态规划之间的相似性最多。不过虽然动态规划和贪婪选择策略有许多相同的地方,但是有时候并不容易看出来。贪婪选择属性指的是一个全局最优解决方案可以通过解决一个局部最优的选择来获得。对于一个贪婪算法来说,其选择具有贪婪的性质,那么对于动态规划来说呢,他每一步都需要作出一个选择,而是在已知子问题解的基础上作出的当前最好的选择,所以动态规划每一步都需要运用贪心策略。也就是说,贪婪策略是在解决子问题前作出选择,希望作出的选择是正确的,是自顶向下。动态规划则是在求解子问题后作出选择,是自底向上。但不管是在之前还是之后做选择,都是试图作出最好的选择。背包问题可用贪心策略来解决。

分治法和递归是紧密联系的,分治就是把大问题分解成规模较小的子问题,然后大问题的解可以通过小问题的解得出来,小问题是相互独立的,可以通过递归来解决。
分治法所能解决的问题一般具有以下几个特征:
该问题的规模缩小到一定程度可以很容易地解决;
该问题可以分解成若干规模相同的子问题,即该问题具有最优子结构性质;
利用该问题分解出的子问题的解可以合并成该问题的解;
该问题所分解出的子问题是相互独立的,即子问题不包含公共的子问题。
分治在每一层递归上都要完成分解、解决、合并三个操作。

归并排序、堆排序、快速排序都有分治算法的思想。

通常遇到的复杂问题不能简单地分解成几个子问题,而是会分解成一系列子问题并且子问题并不是相互独立的,简单地把大问题分解成子问题,并综合子问题的解求出大问题的解的方法,问题求解时会按问题规模呈现幂级数增加。为了节约重复求相同子问题的时间,引入一个数组,不管他们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。典型的Fibonacci数列的求解就运用了动态规划的思想。

转载于:https://www.cnblogs.com/fengty90/p/3768833.html

分治、动态规划、贪婪 之 算法分析相关推荐

  1. C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划

    C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...

  2. DSt:数据结构的简介、最强学习路线(逻辑结构【数组-链表-栈和队列/树-图-哈希】、物理结构、数据运算【十大排序/四大查找-图三大搜索-树三大遍历】、高级算法【贪心/分治/动态规划】之详细攻略

    DSt:数据结构的简介.最强学习路线(逻辑结构[数组-链表-栈和队列/树-图-哈希].物理结构[元素/关系].数据运算[十大排序/四大查找-图三大搜索-树三大遍历].高级算法[贪心/分治/动态规划]) ...

  3. 每年技术研究方向一览

    文章目录 2019 年主要目标 研究方向 主要方向:大数据与并行计算在主流大数据库平台上的实践 次要方向:网络基础学习和理解 参考方向:人工智能.区块链.工业物联网 具体技术 基础:进一步提高开发环境 ...

  4. 最大子段和——用蛮力算法,分治策略,动态规划算法三种求法(C语言)

    目录 一.题目 二.算法求解 1.蛮力算法 伪代码 算法分析 程序 2.分治策略 伪代码 算法分析 程序 3.动态规划算法 伪代码 算法分析 程序 一.题目 设A=<a1,a2,...,an&g ...

  5. sql表中只有子节点的递归_动态规划与静态规划、递归、分治、回溯

    动态规划算是运筹学或者算法中的硬骨头了.不是说算法本身有多难,而是学完用完之后还是感觉到对其领会的不够深入,一种能用其术,不知其道的感觉.在很多教材或者回答中,经常看多将动态规划放在递归这一部分中.当 ...

  6. 递归、迭代、分治、回溯、动态规划、贪心算法

    今天就简单来谈谈这几者之间的关联和区别 递归 一句话,我认为递归的本质就是将原问题拆分成具有相同性质的子问题. 递归的特点: 1.子问题拆分方程式,比如:f(n) = f(n-1) * n 2.终止条 ...

  7. 【算法分析】实验 1. 基于贪心的会议安排问题

    目录 实验内容 实验目的 环境要求 实验结果 步骤一 步骤二 步骤三 步骤四 步骤五 步骤六 实验总结 附录:测试数据 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设计. ...

  8. 算法(Java)——动态规划

    算法相关数据结构总结: 序号 数据结构 文章 1 动态规划 动态规划之背包问题--01背包 动态规划之背包问题--完全背包 动态规划之打家劫舍系列问题 动态规划之股票买卖系列问题 动态规划之子序列问题 ...

  9. 贪心算法,递归算法,动态规划算法比较与总结

    一般实际生活中我们遇到的算法分为四类: 一>判定性问题        二>最优化问题        三>构造性问题        四>计算性问题 而今天所要总结的算法就是着重解 ...

最新文章

  1. 用c#输出正九九乘法表_用C#写九九乘法表
  2. 转---谈谈HTTP协议中的短轮询、长轮询、长连接和短连接
  3. 关于arp.exe的一点应用
  4. 51单片机扩展io口实验c语言,【51单片机】普通I/O口模拟SPI口C语言程序
  5. Visual Studio 2008 SP1 和 net framework 3.5 新特性
  6. NLP - 新闻文本分类-baseline
  7. java什么是接口_Java接口是什么
  8. LeetCode(1108)——IP 地址无效化(JavaScript)
  9. CSS学习总结(4)——盒模型/背景属性
  10. 使用GDI来绘制简易验证码
  11. 等额本息PMT和PPMT推导计算公式
  12. TeamViewer三种许可证的区别是什么?
  13. java多线程厨师做饼,Java多线程之厨师与食客问题
  14. 可以在PowerShell里使用的Word度量单位
  15. win10无法登录Microsoft账号(登录页面无法加载)
  16. 【新闻】微信出现大面积BUG!腾讯紧急回应!
  17. 计算机键盘按键失灵,电脑键盘失灵怎么办?4个小技巧解决电脑键盘失灵问题...
  18. VUE的插槽(slot和slot-scope)
  19. Linux虚拟机(lvm)报Unmount and run xfs_repair
  20. (manacher)马拉车算法专题题目

热门文章

  1. nginx 缓存时间说明
  2. Github 开源:使用控制器操作 WinForm/WPF 控件( Sheng.Winform.Controls.Controller)
  3. linux 安装python MySQLdb
  4. 利用Linux的文件命名规范在Windows中建立“高权限”文件
  5. SAP BI基本概念
  6. SLAM中的逆深度参数化
  7. 上传图片到第三方服务器
  8. bzoj[1835][ZJOI2010]base 基地选址
  9. arm64的适配问题,这次真醉了
  10. 团队项目第一阶段冲刺站立会议08