【算法】不懂数学原理也能看得懂的KMP算法

news2024/11/28 12:55:03

一.KMP算法的作用

        举个例子,excel表格大家都用过吧,在表格内按下“Ctrl+F”可以弹出“查找和替换”功能,输入我们想要查找的关键字,系统就会帮我们定位到具体的位置,没有找到就上报具体的错误信息,KMP算法的作用就和excel表格的“查找”功能一样,帮你从一堆字符串中找到你想要的字符。

        当然你也可以参考力扣的这题:

二.KM怕算法需要准备什么?

  • 文本:也就是你准备在里面找你想要的字符串的文本,在C/C++中一般用string或者char数组来保存,所以其他文章一般称呼为“文本串”
  • 关键字:也就是你想在文本里面找到的那串字符,在C/C++中一般用string或者char数组来保存,所以其他文章一般称呼为“模式串”
  • Next函数:该函数是算法的核心部分,函数根据模式串的内容计算出一堆数据,生成一个数组,叫做next数组,进行文本匹配时主要就是用到这个数组里面的数据来确定移动的位置。

三.KMP算法的匹配过程

        我们按照以下的例子进行说明:

        我们要在文本串中找到模式串所在的位置,需要用到经过next函数计算出来的next数组:

        至于这个数组是怎么算出来的先暂时别管,下面会有详细的说明,我们先来看一下这个数组里面保存的数据是什么用的:

         可以看见,next数组其实存储的是模式串数组的下标,用于把移动到特定位置的。我们开始进行文本串匹配,首先逐个逐个进行对比:

         第一个字符串匹配成功,我们再来匹配下一个字符串:

         当出现匹配错误的时候,我们之前计算出来的next数组就可以派上用场了,首先第一步,找到模式串对应位置下next数组相同位置里所存储的数值是多少,在本例子中,是模式串第1个位置不匹配,所以就找next数组中下标为1中存储的值:

         按照前面可以知道,next数组存储的是模式串数组的下标,当前next[1]存储的值为0,所以将模式串[0]移动到当前模式串所指的位置,其他数组也跟着一起整体移动:

         整体移动完成之后,继续对比当前两个位置的字符串是否匹配,不匹配就进行相应的操作:

         发现不匹配之后,查找next[0],发现值为-1,但是模式串数组下标最低只有0,哪来的-1呀?其实0的前面就是-1,你也可以理解为指向空NULL:

         移动完成之后再次进行对比,因为模式串当前所指的值为空,没有东西可以对比了,所以俩箭头集体往右移动一位,继续进行对比,其余的操作也就是重复上面这些操作而已:

         一直移动到匹配不上的位置,启动对应位置的next数组,找到对应的位置:

         紧接着移动到对应的位置:

         然后再进行两个字符串对比,相同就下一个,不同就重复执行上面的步骤,直到匹配到最后一个字符:

         至此,KMP算法就完成它的使命,返回对应的模式串在文本串中的位置即可。

四.next数组的计算

        KMP算法的核心是next数组里面所保存的数值,其代表了当模式串与文本串不匹配时模式串需要移动的位置,该数值也有一个名称,叫做最大公共前后缀长度。 我们以就拿以下的模式串来说明next数组是怎么被计算出来的:

         在正式开始计算之前,先来补充一些知识:

  1. 前缀:除了最后一位,其他都是前缀

        2.后缀:除了第一位,其他都是后缀

        3.前后缀共同的部分:就是前后缀相同的部分

        4.最大公共前后缀长度:就是前后缀共同部分有多长

        知识补充完毕,又来以上的知识,我们就可以开始计算了,我们还是拿上面的模式串作为例子:

        第一步,将模式串的所有排列组合都列出来

第二步:计算每个组合的公共前后缀

         第三步:算出各个前后缀公共长度

        

        第四步:将计算出来的数值存入next数组中

         有些文章到此就结束了,将以上作为next数组的值,这样的话移动时是按照箭头的前一位的数值进行移动,比如当前箭头指向next[4],那么移动的时候是按照next[3]=1这个位置里面的数值进行移动的,所以也有些文章将next数组整体往右移动一位,再在第一位不上数值-1,这样移动时就直接看当前箭头指向的数值即可:

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

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

相关文章

解释性人工智能(XAI)

引言 解释性人工智能(XAI)是指一类旨在使人能够理解和解释机器学习模型的方法和技术。XAI的目标是提高AI系统的透明度和可理解性,让人们能够理解机器学习模型的决策过程、推理方式和结果。这对于社会应用和用户信任非常重要,因为A…

Axure 怎么用?一篇文章告诉你

Axure RP 9 该软件是一个非常实用的原型设计工具,了解 Axure、学会使用 Axure,作为产品经理,UI、界面规划等岗位的基本技能。特别是对于产品经理来说,画出优秀的原型可以更好地表达产品需求,提高沟通效率。如何快速入门…

Leetcode第382场周赛

Leetcode第382场周赛 本人水平有限,只做前三道。 一、按键变更的次数 给你一个下标从 0 开始的字符串 s ,该字符串由用户输入。按键变更的定义是:使用与上次使用的按键不同的键。例如 s “ab” 表示按键变更一次,而 s “bBBb”…

网络工程师学习笔记——HDLCPPP

继续学习计算机网络技术——HDLC&PPP 一、HDLC HDLC( High-Level Data Link Control ):高级数据链路控制 HDLC是一种面向比特的链路层协议。 HDLC的作用:接口地址借用,节省IP地址,使地址更加稳定 …

