kmp算法中的next数组如何计算

author author     2023-03-23     164

关键词:

张乃孝上的
makenext(int c[],int *next)

int i=0,k=-1;
next[0]=-1;
int maxn=maxnum(p);//maxnum函数返回数组p的当前长度,在此略去
while(i<maxn-1)

while(k>=0&&c[i]!=c[k])k=next[k];
i++;k++;
next[i]=k;


但是理解不了什么意思。求讲解下,谢谢!

参考技术A next[i]表示的是:
在第i个字符前面的i-1个字符里面,
从开头开始的1个字符与最后1个字符是否相等,若不是,则next[i]=0,否则继续看下面;
从开头开始的2个字符与最后2个字符是否相等,若不是,则next[i]=1,否则继续看下面;
从开头开始的3个字符与最后3个字符是否相等,若不是,则next[i]=2,否则继续看下面;
……
就是这样的判断取值。
它的意思就是如果到了某个字符不匹配的情况时候,你就可以直接把模式串拖到从开头开始的那next[i]个字符等于当前字符的前next[i]个字符的地方,这样就少了很多重复的无效的比较和移动。

kmp算法

JUly的文章:从头到尾彻底理解KMP KMP算法:复杂度:线性PMT数组:PMT中的值是字符串的前缀集合与后缀集合的交集中最长元素的长度。next数组:是将PMT数组向后偏移一位得到的数组。基于next数组进行匹配。 next数组的求... 查看详情

数据结构学习笔记——kmp算法中的常见计算题目总结(代码片段)

目录例题1例题2例题3例题1例、求串’abaabc’的next数组值__________。答:首先设next[1]=0,next[2]=1(要注意这里的数组是从1开始的,而不是0),如下表:编号123456Sabaabcnext01当j=3时,k=next 查看详情

kmp算法

串′ababaaababaa′的next数组为:011234223456先从人的分析角度去分析怎么做。。。。next数组下标从1开始计算next[1]肯定是0next[2]肯定是1next[n]的情况,将前面n-1个字符,计算从首尾开始组成最大的相同子串的长度,如... 查看详情

kmp算法(代码片段)

...把子串的next[j]位置移动至与主串当前位置比较;因此KMP算法的主要过程就在于求子串的next数组了。 2.nextval数组:对next数组进一步改进,如果跳转到的nex 查看详情

kmp算法next数组的计算

已知0-1字符串:01101110011,试求next[7]的值。字符串如果是以0为下标的话next[7]是0,只有最后一位与第一位相等参考技术Anext[i]表示的是:在第i个字符前面的i-1个字符里面,从开头开始的1个字符与最后1个字符是否相等,若不是,... 查看详情

kmp算法如何构建next数组(代码片段)

在模拟KMP匹配过程之前,我们先建立两个概念:前缀:对于字符串abcxxxxefg,我们称abc属于abcxxxxefg的某个前缀。后缀:对于字符串abcxxxxefg,我们称efg属于abcxxxxefg的某个后缀。后缀就是相当于这个字符串减... 查看详情

经典算法——kmp,深入讲解next数组的求解(代码片段)

前言    之前对kmp算法虽然了解它的原理,即求出P0···Pi的最大相同前后缀长度k;但是问题在于如何求出这个最大前后缀长度呢?我觉得网上很多帖子都说的不是很清楚,总感觉没有把那层纸戳破,后来... 查看详情

kmp算法浅谈(代码片段)

Kmp算法浅谈一.Kmp算法思想在主串和模式串进行匹配时,利用next数组不改变主串的匹配指针而是改变模式串的匹配指针,减少大量的重复匹配时间。在Kmp算法中,next数组的构建是整个Kmp算法的核心所在。二.Kmp核心之next数组的构... 查看详情

数据结构kmp算法中的next函数

kmp算法中next函数具体是怎样实现的,最好能举例分布说明kmp策略:调整子串T的位置j,使得S[i-j+1,......i]与T[1,2,....j]保持匹配且新的S[i+1]与T[j+1]恰好匹配,否则j回移或移动i(使得S[i]=T[1]).直至j=T.length.匹配完成.kmp算法的的流程大致... 查看详情

kmp算法的next函数求解和分析过程

...//blog.csdn.net/wang0606120221/article/details/7402688  假设KMP算法中的模式串为P,主串为S,那么该算法中的核心是计算出模式串的P的next函数。KMP算法是在已知的模式串的next函数值的基础上进行匹配的。由于本次只讨论next的求值过... 查看详情

kmp算法

KMP算法(三个人名字开头字母)对BF算法进行了改进,省去了一部分没必要的比较,提高了算法的效率。K,M,P这三个人发现了BF算法中一些模式中遗憾的用于模式匹配的信息,这种信息就是模式匹配中的“部分匹配“的信息。首先... 查看详情

kmp算法

...配到长度为m模版串(记:pattern)  时间复杂度为O(m*n)KMP算法:  KMP算法则不用一步步的向前移动匹配,可以计算出一个next数组(跳转表),快速的匹配。  计算next的复杂度为m,运用next表对目标字符串匹配的复杂度为n  ... 查看详情

如何求字符串next数组值

...同理计算4a,可得计算结果为2+1=3。扩展资料next的优点KMP算法优于简单字符串匹配算法的根本原因就是:引入了一个next数组,这个数组可以尽可能的记录相关的匹配信息,使得在不匹配发生的时候移动的步长不再是固定的一位,... 查看详情

kmp算法next数组计算方法(代码片段)

KMP算法:关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。个人对于Next(&#... 查看详情

关于kmp算法中,获取next数组算法的理解

参考:KMP入门级别算法详解--终于解决了(next数组详解)https://blog.csdn.net/lee18254290736/article/details/77278769在这里讨论的next数组的含义为模式串p[j]之前前缀和后缀相等的个数,若都不相等则为0。(特殊情况,没有前缀和后缀时,则... 查看详情

kmp算法的next[]数组通俗解释

...中查找一个子字符串有很多方法。KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度。当然我们可以看到这个算法针对的是子串有对称属性,如果有对称属性,那么就需... 查看详情

kmp算法及应用

KMP算法用来解决一系列字符串单模式匹配问题,其以难理解,难记忆著称。其next数组的构造就如同AC自动机中的fail指针,就是如果匹配失败,字符串应从哪里开始继续匹配。这里的next数组表示:next[i]=前i个字符的公共最长前后... 查看详情

kmp算法(代码片段)

概述KMP(Knuth-Morris-Pratt)算法是一种用来解决字符串匹配问题的算法,时间复杂度为O(n+m),主要思想是当模式串与主串发生失配时,不必从头开始匹配,而是滑动到已经匹配的部分next数组在KMP算法中,next数组用来存储一段子串最... 查看详情