算法简述-串和串的匹配、排序、深度/广度优先搜索、动态规划、分治、贪心、回溯、分支限界

news2024/11/25 23:48:25

目录

算法简述

基本

典型算法列举

串和串的匹配

排序

深度/广度优先搜索

动态规划

分治

贪心

回溯

分支限界


算法简述

基本

咳咳嗯…算法嘛,咱也不是 CS 科班学生,咱就说,算法是对已经建模后的问题的解决的具体途径和方法,是学习 对于编程来讲的 一些 已经成熟/成型的 完成问题的计算的 套路和思想。

典型算法列举

串和串的匹配

基本

串(string)是由零个或多个字符组成的有限序列,又名叫字符串。一个串(流口水)中任意个连续的字符组成的子序列为该串的子串。串的编码方式即字符编码如 ASCII编码、Unicode编码等。

串中的元素都是字符,串的操作主要与 字符串的操作 而非 单个元素 有关,其多为 查找子串位置、得到指定位置子串、替换子串等操作,如下:

assets/串的操作.jpg

显而易见,标准库如 string.h 给出了串的基本操作 API,关于 C 标准库的详细使用可参考 “C & MCU编写规范和其他” 一文的 “7 C 标准库的使用” 一节。

串的匹配算法(也可叫串的模式匹配)

串匹配,比如:要从主串 S = “BBC ABCDAB ABCDADCDABDE” 中 找到 与 模式串 P = “ABCDABD” 相同的 子串 的位置。

串的模式匹配算法-BF算法(或叫暴力算法)

主串 S 从 i = 0 位置开始与 模式串 P 从 j = 0 位置开始一个字符一个字符的匹配是否一样,如果相同则 i 和 j 均加一然后再判断是否匹配,若不同则 i 回到 这次匹配开始的位置同时 j 回到首位,继续挨个匹配。一图说明:

引自:21 串模式匹配算法(BF算法) - 知乎 (zhihu.com)

assets/BF算法(或叫暴力算法).jpg

串的快速模式匹配算法-KMP算法

主要思想就是相比于 BF 算法,为了加速匹配,找一些规律,当匹配失效的时候 j 不用每次回到 P 的 开头位置,而是根据(注意,不了解的推荐先看下面给出的教程文章,这里是明白后的总结) 模式串的 各个字串的 各个前缀、后缀子串的 最大公共元素长度 来构造 next 数组,j 每次移动的位数根据 next 来调整。

  • 从头到尾彻底理解KMP - Chris_z - 博客园 (cnblogs.com)。Coding-Zuo (cnblogs.com)。该文讲的很清楚。
  • 「天勤公开课」KMP算法易懂版_ 哔哩哔哩 _bilibili。

排序

  • 十大经典排序算法(动图演示) - 一像素 - 博客园 (cnblogs.com)。
  • 算法大总结之—-10大经典排序算法(从小到大排列)_ Frank的博客-CSDN博客 _从小到大排序算法。

深度/广度优先搜索

图的遍历 通常采用 深优先搜索(DFS) 与 广度优先搜索(BFS) 方式进行。“如果把树看做一种特殊的图的话,DFS 就是前序遍历”。

  • 搜索思想——DFS & BFS(基础基础篇) - 知乎 (zhihu.com)。
  • 搜索思想——DFS & BFS(基础篇) - 知乎 (zhihu.com)。
  • 图的深度优先搜索(DFS)与广度优先搜索(BFS)_青萍之末的博客-CSDN博客。
  • 深度优先遍历与连通分量 | 菜鸟教程 (runoob.com),广度优先遍历与最短路径 | 菜鸟教程 (runoob.com)。

动态规划

  • 什么是动态规划(Dynamic Programming)?动态规划的意义是什么? - 知乎 (zhihu.com)。
  • DP-动态规划问题心得 - 知乎 (zhihu.com)。
  • 一只脚迈进DP的海洋 - 知乎 (zhihu.com)。
  • 五大常用算法——动态规划算法详解及经典例题_ 别再想更好的办法的博客-CSDN博客 _动态规划算法经典例题。

