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

news2024/11/16 10:51:27

😀前言
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.coloradmin.cn/o/1541244.html

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

相关文章

【C++】用哈希桶模拟实现unordered_set和unordered_map

目录 一、哈希介绍1.1 哈希概念1.2 哈希冲突解决1.2.1 闭散列1.2.2 开散列 二、哈希桶2.1 实现哈希桶2.1.1 构造节点和声明成员变量2.1.2 构造与析构2.1.3 仿函数2.1.4 查找2.1.5 插入2.1.6 删除 2.2 kv模型哈希桶源代码 三、改造哈希桶3.1 beginend3.2 迭代器3.2.1 前置 3.3 改…

Linux_ubuntu中进行断点调试

文章目录 一、安装gdb调试器:二、使用gcc编译程序:三、使用gdb对程序进行调试:1.设置断点:使用break命令或简写为b来设置断点2.调试运行——run:3.继续执行——continue/c:4.单步执行:5.监视变量…

6.windows ubuntu 子系统 测序数据质量控制。

上一个分享,我们对测序数据进行了质量评估,接下来我们需要对数据进行数据质量控制。 数据预处理(Data Preprocessing):包括去除接头序列(adapter trimming)、去除低质量序列(qualit…

【Spring Boot 源码学习】共享 MetadataReaderFactory 上下文初始化器

《Spring Boot 源码学习系列》 共享 MetadataReaderFactory 上下文初始化器 一、引言二、往期内容三、主要内容3.1 源码初识3.2 CachingMetadataReaderFactoryPostProcessor3.2.1 register 方法3.2.1 configureConfigurationClassPostProcessor 方法 3.3 ConfigurationClassPos…

SpringMVC结合设计模式:解决MyBatisPlus传递嵌套JSON数据的难题

🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 &a…

Learn OpenGL 24 点光源阴影

点光源阴影 上个教程我们学到了如何使用阴影映射技术创建动态阴影。效果不错,但它只适合定向光,因为阴影只是在单一定向光源下生成的。所以它也叫定向阴影映射,深度(阴影)贴图生成自定向光的视角。 本节我们的焦点是…

Java进阶—GC回收(垃圾回收)

1. 什么是垃圾回收 垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)的一项重要功能,用于自动管理程序中不再使用的内存。在Java中,程序员不需要手动释放内存,因为GC会自动检测并回收不再使用的对象,从而减少内存泄…

Java基础【上】韩顺平(反射、类加载、final接口、抽象类、内部类)

涵盖知识点:反射、类加载、单例模式、final、抽象类、接口、内部类(局部内部类、匿名内部类、成员内部类、静态内部类) P711 反射机制原理 创建如下目录结构,在模块下创建src文件夹,文件夹要设置为Sources文件夹&…

Git使用:实现文件在不同设备之间进行同步

一、注册Gitee,创建远程仓库 注册网址:登录 - Gitee.com 打开Gitee,注册完进行登录,点击右上角【】创建一个仓库 新建仓库: 点击创建,仓库创建完毕。 二、下载Git安装包,并创建本地仓库 下载网…

正则表达式具体用法大全~持续更新

# 正则表达式: ## 单字符匹配: python # 匹配某个字符串: # text "abc" # ret re.match(b,text) # print(ret.group()) # 点(.):匹配任意的字符(除了\n): # text "\nabc&quo…

day02_mysql-DDLDMLDQL_课后练习 - 参考答案

文章目录 day02_mysql_课后练习第1题第2题 day02_mysql_课后练习 第1题 案例: 1、创建数据库test02_library 2、创建表格books 字段名字段说明数据类型b_id书编号int(11)b_name书名varchar(50)authors作者varchar(100)price价格floatpub…

【C语言】——指针四:字符指针与函数指针变量

【C语言】——指针四:字符指针与函数指针变量 一、字符指针二、函数指针变量2.1、 函数指针变量的创建2.2、两段有趣的代码 三、typedef关键字3.1、typedef的使用3.2、typedef与define比较 四、函数指针数组 一、字符指针 在前面的学习中,我们知道有一种…

FaceBook广告账号验证教程

1.登录facebook账号,点击左边的ads manager。 2.点击Create ad创建广告。 3.选择广告投放意向。 4.填写广告信息。 5.创建广告后选择付款方式,这里我是使用信用卡付款。这里我是使用Fomepay的虚拟卡进行绑定的。 6.填写信用卡的持卡人姓名 卡号 有效期 安全码 7.填写…

【Jenkins】群晖 配置 ssh over push 插件

群晖 配置 ssh over push 插件 前提 部署好 Jenkins 且 安装 好 ssh over push 插件 开启 群晖 ssh 服务 及 SFTP 服务 配置 Jenkins Jenkins ——系统管理——publish over ssh 测试下: 遇到的问题: jenkins.plugins.publish_over.BapPublishe…

数据容器-序列-集合-Python

师从黑马程序员 序列 序列的常用操作-切片 切片:从一个序列中,取出一个子序列 语法:序列[起始下标:结束下标,步长] 注:此操作不会影响序列本身,而是会得到一个新的序列 my_list[0.1,2,3,4,5,6] result1…

LeetCode-热题100:79. 单词搜索

题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相…

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

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

C++函数返回机制,返回类型

return语句终止当前正在执行的函数并将控制权返回到调用该函数的地方。 return语句有两种形式 return;return expression; 无返回值函数 没有返回值的return语句只能用在返回类型是void的函数中。 返回void的函数不要求必须有return语句,因为这类函数的最后一句…

手撕算法-接雨水

描述 分析 i位置能积累的雨水量,等于其左右两边最大高度的最小值。为了能获取i位置左右两边的最大高度。使用动态规划。两个dp数组: leftMaxrightMax 其中 leftMax[i] 代表i位置左边的最大高度rightMax[i] 代表i位置右边的最大高度 初始状态&#x…

新手装修:卫生间渗水原因及解决方法。福州中宅装饰,福州装修

引言 瓷砖渗水问题常常发生在卫生间区域,需要及时处理以免造成地面滑倒和墙面霉菌等问题,为了解决这一问题,我们应该怎么做呢? 首先要检查水管是否漏水,可以进行打压测试来确认是否存在漏水情况。如果发现水管破损造成…