在学习算法的过程中,递归、分治、动态规划、贪心、回溯、分支限界这些算法有些类似,都是为了解决大问题,都是把大问题拆分成小问题来解决,但她们之间还是有一些不同之处的,我来给同学们整理一下。

一、算法思想

1.递归算法(recursion algorithm)

大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归。

直接或间接地调用自身的算法称为递归算法。 递归是算法设计与分析中常用的一种技术,描述简单且易于理解。

2.分治法(divide and conquer method)

是将待求解的原问题划分成k个较小规模的子问题,对这k个子问题分别求解。如果子问题的规模仍然不够小,则再将每个子问题划分为k个规模更小的子问题,如此分解下去,直到问题规模足够小,很容易求出其解为止(子问题求解思路一致),再将子问题的解合并为一个更大规模的问题的解,自底向上逐步求出原问题的解。

3.动态规划法(dynamic programing method)

是将待求解问题分解成若干个相互重叠的子问题,每个子问题对应决策过程的一个阶段,一般来说,子问题的重叠关系表现在对给定问题求解的递推关系(也就是动态规划函数)中,将子问题的解求解一次并填入表中,当需要再次求解此子问题时,可以通过查表获得该子问题的解而不用再次求解,从而避免了大量重复计算。

4.贪心法(greedy method)

贪心法在解决问题的策略上目光短浅,只根据当前已有的信息就做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变。换言之,贪心法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优。这种局部最优选择并不总能获得整体最优解(Optimal Solution),但通常能获得近似最优解(Near-Optimal Solution)。

5.回溯法(back track method)

回溯法就是一种有组织的系统化搜索技术,可以看作是蛮力法穷举搜索的改进。回溯法每次只构建可能解的一部分,然后评估这个部分解,如果这个部分有可能导致一个完全解,对其进一步搜索,否则,就不必继续构造这部分的解了,回溯法常常可以避免搜索所有可能的解,所以,它往往比满立法效率更高,适用于求解组合数组较大的问题。

回溯法是以深度优先方式搜索问题解的算法,它适用于组合数较大的问题,能系统地搜索到一个问题的所有解惑任一解。

6.分支限界法(branch and bound method)

分支限界法按广度优先策略遍历问题的解空间,在遍历过程种,对已经处理的每一个结点根据限界函数估算目标函数的可能值,从中选取使目标函数取得极值(极大或极小)的结点优先进行广度优先搜索,从而不断调整搜索方向,尽快找到问题的解。因为界限函数常常是基于问题的目标函数而确定的,所以,分支限界法适用于求解最优化问题。

分支界限法的求解目标是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。(分支界限法与回溯法求解目标不同)

二、算法差异

1.递归算法和分治法的区别

递归只是处理办法,分治是手段。他们就像一对孪生兄弟,经常同时应用在算法设计中,并由此产生许多高效的算法。

分治可以用递归来实现,也可以用别的算法来实现。

2.分治法和动态规划法的区别

共同点:二者都要求原问题具有最优子结构性质,都将原问题分成若干个子问题,然后将子问题的解合并,形成原问题的解。

不同点:动态规划法是将待求解问题分解成若干个相互重叠的子问题,而分治法是分解成若干个互不相交的子问题。利用分治法求解,这些子问题的重叠部分被重复计算多次。而动态规划法将每个子问题只求解一次并讲其保存在一个表格中,当需要再次求解此子问题时,只是简单地通过查表获得该子问题的解,从而避免了大量的重复计算。

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

共同点:贪心算法和动态规划算法都要求问题具有最优子结构性质。

不同点:动态规划法用到之前的最优解,贪心则不是,贪心无法解决动态规划的问题,但是动态规划能解决贪心的问题。虽然能够应用贪心算法一定能够应用动态规划法,但是一般来说,贪心算法的效率高于动态规划法,因而还是应用贪心算法。动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每做一次贪心选择就将所求问题简化为规模更小的子问题。

4.回溯法和分支限界法的区别

共同点:一种在问题的解空间树上搜索问题解的算法。

不同点:求解目标不同,回溯法的目标是找出解空间树满足约束条件的所有解,而分支限界法的求解目标是尽快地找出满足约束条件的一个解;搜索方法不同,回溯法采用深度优先方法搜索解空间,而分支限界法一般采用广度优先或以最小消耗优先的方式搜索解空间树;对扩展结点的扩展方式不同,回溯法中,如果当前的扩展结点不能够再向纵深方向移动,则当前扩展结点就成为死结点,此时应回溯到最近一个活结点处,并使此活结点成为扩展结点。分支限界法中,每一次活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点;存储空间的要求不同,分支限界法的存储空间比回溯法大得多,当内存容量有限时,回溯法成功的可能性更大。

三、适用情况

1.递归算法

适用特征:递归的基本思想就是把规模大的问题转化为规模小的相似的子问题来解决。特别地,在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况,这也正是递归的定义所在。格外重要的是,这个解决问题的函数必须有明确的结束条件,否则就会导致无限递归的情况。

典型代表:Fibonacci函数、Hanoi问题、数据结构(二叉树、广义表)

2.分治法

适用特征:该问题的规模缩小到一定的程度就可以容易地解决;可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;利用该问题分解出的子问题的解可以合并为该问题的解;所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。

典型代表:二分搜索、棋盘覆盖、合并排序、最接近点对问题、循环赛日程表、汉诺塔、Fibonacci数列、阶乘、快速排序......

3.动态规划法

适用特征:该问题问题的最优解所包含的子问题的解也是最优的,即满足最优化原理;某状态以后的过程不会影响以前的状态,只与当前状态有关;子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。