有的人理解为用“动态规划”的思想(写出优化目标和状态转移方程(或者叫递归关系式))去理解和建模问题使得找出问题的优化解可以不用遍历所有可能解(剪枝,或去除不可能为最优解的计算从而节省时间,或者去除重叠的子问题);常用一种实现方法为用缓存存储数据来减少重复计算(把穷举的计算过程展开为一棵树,然后找出其中重复计算的部分,用缓存来保留一份之前要重复计算的结果,来减少重复计算),还有其它许多技巧和方法。

分治

引自:五大常用算法——分治算法详解及经典例题_ 别再想更好的办法的博客-CSDN博客 _分治算法经典例题。

分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。

如果原问题可分割成k个子问题,1<k≤n,且这些子问题都可解并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。

可使用分治法求解的一些经典问题:

  • (1)二分搜索
  • (2)大整数乘法
  • (3)Strassen矩阵乘法
  • (4)棋盘覆盖
  • (5)合并排序
  • (6)快速排序
  • (7)线性时间选择
  • (8)最接近点对问题
  • (9)循环赛日程表
  • (10)汉诺塔

分治算法的一个核心在于子问题的规模大小是否接近,如果接近则算法效率较高。

分治算法和动态规划都是解决子问题,然后对解进行合并;但是分治算法是寻找远小于原问题的子问题(因为对于计算机来说计算小数据的问题还是很快的),同时分治算法的效率并不一定好,而动态规划的效率取决于子问题的个数的多少,子问题的个数远小于子问题的总数的情况下(也就是重复子问题多),算法才会很高效。

  • 五大常用算法——分治算法详解及经典例题_ 别再想更好的办法的博客-CSDN博客 _分治算法经典例题。

贪心

引自:五大常用算法——贪心算法详解及经典例子_ 别再想更好的办法的博客-CSDN博客 _贪心算法。

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。

基本思路

  1. 建立数学模型来描述问题。

  2. 把求解的问题分成若干个子问题。

  3. 对每一子问题求解,得到子问题的局部最优解。

  4. 把子问题的解局部最优解合成原来解问题的一个解。

实现该算法的过程

  1. 从问题的某一初始解出发;

  2. while 能朝给定总目标前进一步 do;

  3. 求出可行解的一个解元素;

  4. 由所有解元素组合成问题的一个可行解。

该算法存在问题

  1. 不能保证求得的最后解是最佳的;
  2. 不能用来求最大或最小解问题;
  3. 只能求满足某些约束条件的可行解的范围。

引自:什么是动态规划(Dynamic Programming)?动态规划的意义是什么? - 知乎 (zhihu.com) 来说明贪心算法的缺陷: 

先来看看生活中经常遇到的事吧——假设您是个土豪,身上带了足够的1、5、10、20、50、100元面值的钞票。现在您的目标是凑出某个金额w,需要用到尽量少的钞票。

依据生活经验,我们显然可以采取这样的策略:能用100的就尽量用100的,否则尽量用50的……依次类推。在这种策略下,666=6×100+1×50+1×10+1×5+1×1,共使用了10张钞票。

这种策略称为“贪心”:假设我们面对的局面是“需要凑出w”,贪心策略会尽快让“还需要凑出的部分”变得更小。能让w少100就尽量让它少100,这样我们接下来面对的局面就是凑出w-100。长期的生活经验表明,贪心策略是正确的。

但是,如果我们换一组钞票的面值,贪心策略就也许不成立了。如果一个奇葩国家的钞票面额分别是1、5、11,那么我们在凑出15的时候,贪心策略会出错:

15=1×11+4×1 (贪心策略使用了5张钞票)

15=3×5 (正确的策略,只用3张钞票)

为什么会这样呢?贪心策略错在了哪里?

鼠目寸光。

刚刚已经说过,贪心策略的纲领是:“尽量使接下来面对的w更小”。这样,贪心策略在w=15的局面时,会优先使用11来把w降到4;但是在这个问题中,凑出4的代价是很高的,必须使用4×1。如果使用了5,w会降为10,虽然没有4那么小,但是凑出10只需要两张5元。

在这里我们发现,贪心是一种只考虑眼前情况的策略。

  • 五大常用算法——贪心算法详解及经典例子_ 别再想更好的办法的博客-CSDN博客 _贪心算法。

回溯

引自:leetcode回溯算法(backtracking) 总结_wonner_的博客-CSDN博客 _leetcode 回溯。

