KMP模式匹配算法next数组值的推导详解

本文深入探讨了KMP算法中next数组的作用和推导过程,通过实例解释了为何需要next数组以避免不必要的回溯,并介绍了nextval数组的概念,以优化模式匹配的效率。
摘要由CSDN通过智能技术生成

继上一篇关于模式匹配算法的博文,我想在这里在继续详细解说一下next数组和nextval数组值的推导。

为什么需要next数组

next数组到底是用于什么的?为什么要有next数组?
在这里我们用next数组来记录模式串各个位置的j值变换
让我们用一个例子来说明上述概念:
假设主串S=abcdefgab
匹配串为T=abcdex
如果我们按照BF模式匹配算法来处理这个模式匹配的问题,那么其对应的步骤应该如下图所示:(带颜色的方块表示第一个不相同的字符)
在这里插入图片描述如果我们仔细观察的话,这两个字符串在第一次匹配的时候,前5位都是相等的。
并且对于要匹配的子串来说首字母’a’与后面的串"bcdex"中任意一个字符都不相等。也就是说既然a不与自己后面的子串中的任何一个字符相等,那么对于图1来说,主串和子串的前五位字符都相等,意味着子串的首字符不可能与主串的第一位到第五位的任何一个字符相等,也就是说,在上图的2345步骤的判断都是多余且没有必要的,所以在这个算法中我们只需要保留第一步和第六步即可。

经过我们的分析我们会发现,在BF模式匹配算法中是通过不断地回溯控制主串首字符的i值来达到模式匹配的目的的,但是经过上述的分析我们发现这里的i值并没有回溯,由第一步到第六步i值并没有发生变化,也就是说这种回溯其实是没有必要的,我们的KMP模式匹配算法就是为了让这种没有必要的回溯不发生。
那么既然控制主串的i值不回溯了,我们如何让我们的算法聪明的自己知道应该直接由第一步跳转到第六步,不进行中间的对于步骤呢?这个时候我们便需要一个数组来帮助我们记录子串各个位置的j值变换了,这也就是next数组诞生的必要性了
举例:假如在模式匹配的时候j = 4的时候发现和主串已经出现了不匹配的情况,那么当j=3时我们的j值接下来应该跳转到哪一个值?这个时候我们便需要去查找next[j]了。

next数组值的推导

沿用上一篇推到next值的代码,在这里我将根据代码来讲next数组值的推导。

void get_kmp_next(char *string, int *next)
{
   
    size_t i 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值