数据结构面试常见问题之串的模式匹配(KMP算法)系列-大师改进

😀前言
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)

KMP算法的优势:

提高了匹配效率,时间复杂度为O(m+n),其中m为模式串长度,n为主串长度。
克服了朴素算法的回溯问题,减少了不必要的比较次数。

🏠个人主页:尘觉主页

文章目录

  • 数据结构面试常见问题之串的模式匹配(KMP算法)系列-大师改进
    • KMP-2. KMP 算法思路
      • 大师改进
      • 模式匹配类型
    • 😄总结
      • KMP算法思路
      • next数组的含义:
      • 大师改进:KMP算法
      • 改进后的next数组计算方法:
      • 总结

数据结构面试常见问题之串的模式匹配(KMP算法)系列-大师改进

KMP-2. KMP 算法思路

大师改进

方法3:KMP(Knuth、Morris、Pratt)算法

T = O(n+m)
简单的往前错一位的比较是完全没有必要的没有意义的,如下图
在这里插入图片描述
KMP算法的想法:
在这里插入图片描述
指针指向x不会回退(回溯)了,直接继续从x开始,继续往前比较
在这里插入图片描述
match的具体例子
在这里插入图片描述

下标从090个字符对应的是一个长度为1的子串,所以他不可能产生匹配,match就永远是-101:a跟b是配不上的,match也为-1
0-2:a和c配不上,ab和bc也配不上,所以match还是为-1
0-3:ab和ca是配不上的,abc跟bca也配不上,a对应的j为0,所以match也为0
//此时限制条件是最大i是小于j的,如果i=j的话那就相当于自己等于自己就没有意义了(p0...pj =p0...pj)
//所以我们考虑他的真子串
0-4:a跟b配不上,abc跟cab配不上,ab跟ab能配上,match值为1...

对于 pattern = abcabcacab,最后 3 个字符的 match 值是多少?-1, 0, 1
在早期的教科书上被叫做failure(失败的意思)

match值的含义:
例子:从0到6的子串,首跟尾能配上的小串,从0开始他的尾部下标为3,abca跟abca能配上。这就是match的含义

此代码块内容来自百度百科:
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)
KMP算法是三位学者在 Brute-Force算法的基础上同时提出的模式匹配的改进算法。Brute- Force算法在模式串中有多个字符和主串中的若干个连续字符比较都相等,但最后一个字符比较不相等时,主串的比较位置需要回退。KMP算法在上述情况下,主串位置不需要回退,从而可以大大提高效率

模式匹配类型

(1)精确匹配
如果在目标T中至少一处存在模式P,则称匹配成功,否则即使目标与模式只有一个字符不同也不能称为匹配成功,即匹配失败。给定一个字符或符号组成的字符串目标对象T和一个字符串模式P,模式匹配的目的是在目标T中搜索与模式P完全相同的子串,返回T和P匹配的第一个字符串的首字母位置 。
(2)近似匹配
如果模式P与目标T(或其子串)存在某种程度的相似,则认为匹配成功。常用的衡量字符串相似度的方法是根据一个串转换成另一个串所需的基本操作数目来确定。基本操作由字符串的插入、删除和替换来组成

第一篇–>数据结构面试常见问题之串的模式匹配(KMP算法)系列-简单解决方案

第二篇–>数据结构面试常见问题之串的模式匹配(KMP算法)系列-大师改进

第三篇–>数据结构面试常见问题之串的模式匹配(KMP算法)系列-大师改进实现以及原理

😄总结

KMP算法思路

KMP算法的核心思想是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数。具体来说,KMP算法通过一个next数组记录模式串的部分匹配信息,当主串与模式串匹配失败时,可以根据next数组直接跳转到模式串中下一个可能匹配的位置,避免回溯。

next数组的含义:

next[j]表示模式串P的前j个字符(不包括第j个字符)与P的后缀中最长的公共前缀的长度。

举个例子:

模式串P = “ABCDABD”

next[0] = -1 (空串与任何字符串都没有公共前缀)