回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。

  • 回溯算法详解及Leetcode经典例题解答_ 芒果就是没有盲的博客-CSDN博客 _回溯算法leetcode。
  • leetcode回溯算法(backtracking)总结_ wonner_的博客-CSDN博客 _leetcode 回溯。
  • 五大常用算法——回溯算法详解及经典例题_ 别再想更好的办法的博客-CSDN博客 _回溯算法经典例题。

分支限界

引自:五大常用算法——分支限界算法详解及经典例题_ 别再想更好的办法的博客-CSDN博客 _分支定界法例题详解。

对比回溯法

  • 回溯法的求解目标是找出解空间中满足约束条件的所有解,想必之下,分支限界法的求解目标则是找出满足约束条件的一个解,或是满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。
  • 另外还有一个非常大的不同点就是,回溯法以深度优先的方式搜索解空间,而分支界限法则以广度优先的方式或以最小耗费优先的方式搜索解空间。
  • 五大常用算法——分支限界算法详解及经典例题_ 别再想更好的办法的博客-CSDN博客 _分支定界法例题详解。

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

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

相关文章

A-小美种果树(二分)-- 牛客周赛 Round 12

输入 1 2 10 输出 6 解析&#xff1a; 二分&#xff0c;注意两端端点L、R的取值&#xff01;&#xff01;&#xff01; #include<bits/stdc.h> using namespace std; #define int long long int x,y,z; signed main(){scanf("%lld%lld%lld",&x,&y,…

链表反转-两两交换链表中的节点

