算法基本思想(结尾附上记忆口诀)

算法基本思想(结尾附上记忆口诀)

  • 贪心
  • 分治
  • 枚举
  • 动态
  • 回溯
  • 递归(兄弟思想-递推)

这篇文章说的这些思想网上一大堆,可以不看。直接关注结尾自创口诀,希望给你提供一点帮助。

递归

概述

在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法

特点

  1. 边界条件
  2. 规模递减

能解决的问题

  1. 数据的定义是按递归定义的。如Fibonacci函数。
  2. 问题解法按递归算法实现。如Hanoi问题。
  3. 数据的结构形式是按递归定义的。如二叉树、广义表等

递归解题的基本套路

  1. 明确这个函数的功能
  2. 递推公式 自上而下的分析
  3. 补充到步骤1中定义的函数中
  4. 时间复杂度的计算

参考文献

一文看懂什么递归(算法小结)
https://zhuanlan.zhihu.com/p/94748605
https://juejin.im/post/6844904008595816462

分治

概述

在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式。字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并

步骤

分解(将原问题分解成一系列子问题)
求解(递归的求解各子问题,若子问题足够小,则直接求解)
合并(将子问题的解合并成原问题的解)

适用情况

如排序算法(归并排序、快速排序)、傅立叶变换(快速傅立叶变换)

贪心

概述

又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。[1]比如在旅行推销员问题中,如果旅行员每次都选择最近的城市,那这就是一种贪心算法。
贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。
贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。

贪心算法的基本思路

  1. 根据问题来建立数学模型,一般面试题会定义一个简单模型;
  2. 把待求解问题划分成若干个子问题,对每个子问题进行求解,得到子问题的局部最优解;
  3. 把子问题的局部最优解进行合并,得到最后基于局部最优解的一个解,即原问题的答案。

具有以下性质可以使用贪心算法
最优子结构
贪心选择性质

适用情况

贪心法可以解决一些最优化问题,如:求图中的最小生成树、求哈夫曼编码……对于其他问题,贪心法一般不能得到我们所要求的答案。一旦一个问题可以通过贪心法来解决,那么贪心法一般是解决这个问题的最好办法。由于贪心法的高效性以及其所求得的答案比较接近最优结果,贪心法也可以用作辅助算法或者直接解决一些要求结果不特别精确的问题。在不同情况,选择最优的解,可能会导致辛普森悖论(Simpson’s Paradox),不一定出现最优的解。

贪心算法在Data Science领域都被资泛应用,特别是金融工程。其中一个贪心算法例子就是Ensemble method

实例

最小生成树、求哈夫曼编码、活动选择问题

回溯

概述

回溯法:有"通用的解题法"之称,可以系统地搜索一个问题的所有解或任一解。在包含问题的所有解的解空间树时,按照深度优先的策略,从根节点触发搜索解空间树。搜索至任一结点时,总是先判断该结点是否肯定不包含问题的解,如果不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先的策略进行搜索。

可以理解为先进行深度优先搜索,一直向下探测,当此路不通时,返回上一层探索另外的分支,重复此步骤,这就是回溯,意为先一直探测,当不成功时再返回上一层。

适用情况

实例

八皇后问题、迷宫类问题

枚举

概述

枚举算法的思想是:将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,保留合适的,丢弃不合适的。

解题思路

确定枚举对象、枚举范围和判定条件。
逐一列举可能的解,验证每个解是否是问题的解。

动态

概述

动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。
动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。

适用情况

  1. 最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。
  2. 无后效性。即子问题的解一旦确定,就不再改变,不受在这之后、包含它的更大的问题的求解决策影响。
  3. 子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率,降低了时间复杂度。

实例

0-1背包问题、最长公共子序列

记忆口诀

贪心小蔡,

分治湾湾,

人行

湾湾回归

(关注:鲁班曰)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/718908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息检索技术如何改变了人们获取知识的方式?

第一个肯定是改变了获取信息的渠道,以前需要到图书馆,书籍,报纸,杂志等方式获取信息,现在只需要通过上网搜索一下,就能获取到信息,并且比自己查的更广泛全面。当然,互联网业带来了海…

贪心刷题1-部分背包

题目来源:【深基12.例1】部分背包问题 - 洛谷 参考书目:《深入浅出程序设计竞赛(基础篇)》 解题思路:这道题是部分背包,如果金币不能完整的放入是可以分割的。题目中有若干堆金币,每堆金币有一…

mac电脑使用pyinstaller打包python脚本

pyinstaller -F template.py 出现报错"AssertionError: Executable contains code signature!" 移除签名 codesign --remove-signature /Users/f7692281/PycharmProjects/TPtestlist/transmit_v6.0.py 打包命令 pyinstaller --windowed transmit_v6.0.py pyinst…

【js】事件循环之promise的async/await与setTimeout

什么是事件循环 事件循环又叫消息循环,是浏览器渲染主线程的工作方式。 浏览器开启一个永不停止的for循环,每次循环都会从消息队列中取任务,其他线程只需要在合适的时候将任务加入到消息队列的末尾。 过去分为宏任务和微任务,现…

wordpress模板官网

