利用KMP算法,求模式串的abcdabcdab的next函数值和nextval函数值
时间: 2024-06-05 10:07:14 浏览: 93
KMP算法求next 和 nextval
5星 · 资源好评率100%
首先,KMP算法中的next函数用于匹配失败时进行跳转,nextval函数则是对于重复的最长前缀和最长后缀进行优化,以达到更快的匹配速度。
对于模式串"abcdabcdab",它的next函数值可以如下计算:
1. 首先,next[0] = -1,next[1] = 0;
2. 以i=2为例,模式串中前缀"ab"和后缀"ab"完全匹配,因此next[2] = 1;
3. 以i=3为例,模式串中前缀"abc"和后缀"abc"完全匹配,因此next[3] = 2;
4. 以i=4为例,模式串中前缀"abcd"和后缀"abcd"完全匹配,因此next[4] = 3;
5. 以i=5为例,模式串中前缀"abcda"和后缀"abcda"完全匹配,因此next[5] = 4;
6. 以i=6为例,模式串中前缀"abcdab"和后缀"abcdab"完全匹配,因此next[6] = 5;
7. 以i=7为例,模式串中前缀"abcdabc"和后缀"abcdabc"完全匹配,因此next[7] = 6;
8. 以i=8为例,模式串中前缀"abcdabcd"和后缀"abcdabcd"完全匹配,因此next[8] = 7;
9. 以i=9为例,模式串中前缀"abcdabcda"和后缀"abcdabcda"不完全匹配,但是可以通过next[8]跳转到next[7],即next[9] = next[8] + 1 = 8;
10. 以i=10为例,模式串中前缀"abcdabcdab"和后缀"abcdabcdab"完全匹配,因此next[10] = 9。
因此,模式串"abcdabcdab"的next函数值为-1,0,1,2,3,4,5,6,7,8,9。
接下来,我们可以通过next函数值来计算nextval函数值:
1. 首先,nextval[0] = -1,nextval[1] = 0;
2. 对于i=2,因为next[i] = 1,所以nextval[i] = next[i] = 1;
3. 对于i=3,因为next[i] = 2,所以nextval[i] = next[i] = 2;
4. 对于i=4,因为next[i] = 3,所以nextval[i] = next[i] = 3;
5. 对于i=5,因为next[i] = 4,所以nextval[i] = next[i] = 4;
6. 对于i=6,因为next[i] = 5,所以nextval[i] = next[i] = 5;
7. 对于i=7,因为next[i] = 6,所以nextval[i] = next[i] = 6;
8. 对于i=8,因为next[i] = 7,所以nextval[i] = next[i] = 7;
9. 对于i=9,因为next[i] = 8,所以nextval[i] = next[next[i]] = next[8] = 7;
10. 对于i=10,因为next[i] = 9,所以nextval[i] = next[next[i]] = next[9] = 8。
因此,模式串"abcdabcdab"的nextval函数值为-1,0,1,2,3,4,5,6,7,8。
阅读全文