next[1] = 0 (A与空串的公共前缀是空串)

next[2] = 0 (AB与A的公共前缀是A)

next[3] = 1 (ABC与AB的公共前缀是AB)

next[4] = 2 (ABCD与ABC的公共前缀是ABC)

next[5] = 3 (ABCDAB与ABCD的公共前缀是ABCD)

next[6] = 2 (ABCDABD与ABCDAB的公共前缀是ABCDAB)

大师改进:KMP算法

KMP算法的核心改进在于next数组的计算。朴素的next数组计算方法是逐个计算每个next[j]的值,时间复杂度为O(m^2)。KMP算法通过改进next数组的计算方法,将时间复杂度降低到O(m)。

改进后的next数组计算方法:

初始化next[0] = -1
从j = 1开始循环
若P[j] = P[next[j-1]],则next[j] = next[j-1] + 1
若P[j] != P[next[j-1]],则
若next[j-1] != -1,则令j = next[j-1],并重复步骤3
若next[j-1] == -1,则next[j] = 0

总结

KMP算法是字符串匹配领域的重要算法,具有广泛的应用价值。KMP算法的核心思想是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数,从而提高匹配效率。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

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

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

相关文章

IDEA, Pycharm, Goland控制台乱码

IDEA, Pycharm, Goland控制台乱码 问题描述: 控制台出现����等乱码 复现频率: 总是 解决方案: 以IDEA为例 添加 -Dfile.encodingUTF-8位置 idea64.exe.vmoptions 在安装idea的bin目录idea.vmoptions idea客户端 示意图

解决长尾问题,BEV-CLIP:自动驾驶中复杂场景的多模态BEV检索方法

解决长尾问题,BEV-CLIP:自动驾驶中复杂场景的多模态BEV检索方法 理想汽车的工作,原文,BEV-CLIP: Multi-modal BEV Retrieval Methodology for Complex Scene in Autonomous Driving 链接:https://arxiv.org/pdf/2401.…

YoloV8改进策略:Block改进|PKINet

摘要 PKINet是面向遥感旋转框的主干,网络包含了CAA、PKI等模块,给我们改进卷积结构的模型带来了很多启发。本文使用PKINet的Block替换YoloV8的Block,实现涨点。改进方法是我独创首发,给写论文没有思路的同学提供改进思路,欢迎大家订阅! 论文:《Poly Kernel Inception …

Pycharm配置conda

1.下载conda Free Download | Anaconda . 2.配置环境 1.conda自带base环境 2.创建环境 3. Pycharm创建项目,选择环境 3.Pycharm中新建conda环境

CSRF一-WEB攻防-CSRF请求伪造Referer同源置空配合XSSToken值校验复用删除

演示案例: CSRF-无检测防护-检测&生成&利用CSRF-Referer同源-规则&上传&XSSCSRF-Token校验-值删除&复用&留空 #CSRF-无检测防护-检测&生成&利用 检测:黑盒手工利用测试,白盒看代码检验(有无token…

【ESP32S3 Sense接入百度在线语音识别】

视频地址: ESP32S3 Sense接入百度在线语音识别 1. 前言 使用Seeed XIAO ESP32S3 Sense开发板接入百度智能云实现在线语音识别。自带麦克风模块用做语音输入,通过串口发送字符“1”来控制数据的采集和上传。 步骤概括    (1) 在百度云控制端选择“语音…

YiYi-Web项目介绍

YiYi-Web项目介绍 1. 简介2. 使用2.1 后端开发环境2.2 前端开发环境 3. 测试环境:4. 更新日志5. 打包情况6.项目截图 本项目前端是html、css、js、jQuery基础技术。 后端都是最新的SpringBoot技术,不分离版本, 是最基础的项目开发教程&#x…

挺后悔,我敷衍地回答了“程序员如何提升抽象思维“

