Ⅰ KMP算法next数组的计算
字符串如果是以0为下标的话next[7]是0,只有最后一位与第一位相等
Ⅱ kmp算法中的next到底是什么意思啊
先看看next数据值的求解方法
位序 1 2 3 4 5 6 7 8
模式串 a b a a b c a c
next值 0 1 1 2 2 3 1 2
next数组的求解方法是:
1.第一位的next值为0
2.第二位的next值为1
后面求解每一位的next值时,根据前一位进行比较
3.第三位的next值:第二位的模式串为b ,对应的next值为1;将第二位的模式串b与第一位的模式串a进行比较,不相等;则第三位的next值为1
4.第四位的next值:第三位的模式串为a ,对应的next值为1;将第三位的模式串a与第一位的模式串a进行比较,相同,则第四位的next值得为2
5.第五位的next值:第四位的模式串为a,对应的next值为2;将第四位的模式串a与第二位的模式串b进行比较,不相等;第二位的b对应的next值为1,则将第四位的模式串a与第一位的模式串a进行比较,相同,则第五位的next的值为2
6.第六位的next值:第五位的模式串为b,对应的next值为2;将第五位的模式串b与第二位的模式中b进行比较,相同,则第六位的next值为3
7.第七位的next值:第六位的模式串为c,对应的next值为3;将第六位的模式串c与第三位的模式串a进行比较,不相等;第三位的a对应的next值为1,则将第六位的模式串c与第一位的模式串a进行比较,不相同,则第七位的next值为1
8.第八位的next值:第七位的模式串为a,对应的next值为1;将第七位的模式串a与第一位的模式串a进行比较,相同,则第八位的next值为2
以上这种分析方法,位序是从1开始的,如果位序从0开始,刚第一位的next值为-1,后面的方法则相同
Ⅲ KMP算法求next数组的问题
字符串以0为下标时,next[7]为0,说明只有最后一位与第一位相等。在第i个字符前的i-1个字符中,从开头开始的1个字符与最后1个字符相等,则next[i]=0;如果不等,则next[i]=1;从开头开始的2个字符与最后2个字符相等,则next[i]=1;如果不等,则next[i]=2;依此类推。
前缀next数组的求解算法如下:
void SetPrefix(const char *Pattern, int prefix[]) {
int len=CharLen(Pattern);//获取模式字符串长度。
prefix[0]=0;
for(int i=1; i < len; i++) {
int j=prefix[i-1];
while(j>0 && Pattern[i]!=Pattern[j])
j=prefix[j-1];
if(Pattern[i]==Pattern[j])
j++;
prefix[i]=j;
}
}
算法中,通过比较模式字符串的前缀与后缀,来逐步构建next数组。当模式字符串发生变化时,需要重新计算next数组。这个算法的时间复杂度为O(n),其中n为模式字符串的长度。
next数组的构建过程中,若前缀与后缀不匹配,则将前缀索引回退到已知匹配的位置,继续进行比较。这样可以避免不必要的重复比较,提高算法效率。
在KMP算法中,next数组用于记录模式串中每个位置的最长相等前后缀长度。通过next数组,可以快速跳过已匹配的部分,从而提高字符串匹配的效率。
Ⅳ 模式匹配KMP算法里面next里保存的值有什么用
next数组存储的数据是用来当模式串与主串不匹配的时候要模式串回退到第几个字符与主串再重新匹配,我们知道KMP算法的主串是不回朔的,当不匹配的时候我们不是退回到开始位置重新匹配,而是利用已经匹配的结果将模式串回朔到下一个位置,这个位置比开始位置更近一步;
简单的说就是next[ j ]的值保存的是当模式串中第 j 个字符与主串第 i 个字符不匹配时候,模式串中的哪个字符 重新与主串第 i 个再匹配,这样总的字符比较次数比从开始位置比较的次数就少了。