典型代表:最长公共子序列、最优二叉查找树、近似串匹配问题......

4.贪心法

适用特征:该问题局部最优策略能导致产生全局最优解(贪心算法适用的情况很少)。

典型代表:TSP问题(最近邻点)、TSP问题(最短链接)、图着色、背包问题、多极度调度问题、霍夫曼编码、单源最短路径(Dijkstra算法)、最小生成树(Prim和Kruskal算法)

5.回溯法

适用特征:该问题是求解组合数量较大;需要找出该问题的解集(全部解)或者要求回答什么解是满足某些约束条件的最优解。

典型代表:哈密顿回路问题、八皇后问题、批处理作业调度......

6.分支限界法

适用特征:求解最优化问题。

典型代表:任务分配问题、多段图的最短路径问题、批处理作业调度问题、电路布线问题......


我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!

参考资料:

  1. https://blog.csdn.net/m0_37872090/article/details/80819788
  2. https://blog.csdn.net/acema/article/details/27864323
  3. https://blog.csdn.net/weixin_43025071/article/details/89149695

算法高级(28)-递归、分治、动态规划、贪心、回溯、分支限界几大相似算法比较相关推荐

  1. 数据结构与算法之暴力递归改动态规划

    数据结构与算法之暴力递归改动态规划 目录 二维数组最小路径和 暴力递归改动态规划解析 任意选择数组arr中的数字,看能不能累加得到aim 1. 二维数组最小路径和 (一) 题目描述 (二) 思路 递归 ...

  2. Algorithms_算法思想_递归分治

    文章目录 引导案例 递归的定义 什么样的问题可以用递归算法来解决 递归如何实现以及包含的算法思 递归的公式 斐波那契数列代码实现 递归的时间复杂度和空间复杂度 递 与 归 递归的优化 优化方式一:不使 ...

  3. 算法笔记:递归、动态规划

    目录 递归.分治和动态规划 德罗斯特效应 递归.分治和动态规划 迭代和递归的区别 分治 动态规划 解法 斐波那契数 解法1:暴力递归 解法2:记忆化存储 解法3:动态规划 解法4:自底向上迭代 动态规 ...

  4. 【算法】【递归与动态规划模块】斐波那契数列的系列问题解法及递推类型问题的最优解

    目录 前言 问题介绍 解决方案 代码编写 java语言版本 c语言版本 c++语言版本 思考感悟 写在最后 前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批 ...

  5. 算法高级(7)-限流(Rate limit)算法详解

    一.前言 保障服务稳定的三大利器:熔断降级.服务限流和故障模拟.今天和大家谈谈限流算法的几种实现方式,本文所说的限流并非是Nginx层面的限流,而是业务代码中的逻辑限流. 那么为什么需要限流呢? 按照 ...

  6. 算法思想之递归分治回溯

    参考文档 递归思想 思想 描述 递归 当需要重复地多次计算相同的问题,通常可以采用递归或循环.递归是在一个函数内部调用这个函数自身. 递归的本质是把一个问题分解成两个或多个小问题.(注:当多个小问题存 ...

  7. 【算法】【递归与动态规划模块】两个字符串的公共最长子序列

    目录 前言 问题介绍 解决方案 代码编写 java语言版本 c语言版本 c++语言版本 思考感悟 写在最后 前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批 ...

  8. 【算法】【递归与动态规划模块】两个字符串的最长公共子数组

    目录 前言 问题介绍 解决方案 代码编写 java语言版本 c语言版本 c++语言版本 思考感悟 写在最后 前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批 ...

  9. 数据结构和算法之暴力递归到动态规划01-绝顶聪明纸牌问题

    从一开始的暴力递归到傻瓜式的缓存动态规划到最终的动态规划 package day_16;/*** 给定一个整型数组arr,代表数值不同的纸牌排成一条线* 玩家A和玩家B依次拿走每张纸牌* 规定玩家A先 ...

最新文章

  1. NetworkX系列教程(1)-创建graph
  2. JQGrid 参数、属性API
  3. Became Jane(成为简.奥斯丁)
  4. eclipse 使用svn导入web项目
  5. 使用OpenSSL颁发CA证书
  6. 重磅:国刊4区变1区!2021年中科院分区表正式公布!
  7. Keil中C代码常见错误的解决
  8. 建造者2全部岛屿_勇者斗恶龙建造者2全流程攻略介绍 通关流程攻略分享 蒙佐拉岛-游侠网...
  9. linux下添加三菱触摸屏usb驱动,[转载]三菱触摸屏GT Works3和PLC GX Works2编程软件下载...
  10. 功率因数cosφ仪表盘
  11. centos7系统开启ftp服务器,centos7开启ftp服务器
  12. Channel 9视频整理【6】
  13. 《Cisco VPP SFC》4、ODL SFC 安装
  14. 如何在 WordPress 中嵌入 iFrame
  15. iOS 应用商店评分StoreReview
  16. 企查查app新增企业数据抓取
  17. 八大口碑速溶咖啡品牌盘点
  18. 微信H5支付(V3)
  19. 个人信息、敏感个人信息的识别和保护原则
  20. CRM系统中,哪个品牌比较好?

热门文章

  1. java i++与++i与与之间的区别在哪里
  2. swift开发:试玩 Apple 网站的 playground
  3. 微服务设计模式(下)
  4. Spring boot - Thymeleaf 使用
  5. lnmp mysql 10061问题
  6. PHP key() 函数
  7. 认识计算机网络教案小学,初识计算机网络教案
  8. JAVA 虚拟机类加载机制和字节码执行引擎
  9. 写出高效优美的C语言代码(单片机)
  10. 这河里吗?Go 里边空指针还能调用对象方法!