数据结构-串-KMP算法详解(Next数组计算)(简单易懂)

这篇具有很好参考价值的文章主要介绍了数据结构-串-KMP算法详解(Next数组计算)(简单易懂)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


本文章就专讲kmp,暴力匹配就不讲了(我相信能搜索kmp的,暴力匹配算法应该也都了解过了)
为什么网上那么多讲kmp 我还发文章,很多文章我觉得讲的不是太通俗易懂,大多数我看起来都觉得有些懵逼

KMP介绍

提示:以下信息来源百度

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)

上面讲了kmp需要求匹配字符串的next数组来快速匹配,那我们先来讲解一下如何求next数组


一、求Next数组

求Next数组前我们需要了解字符串的前缀表后缀表

前后缀表

如字符串“ABCD”的前后缀表

串的next数组,算法

了解完字符串前后缀,接下来我们要开始求最长公共前后缀

求最长公共前后缀

我们以“aabaac”为例

串的next数组,算法

字符串中要没有公共前后缀就为0

从以上方法就能求出字符串“aabaac”的最长公共前后缀数组
[0,1,0,1,2,0]

最长相等前后缀表转Next数组

当然变成Next数组前还需要进行简单的处理(其实也就把最长公共前后缀数组右移而已)
串的next数组,算法

在最长公共前后缀前面加上 -1 并去掉最后一位就是next数组了
Next数组的第一位永远是-1,第二位永远是0

注意:Next数组有很多种求法,依据匹配字符串的代码来做选择,我选择的方法next数组第一位是-1,还有另一种方法开头是0,但原理都是相同的所以不必纠结


二、使用Next数组来匹配字符串

为了能较好体现kmp算法:
主串:“aaacaacaaad
模式串:“aaad
模式串Next数组:[-1,0,1,2]

在主串和匹配串字符相同的情况下,指针 i 和 j 后移

或者遇到主串和匹配串字符不相同但next值为-1时指针 i 和 j 后移

步骤一
1i、1j、2i、2j代表指针位置及步骤,中间字符相等的地方我就不讲了,就主要讲重点的地方

指针4i4j的字符不相同,不匹配位置的next值为2(蓝色的a),所以需要将匹配串右移到匹配串索引2的位置
串的next数组,算法
步骤二
匹配串后移后指针ij的字符依然还是不相同,不匹配位置的next值为1(蓝色的a),所以需要将匹配串右移到匹配串索引1的位置
串的next数组,算法
步骤三
匹配串后移后指针ij的字符依然还是不相同,不匹配位置的next值为0(蓝色的a),所以需要将匹配串右移到匹配串索引0的位置
串的next数组,算法
步骤四
匹配串后移后指针ij的字符依然还是不相同,但这时next值为-1,这就需要指针i和j向后移
串的next数组,算法
步骤五
指针i和j后移后,(中间字符相同的地方就不解说了),指针到3i和3j的字符不相同,next值为1,然后就和之前讲的步骤一样,需要将匹配串右移到匹配串索引1的位置
串的next数组,算法
步骤六
后面的步骤就不再多叙述,自己看图分析
串的next数组,算法
步骤七
串的next数组,算法

步骤八
然后这就匹配完成了
串的next数组,算法


总结

代码后续会补充
非常感谢您能看到这,本人第一次写文章,所以我可能讲的不是很好,如有问题望大家能多多提醒,感谢。下次讲sunday算法
注:如看不懂,可以的话,麻烦您在评论区中发句看不懂,好让我知道我写的烂不烂文章来源地址https://www.toymoban.com/news/detail-737478.html