移民wordpress主题 移民代办wordpress主题,适合做海外移民咨询的代理公司搭建wordpress企业官方网站使用。 https://www.jianzhanpress.com/?p5130 夏令营wordpress主题 绿色夏令营wordpress主题,适合做夏令营或户外拓展的公司搭建wordpress官方网站…

D2587A高压大电流DC-DC——专为反激式、升压和正向转换器应用而设计的单片集成电路

1、概述 D2587A稳压器是专为反激式、升压和正向转换器应用而设计的单片集成电路。该器件提供四种不同的输出电压版本:3.3V、5V、12V 和可调节电压。这些稳压器需要的外部元器件很少,因此具有成本效益,并且易于使用。该电源开关是一款5A NPN器…

面试经典150题——最小栈

​Life is a journey, theres no right or wrong. 1. 题目描述 2. 题目分析与解析 2.1 思路一 看到题目的一瞬间,有没有注意到 常数时间内检索到最小元素的栈,那说明我们肯定需要把最小元素的下标存储起来,这样才能在常数时间内找到。 其…

网工学习 DHCP配置-接口模式

网工学习 DHCP配置-接口模式 学习DHCP总是看到,接口模式、全局模式、中继模式。理解起来也不困难,但是自己动手操作起来全是问号。跟着老师视频配置啥问题没有,自己组建网络环境配置就是不通,悲催。今天总结一下我学习接口模式的…

c++动态获取工作路径

最近在写项目时遇到一个问题 pclrobot:~/cProject/projects/myPro/mpRPC$ ls autobuild.sh bin build CMakeLists.txt conf example lib log README.md src test如上所示,我的项目根目录里有一个log文件夹和一个bin文件夹,我的需求是 bin目录…

揭秘8.4k星开发者的秘密武器:it-tools在线工具集,你不可不知!

在IT的世界里,为了更好地发挥自己的才能,必须善用优秀的工具。深入挖掘IT-Tools的神奇力量,让你的工作像魔法一般变得轻松高效!无论是自动化、监控还是问题解决,这些工具是我们事业成功的关键利器。选择合适的IT工具&a…

PlantUML - 时序图

时序图主要内容 下面是一个简单的时序图,我们可以很容易并且美观的表达我们的交互流程,只需要在箭头的两边指定一个名字,加上描述即可: startuml bkloanapply -> bkloanapprove : request bkloanapprove --> bkloanapply :…

C++ map用法

int main() {void *p;str *st;st (str*)malloc(sizeof(str));st->a 23;st->b 24;p st;//使用void指针需强制类型转换printf("%d\n%d\n",((str*)p)->a, ((str*)p)->b);free(st);map<char, int> mpci;mpci[m] 20;mpci.insert(pair<char, int…

#WEB前端(盒子模型)

1.实验&#xff1a;盒子 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; margin&#xff08;外边距&#xff09; border&#xff08;边框&#xff09; padding&#xff08;内边距&#xff09; 4.代码&#xff1a; <!DOCTYPE html> <html lang"en"> &…

【C++】类与对象(static、explicit、友元、隐式类型转换、内部类、匿名对象)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 再谈构造函数 初始化列表 隐式类型转换 explicit关键字 static成员 概念 计算程序中创建出了多少个类…

开源软件的商业模式探析:开放与盈利的平衡

写在开头 开源软件的概念和应用已经成为了现代科技领域中的一个重要组成部分。然而&#xff0c;虽然开源软件的价值和影响力得到了广泛认可&#xff0c;但如何在开放的环境中找到商业盈利的平衡却是一个颇具挑战性的问题。本文将深入探讨开源软件的商业模式&#xff0c;从基本…

力扣61:旋转链表

题目 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2输出&#xff1a;[4,5,1,2,3] 示例 2&#xff1a; 输入&#xff1a;head [0,1,2], k 4输出&#xff1a;…

卷积神经网络(CNN)原理与实现

卷积神经网络(CNN) 卷积神经网络原理卷积神经网络的数学推导卷积层反向传播算法数学推导卷积层实现代码 卷积神经网络(CNN) 卷积神经网络原理 卷积神经网络是一种用于图像、语音、自然语言等数据的深度学习模型&#xff0c;其核心思想是使用卷积操作提取输入数据的特征&…

4、通达OA代码审计

一、文件操作 1、文件上传配合文件包含审计 文件上传首先确定存在漏洞的文件。和文件上传相关的函数比如upload。在从上到下分析构造的条件1. 从 POST 请求中提取变量 P 的值。 2. 检查 P 是否已设置且不为空字符串。 3. 如果 P 已设置且非空&#xff0c;进入包含 "inc/…

JavaScript定义函数,创建函数实例时的内部原理

1、定义一个函数&#xff0c;JavaScript内部各做了哪些事情 定义一个函数时&#xff0c;JavaScript内部执行了以下步骤&#xff1a; 解析函数声明: 当你定义一个函数时&#xff0c;JavaScript的解析器会首先解析函数声明。这意味着它会检查函数声明的语法是否正确&#xff0c;…

[NSSCTF 2nd]MyJs

做一题ejs原型链污染 首先是登录界面 源码里面提示了源码的路由 js不熟先审计一下 const express require(express); #导入Express框架&#xff0c;用于构建Web应用程序的服务器和路由 const bodyParser require(body-parser); #导入body-parser中间件&#xff0c;用于解析…