分享是最有效的学习方式。 博客:https://blog.ktdaddy.com/ 大家好,我是老猫。 大概在月初的时候,我发了一篇文章【当程序员之后?(真心话)】,在这篇文章中,提及了抽象思维对一名程序员的重要性。可能说得也比较笼统&a…

【Flask】Flask数据模型关系

数据模型关系 一对多 如上所示,一个作者关联多个文章,暂时认定,一篇文章只能有一个作者。 作者以及文章的类定义如下所示: class Author(db.Model):id db.Column(db.Integer, primary_keyTrue)name db.Column(db.String(128)…

Godot.NET C# 工程化开发(1):通用Nuget 导入+ 模板文件导出,包含随机数生成,日志管理,数据库连接等功能

文章目录 前言Github项目地址,包含模板文件后期思考补充项目设置编写失误环境visual studio 配置详细的配置看我这篇文章 Nuget 推荐NewtonSoft 成功Bogus 成功Github文档地址随机生成构造器生成构造器接口(推荐) 文件夹设置Nlog 成功!Nlog.configNlogHe…

代码学习记录26----贪心算法

随想录日记part26【把这两天没写的补回来】 t i m e : time: time: 2024.03.22-24 主要内容:今天开始学习贪心算法,基础知识可以看链接,:接下来是针对题目的讲解:1.分配饼干 &#x…

继承和多态(1)(继承部分)

继承 继承的概念 上文就是继承的概念。 必须记住父类也可以称为基类,超类。 子类也可以称为派生类。 继承的语法 在Java中如果要表示类之间的继承关系,需要借助extends关键字,具体如下: 修饰符 class 子类 extends 父类 {//…

网易web安全工程师进阶版课程

课程介绍 《Web安全工程师(进阶)》是由“ i春秋学院联合网易安全部”出品,资深讲师团队通过精炼的教学内容、丰富的实际场景及综合项目实战,帮助学员纵向提升技能,横向拓宽视野,牢靠掌握Web安全工程师核心…

pycharm搭建新的解释器及删除处理

目录 1.创建虚拟环境 个人实际操作: 对于“继承全局站点包”: 2.创建一个新项目 3.删除操作 (1)删除解释器 (2)删除新建项目 1.创建虚拟环境 Pycharm官方文档说明网址: Configure a virt…

【机器学习】包裹式特征选择之序列前向选择法

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

向开发板上移植ip工具:交叉编译 ip工具

一. 简介 前面几篇文章学习了 CAN设备节点的创建,以及如何使能 CAN驱动。 本文学习向开发板上移植ip工具。 二. 向开发板上移植ip工具:交叉编译 ip工具 注意:在移植 ip 命令的时候必须先对根文件系统做个备份!防止操作失误导…

ffmpeg实现媒体流解码

本期主要讲解怎么将MP4媒体流的视频解码为yuv,音频解码为pcm数据;在此之前我们要先了解解复用和复用的概念; 解复用:像mp4是由音频和视频组成的(其他内容流除外);将MP4的流拆分成视频流(h264或h265等)和音频流(AAC或mp3等); 复用:就是将音频和视频打包成MP4或者fl…

Cobalt Strike -- 各种beacon

今天来讲一下cs里面的beacon 其实cs真的功能很强大,自带代理创建,自带beacon通信!!! 一张图,就能说明beacon的工作原理 1.Beacon 每当有一台机器上线之后,我们都会选择sleep时间,…

吴恩达2022机器学习专项课程(一) 3.6 可视化样例

问题预览 1.本节课主要讲的是什么? 2.不同的w和b,如何影响线性回归和等高线图? 3.一般用哪种方式,可以找到最佳的w和b? 解读 1.课程内容 设置不同的w和b,观察模型拟合数据,成本函数J的等高线…

nodejs+vue高校洗浴管理系统python-flask-django-php

高校洗浴管理系统采用数据库是MySQL。网站的搭建与开发采用了先进的nodejs进行编写,使用了express框架。该系统从两个对象:由管理员和学生来对系统进行设计构建。主要功能包括:个人信息修改,对学生管理、浴室信息、浴室预约、预约…