LeetCode24.给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。必须在不修改节点内部的值的情况下完成本题(即&#xff0c;只能进行节点交换) 如果原始顺序是 dummyHead -> node1 -> node2&#xff0c;交换后面两个节点关系要变成 …

【深度学习实验】前馈神经网络(一):使用PyTorch构建神经网络的基本步骤

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入库 1. 定义x,w,b 2. 计算净活性值z 3. 实例化线性层并进行前向传播 4. 打印结果 5. 代码整合 一、实验介绍 本实验使用了PyTorch库来构建和操作神经网络模型&#xff0c;主要是关…

短视频账号矩阵运营

短视频伴随着用户数量的不断增加&#xff0c;越来越多的企业开始将短视频纳入其品牌推广和营销战略中。然而&#xff0c;短视频矩阵账号运营并非易事&#xff0c;需要一定的策略和技巧。本文将探讨短视频矩阵账号运营的方法和常见问题&#xff0c;并提供解决方案。 一、策略和…

加强半圆头方颈螺栓的型式尺寸

声明 本文是学习github5.com 网站的报告而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了加强半圆头方颈螺栓的型式尺寸、技术条件和标记。 本文件适用于螺纹规格为 M6&#xff5e;M20, 产品等级为 B 级(A 型)和 C 级(B 型)的加强…

【Vue】修饰符表单提交方式自定义组件

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Vue快速入门》。&#x1f3af;&#x1f3af; &…

[MySQL]基本介绍及安装使用详细讲解

简单介绍 数据库 (DataBase)&#xff0c;简称DB 顾名思义&#xff0c;即存储数据的仓库&#xff0c;数据是有组织的进行存储 数据库管理系统(DataBase Management System)&#xff0c;简称DBMS 管理数据库的大型软件 SQL(Structured Query Language)&#xff0c;简称SQL&…

(附12306抢票脚本)国庆长假马上来啦,Python分析【去哪儿旅游攻略】数据,制作可视化图表

目录 前言环境使用模块使用数据来源分析 代码实现导入模块请求数据解析保存 数据可视化导入模块、数据年份分布情况月份分布情况出行时间情况费用分布情况人员分布情况 前言 2023年的中秋节和国庆节即将来临&#xff0c;好消息是&#xff0c;它们将连休8天&#xff01;这个长假…

java学习--day10 (继承)

文章目录 day9作业今天的内容1.继承1.1.生活中的继承1.2.Java中继承1.3关于父类子类的内存分析1.4重写【重点】1.5重载【overload】 day9作业 1.构造代码块和构造方法的区别 &#xff5b;代码块 &#xff5d; public 类名 () {} 都是实例化一个对象的时候执行的 只不过构造代码…

VSCode『SSH』连接服务器『GUI界面』传输

前言 最近需要使用实验室的服务器训练带有 GUI 画面的 AI 算法模型&#xff08;pygame&#xff09;&#xff0c;但是我是使用 SSH 连接的&#xff0c;不能很好的显示模型训练的效果画面&#xff0c;所以下面将会讲解如何实现 SSH 连接传输 Linux GUI 画面的 注&#xff1a;我们…

面试官:什么是虚拟DOM?如何实现一个虚拟DOM?说说你的思路

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、什么是虚拟DOM 二、为什么需要虚拟DOM 三、如何实现虚拟DOM 小结 一、什么是虚拟DOM 虚拟 DOM &#xff08…

统计物理学复习----粒子的最概然分布

热力学中&#xff0c;每个粒子都是相同的统计物理学中&#xff0c;每个粒子是有差别的&#xff0c;对差别的不同处理方式决定了不同的统计理论理论力学中&#xff0c;质点可以用r个广义坐标与r个广义动量描述&#xff0c;这2r个变量的基构成了一个参数空间 经典统计理论 自由粒…

WorkPlus打造企业移动门户,实现高效协作与便捷访问

在移动互联网的时代&#xff0c;企业对于高效的协作和便捷的访问需求日益增长。WorkPlus作为领先品牌&#xff0c;致力于打造企业移动门户&#xff0c;帮助企业实现高效协作与便捷访问。本文将重点介绍WorkPlus如何通过创新的解决方案&#xff0c;为企业提供定制化的企业移动门…

netty server端启动源码阅读分析

服务端的启动通过ServerBootstrap类来完成&#xff0c;ServerBootstrap内有以下主要属性 ServerBootstrap extends AbstractBootstrap {//处理channel连接事件的线程组EventLoopGroup group;//处理channel其它事件的线程组EventLoopGroup childGroup;//创建channel的工厂类Cha…

基于PyTorch搭建Mask-RCNN实现实例分割

基于PyTorch搭建Mask-RCNN实现实例分割 在这篇文章中&#xff0c;我们将讨论 Mask RCNN Pytorch 背后的理论以及如何在 PyTorch 中使用预训练的 Mask R-CNN 模型。 1. 语义分割、目标检测和实例分割 在之前的博客文章里介绍了语义分割和目标检测&#xff08;如果感兴趣可以参…

【golang】调度系列之P

调度系列 调度系列之goroutine 调度系列之m 在前面两篇中&#xff0c;分别介绍了G和M&#xff0c;当然介绍的不够全面&#xff08;在写后面的文章时我也在不断地完善前面的文章&#xff0c;后面可能也会有更加汇总的文章来统筹介绍GMP&#xff09;。但是&#xff0c;抛开技术细…

华为云云耀云服务器L实例使用教学 | 访问控制-安全组配置规则 实例教学

文章目录 访问控制-安全组什么叫安全组安全组配置默认安全组配置安全组配置实例安全组创建安全组模板配置安全组模板&#xff1a;通用Web服务器 配置安全组规则安全组配置规则功能介绍修改允许特定IP地址访问Web 80端口服务建立仅允许访问特定目的地址的安全规则配置网络ACL对实…

开源数字孪生基础设施

开源数字孪生基础设施 开源数字基础设施 开源数字基础设施 开源软件是基础设施发展的一种模式&#xff0c;这是在2007年美国科学基金会发布的《认识基础设施&#xff1a;动力机制、冲突和设计》中得出的结论。在这份55页的报告中三次集中谈到了开源软件&#xff08;Open Sourc…

1999-2018年地级市经济增长数据

1999-2018年地级市经济增长数据 1、时间&#xff1a;1999-2018年 2、指标&#xff1a; 行政区划代码、城市、年份、地区生产总值_当年价格_全市_万元、地区生产总值_当年价格_市辖区_万元、人均地区生产总值_全市_元、人均地区生产总值_市辖区_元、地区生产总值增长率_全市_…

MySQL使用C语言链接

MySQL使用C语言链接 MySQL connect接口介绍mysql_initmysql_real_connectmysql_querymysql_store_result\mysql_use_result()mysql_num_rowsmysql_num_fieldsmysql_fetch_fieldsmysql_fetch_rowmysql_close MySQL connect 使用C语言来连接数据库&#xff0c;本质上就是利用一些…