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

2023-11-09

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

一、算法思想

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • python爬虫(上课笔记)

    爬虫概述 爬虫 网络爬虫是一种按照一定的规则 自动地抓取万维网信息的程序或者脚本 其本质就是通过编写程序拟浏览器上网 抓取数据的过程 爬虫特点 在法律中都是不被禁止的 具有违法风险 爬虫是一个博弈的过程 反爬机制 反反爬策略 robots协
  • ffmpeg demux 实时流

    FFMPEG 的参数当中就有 i 表示 input 这里的input 不仅仅是文件 还可以是实时流 目前我用过的应该支持一下几种流格式 rtsp udp http 其他的没用到 查查文档应该能够找到它还能支持什么 一般用法 ffmpeg i

随机推荐

  • pytorch的cuda环境搭建(GPU版本安装)

    第一步 安装cuda 安装cuda 这里还需要安装对应版本的Visual Studio 具体参考本博主的博客 https blog csdn net qq 36653505 article details 81368346 第二步 安装cu
  • UniLM详解,统一语言模型(Unified Language Model,UniLM)

    先导知识 Transformer BERT GPT MASS 前言 预训练模型按照训练方式或者网络结构可以分成三类 一是以BERT 2 为代表的自编码 Auto Encoding 语言模型 它使用MLM做预训练任务 自编码预训模型往往更擅长
  • layui后台模板_ThinkPHP6开发博客实战入门(五),创建admin后台模板

    我们在app目录创建admin controller Index php文件 同时创建index和home操作方法 tp6的模板文件需要使用thinkfacadeView来操作视图 用return View fetch 来输出模板 默认in
  • 学习“基于深度学习的故障诊断”开源

    博主秋雨行舟在csdn b站都有开源 这里只做自己的学习记录用 基于深度学习的轴承故障诊断 原文在这里 软件的下载 环境的配置up主给的非常详细了 所以这里只记录一些代码注释 一 CNN 注意 作者的代码是有一点点问题的 更改三条代码就可以
  • git中的SSL certificate problem: unable to get local issuer certificate错误的解决办法

    git中的SSL certificate problem unable to get local issuer certificate错误的解决办法 我们在使用git初始化一个项目时 尤其是通过git submodule update in
  • 左程云老师算法课笔记(一)

    前言 仅记录学习笔记 如有错误欢迎指正 最近 有点忙 也有点懈怠 还是要加油加油 共勉 一 排序 异或 交换律 a b b a 结合律 a b c a c b 1 1 0 0 0 0 1 0 1 0 1 1 不进位相加 所以交换a b 的值
  • 恶意代码动态分析

    目录 实验一 问题 实验环境 实验思路 实验过程 实验二 问题 实验环境 实验思路 实验过程 实验三 问题 实验环境 思路 实验过程 实验四 问题 实验环境 实验思路 实验过程 实验一 使用动态分析技术来分析lab03 01 exe文件中发
  • HTML5超科幻个人主页

    在线演示地址 http me cpwl site 备用地址 http cpwl sinaapp com 部分截图 视频演示 http www iqiyi com w 19rtceudmh html 视频下载 http pan baidu c
  • 什么是向上管理(向上管理是HRBP的必备技能)

    向上管理是指管理者与上级领导进行有效沟通 推动管理者和团队实现目标 确保公司发展和组织运作的稳定性 作为HRBP 向上管理是必备的技能 它可以帮助HRBP更好地理解组织战略和上级领导的期望 有效地协调和解决问题 从而实现自己的职责和使命 本
  • URL中划线和下划线的区别

    url中的中划线dash和下划线underscore的区别 百度对URL中下划线和连字符是基本上同样处理的 而谷歌对下划线和连字符处理的区别比较大 综合来说 URL使用连字符对于提升关键词排名是有意义的 谷歌官方对于使用连字符还是下划线问题
  • 添加包和删除包&俯视角渲染&改变中心锚点的位置

    文章目录 如何添加包和删除包 如何俯视角渲染 如何改变中心锚点的位置 如何添加包和删除包 如何俯视角渲染 将z轴遮挡变为y轴遮挡 y轴为1表示以y轴为对比尺度 每个物体中心点y轴大的将会被中心点y轴小的物体遮掩 如何改变中心锚点的位置 把图
  • [附源码]java毕业设计网络身份认证技术及方法

    项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEclispe Sts都支持 项目技术 SSM mybatis Ma
  • 2022华中杯B

    B题总体来说比较简单 另外今年的美赛和上一年的电工杯分别有一道关于股市这方面的题 根据其主体部分可以将其归为预测这个大类上面 本题只要选择合适的模型 总体来说还是比较简单的 但对本题进行预测时 肯定不能直接使用给出的数据 需要对数据进行预处
  • Fiddler使用手册之SSL证书的问题

    首先下载Fiddler 官网5 0版本是免费的 安装设置 Tools options HTTPS Connections 按下图设置勾选 确保一致 点击确定后 关闭重新打开软件 这时候就已经开始抓电脑的包了 如果想抓手机的包需要让手机如下设
  • Linux常用命令合集(一)

    cd 切换目录 gt cd 切换到父级目录 gt cd tmp 切换到 tmp目录 gt cd 切换到当前用户的家目录 ls命令 查看文件与目录的命令 list 的缩写 gt ls l 列出长数据串 包含文件的属性与权限数据等 gt ls
  • C++中模板类的声明和实现分离问题

    有两种方法 第1种 使用 tpp 文件实现类模板的接口与实现的文件分离 在 h文件中放接口 在 tpp文件中放实现 但这种方法得在 h文件中 类的定义下面通过 include包含 tpp 文件 如下 testTemplateClass h文
  • 解决windows的挖矿木马

    问题描述 阿里云服务器报有采矿木马 登录服务器后发现CPU满负荷 无法安装阿里云的安全客户端 安装火绒杀毒软件后 杀毒软件也无法运行 提示文件无法找到 通过任务管理器关闭可疑的svchost exe后 马上就创建了一个新的svchost e
  • ssh命令行远程连接服务器跑程序新手教程

    1 ssh远程连接服务器 2 服务器端配置conda环境 3 上传程序到服务器 4 跑程序 5 修改程序 1 用ssh远程连接服务器 打开命令行 cmd ssh 服务器名称 服务器网址 然后按Enter键 输入密码 注意输入的密码不会在屏幕
  • nginx rewrite二级目录跳转带斜线

    内网地址为http IP1 80 wbalone 外网地址为http IP2 88 wbalone 此时 内外网端口不一致 如果访问外网地址时 输入的为http IP2 88 wbalone 则会跳转为http IP2 80 wbalone
  • 算法高级(28)-递归、分治、动态规划、贪心、回溯、分支限界几大相似算法比较

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