到了这里,关于数据结构-串-KMP算法详解(Next数组计算)(简单易懂)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [数据结构] 串与KMP算法详解

    今天是农历大年初三,祝大家新年快乐! 尽管新旧交替只是一个瞬间,在大家互祝新年快乐的瞬间,在时钟倒计时数到零的瞬间,在烟花在黑色幕布绽放的瞬间,在心底默默许下愿望的瞬间……跨入新的一年,并不意味了一切都会朝着更美好,也没有什么会从天而降,我们赋

    2024年02月19日
    浏览(31)
  • KMP算法中的next数组求解

            KMP算法(Knuth-Morris-Pratt) 是一个字符串的匹配算法,其中有一部分算法需要求解next数组来求解 该位置前面字符串的最长相同的真前缀和真后缀长度。          next数组的求解方法为:第一位的next值为0,第二位的next值为1,后面求解每一位的next值时,根据前一位进行

    2024年02月10日
    浏览(39)
  • KMP算法——(手把手算next数组)

    该算法核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数,从而达到快速匹配的目的。 KMP算法与BF算法(暴力算法)区别在于, 主串 的i不会回退,并且 模式串 的j不会每次都回到0位置。 第一个问题:为什么主串的i不需要回退? 看如下两个字符串: a b c d

    2023年04月18日
    浏览(27)
  • 【KMP】从原理上详解next数组和nextval数组

    本文将从原理上详细解释KMP算法中的 next 数组以及 nextval 数组,尽量让大家明白它们到底在记录什么,为什么要这样算。以及 现在普遍的KMP算法实现当中的next数组与前两者有何不同 。篇幅较长,但尽量讲清楚。 虽然数据结构中对next数组有定义,但并不易于理解,因此我个

    2024年02月06日
    浏览(34)
  • 【数据结构与算法】KMP算法

     在C语言的strstr的实现过程中,所涉及的算法较为简单,或者说只是一个简单的思路而已,在字符串过长时,所涉及的算法复杂度过大,那有没有比较简单的算法呢?这里就涉及到了KMP——由三位大佬提出的,下面我们一起来了解吧!  KMP算法是一种改进的字符串匹配算法

    2024年03月26日
    浏览(33)
  • 数据结构:KMP算法

         KMP算法是由Knuth、Morris和Pratt三位学者发明的,所以取了三位学者名字的首字母,叫作KMP算法。      KMP主要用于字符串匹配的问题,主要思想是 当出现字符串不匹配时,我们可以知道一部分之前已经匹配过的的文本内容,利用这些信息从而避免从头再开始匹配。    

    2024年02月04日
    浏览(31)
  • 数据结构--KMP算法

    模板: 例题:acwing--kmp字符串(831. KMP字符串 - AcWing题库) 给定一个字符串 S,以及一个模式串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。 模式串 P 在字符串 S 中多次作为子串出现。 求出模式串 P 在字符串 S 中所有出现的位置的起始下标。 输入格式 第一

    2024年02月11日
    浏览(30)
  • 【数据结构】朴素模式匹配 & KMP算法

    🌈 自在飞花轻似梦,无边丝雨细如愁 🌈   🌟 正式开始学习数据结构啦~此专栏作为学习过程中的记录 🌟 子串的定位操作通常称为串的模式匹配,它求的是模式串在主串中的位置,而朴素模式匹配就是一种不断移动主串指针,每一次都和模式串依次进行比较的暴力求解方法

    2024年02月16日
    浏览(34)
  • 数据结构--字符串的KMP算法

    朴素模式匹配算法: 一旦发现当前这个子串中某个字符不匹配,就只能转而匹配下一个子串(从头开始) 但我们可以知道: 不匹配的字符之前,一定是和模式串一致的 color{red}不匹配的字符之前,一定是和模式串一致的 不匹配的字符之前,一定是和模式串一致的 我们可以利用

    2024年02月12日
    浏览(49)
  • 数据结构—串的详细解释(含KMP算法)

    1.1串的定义 串:串是由零个或多个字符组成的有限序列,又叫字符串(其的存储结构包含顺序表存储、单链表存储的形式。) 一般记为s=\\\"a1a2a3....an\\\"(n=0),其中,s是串的名称,用双引号(也可以使用单引号)括起来的字符序列是串的值,注意引号不是串的内容。ai(i=i=n)可以是字母、

    2023年04月09日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包