Javaweb实现的学生宿舍管理系统

Javaweb实现的学生宿舍管理系统 文章目录 Javaweb实现的学生宿舍管理系统系统介绍技术选型成果展示源码获取账号地址及其他说明 系统介绍 Javaweb实现的学生宿舍管理系统采用jspservlet技术实现了如下功能模块,分别是宿舍管理员管理、学生管理、宿舍楼管理、缺勤记…

SwiftUI 动画入门之一:路径动画(Path Animations)

概览 在 SwiftUI 的开发中,我们往往需要使用千姿百态的动画把我们的界面元素妆点的更加鲜活灵动。 如上图所示,我们使用路径动画使折线图更加生动了!这是怎么做到的呢? 在本篇博文中,您将学到以下内容: 概览1. 路径与形状(Path and Shape)2. 路径动画的原理3. 让路径…

LeetCode刷题:使用栈解决150. 逆波兰表达式求值

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意: 有效的算符为 、-、* 和 / 。每个操作数(运算对象)都可以是一个整数或者另一个表达式。两个…

程序的内存模型

师从黑马程序员 内存分区模型 内存大方向划分为4个区域 1、代码区:存放函数体的二进制代码,由操作系统管理的 2、全局区:存放全局变量环和静态变量以及常量 3、栈区:由编译器自动分配释放,存放函数的参数值&#…

【笔试常见易错选择题01】else、表达式、二维数组、%m.ns、%m.nf、常量指针和指针常量、宏定义、传参、数组越界、位段

1. 下列main()函数执行后的结果为&#xff08;&#xff09; int func(){ int i, j, k 0; for(i 0, j -1;j 0;i, j){ k; } return k; } int main(){cout << (func());return 0; }A. -1 B. 0 C. 1 D. 2 判断为赋值语句&#xff0c;j等于0 0为假不进循环 选B. 2. 下面程…

市场复盘总结 20240201

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 昨日主题投资 连板进级率 6/27 22.2% 二进…

LeetCode刷题:100.相同的树

题目&#xff1a; 解题思路&#xff1a;1.首先要判断根节点的情况&#xff0c;&#xff08;1&#xff09;首先是p为空&#xff0c;q不为空&#xff0c;或者p不为空&#xff0c;q为空则要返回false&#xff08;2&#xff09;p和q都为空则返回true&#xff0c;2.然后判断根节点的…

五、CPU针脚

电脑的两大厂商是Intel、AMD&#xff0c;区分他们两家的CPU&#xff0c;最简单的就是看CPU的针脚。 从形状上也大致能够看出来&#xff0c;AMD的logo占满了CPU的框框&#xff0c;Intel的是没有占满的。 CPU针脚针脚是什么呢&#xff1f; 如下&#xff0c;这一个个和小针一样的东…

【数据结构】 归并排序超详解

1.基本思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。 将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff0c;即先使每个子序列有序…

【操作系统·考研】文件系统

1.概述 文件系统(File System)提供高效和便捷的磁盘访问&#xff0c;以便允许存储、定位、提取数据。 严格来说&#xff0c;VFS并不是一种实际的FS&#xff0c;它只存在于内存中&#xff0c;不存在与任何外存空间中。 VFS在系统启动时建立&#xff0c;在系统关闭时消亡。 2.结…

Mask-Free Video Instance Segmentation

论文地址&#xff1a;[2303.15904] 无掩码视频实例分割 (arxiv.org) 论文代码&#xff1a;https://github.com/SysCV/MaskFreeVis 目录 一、摘要 二、介绍 三、方法 3.1 时间掩码一致性 3.2 时间KNN-patch Loss 3.3 训练MaskFreeVIS 四. 数据集 五.消融实验 六. 结果 七…

统计图表在线配置服务-百度 SugarBI的学习笔记

最近&#xff0c;有个产品要支持统计图表在线可配置&#xff0c;这样&#xff0c;当用户有新增统计指标的需求时&#xff0c;运维人员通过界面化配置&#xff0c;就可以增加统计指标了&#xff0c;不用开发写代码&#xff0c;画页面了。 上网查了下相关的组件&#xff0c;感觉…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextClock组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之TextClock组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、TextClock组件 TextClock组件通过文本将当前系统时间显示在设备上。支持不同…

推荐几款便宜雾锁王国(Enshrouded)游戏联机服务器

雾锁王国(Enshrouded)是一款多人在线游戏&#xff0c;为了获得更好的游戏体验&#xff0c;许多玩家会选择自行搭建游戏联机服务器&#xff0c;但是如何挑选价格合适、性能稳定的服务器成为一个难题&#xff0c;本文将为大家推荐几款便宜雾锁王国(Enshrouded)游戏联机服务器。 一…

【大厂AI课学习笔记】1.3 人工智能产业发展(4)——泛在的人工智能

人工智能走向泛在。 泛在&#xff0c;就是广泛存在。&#xff08;下图来自腾讯AI课。&#xff09; 没办法&#xff0c;被百度抛弃了&#xff0c;想学习&#xff0c;课程打不开&#xff0c;只好投想腾讯的怀抱。 之前考过腾讯云的认证&#xff0c;课程做的还是条理很清晰。 主…

【gRPC】Python建立服务端含接口映射

续之前《【gRPC】protoc文件转py文件》 基于之前的目录结构&#xff0c;微调下&#xff1a; |- example # 新增|- service|- api|- User.py|- configs.py |- example_proto|- core|- user.proto |- proto_output|- core # 续上文转化后的结果|- user_pb2.py|- user_pb2.pyi…