当前位置: 首页 > news >正文

KMP算法模式匹配——手工求解next和nextval数组值

本文需要了解KMP算法基本流程和相关概念,如有问题,请先进行基础学习:链接: 天勤-KMP算法易懂版

求解next数组值

给定模式串:“ababaaab”,求解其next数组值。
例子里面的ababaaab,我们定义一个 i 为模式串的下标(从1开始),我们把 i 所指字符之前的串记为F(不包括i所指的字符),手推如下:

  1. i = 1 时,此时指向a,发生不匹配,此时属于模式串的第一个字符与主串对应位置不匹配,应从主串的下一位置和模式串的第一个字符继续比较。那么此时,我们也将 next[1] 赋值为 0 来表示这种情况。
  2. i = 2 时,此时指向b,发生不匹配,可知F为"a",此时属于不存在前后重合的部分,应该从主串中发生不匹配的字符与模式串第一个字符开始比较。我们可以把这种情况的最长相等前后缀的长度看为0,那么next[2]赋值为1
  3. i = 3 时,此时指向a,发生不匹配,此时可以知道F是"ab",与2中情况一样,则next[3]为1
  4. i = 4 时,此时指向b,发生不匹配,此时F为"aba",那么最长相等前后缀就为"a",长度为1,所以此时next[4]为2
  5. i = 5 时,此时指向a,发生不匹配,此时F为"abab",则最长相等前后缀为"ab",长度为2,故next[5]为3
  6. i = 6 时,此时指向a,发生不匹配,此时F为"ababa"最长相等前后缀为"aba",长度为3,则next[6]为4
  7. i = 7 时,此时指向a,发生不匹配,此时F为"ababaa"最长相等前后缀是"a",长度为1,则next[7]为2
  8. i = 8 时,此时指向b,发生不匹配,此时F为"ababaaa"最长相等前后缀是"a",长度为1,则next[8]为2

综上,可以得出next数组值为 0 1 1 2 3 4 2 2

求解nextval数组值

给定模式串:“ababaaab”,求解其nextval数组值。
例子里面的ababaaab,我们定义一个 j 为模式串的下标(从1开始),设next数组里面的值为pj(j为下标)
在这里插入图片描述

一般步骤(j,k均为下标):
1.当 j 等于1时,nextval[j]赋值为0,作为特殊标记。
2.当pj不等于pk时(k等于next[j]),nextval[j]赋值为k。
3.当pj等于pk时(k等于next[j]),nextval[j]赋值为nextval[k]。

手推如下:

n e x t v a l [ 1 ] = 0 , 特殊标记 nextval[1] = 0 ,特殊标记 nextval[1]=0,特殊标记
p 2 为 b , p n e x t [ 2 ] 为 a ,两者不相等, n e x t v a l [ 2 ] = n e x t [ 2 ] = 1 ; p2为b,p_{next\left[ 2\right] }为a,两者不相等,nextval[2]=next[2]=1; p2bpnext[2]a,两者不相等,nextval[2]=next[2]=1;
p 3 为 a , p n e x t [ 3 ] 为 a ,两者相等, n e x t v a l [ 3 ] = n e x t v a l [ n e x t [ 3 ] ] = 0 ; p3为a,p_{next\left[ 3\right] }为a,两者相等,nextval[3]=nextval[next[3]]=0; p3apnext[3]a,两者相等,nextval[3]=nextval[next[3]]=0;
p 4 为 b , p n e x t [ 4 ] 为 b ,两者相等, n e x t v a l [ 4 ] = n e x t v a l [ n e x t [ 4 ] ] = 1 ; p4为b,p_{next\left[ 4\right] }为b,两者相等,nextval[4]=nextval[next[4]]=1; p4bpnext[4]b,两者相等,nextval[4]=nextval[next[4]]=1;
p 5 为 a , p n e x t [ 5 ] 为 a ,两者相等, n e x t v a l [ 5 ] = n e x t v a l [ n e x t [ 5 ] ] = 0 ; p5为a,p_{next\left[ 5\right] }为a,两者相等,nextval[5]=nextval[next[5]]=0; p5apnext[5]a,两者相等,nextval[5]=nextval[next[5]]=0;
p 6 为 a , p n e x t [ 6 ] 为 b ,两者不相等, n e x t v a l [ 6 ] = n e x t [ 6 ] = 4 ; p6为a,p_{next\left[ 6\right] }为b,两者不相等,nextval[6]=next[6]=4; p6apnext[6]b,两者不相等,nextval[6]=next[6]=4;
p 7 为 a , p n e x t [ 7 ] 为 b ,两者不相等, n e x t v a l [ 7 ] = n e x t [ 7 ] = 2 ; p7为a,p_{next\left[ 7\right] }为b,两者不相等,nextval[7]=next[7]=2; p7apnext[7]b,两者不相等,nextval[7]=next[7]=2;
p 8 为 b , p n e x t [ 8 ] 为 b ,两者相等, n e x t v a l [ 8 ] = n e x t v a l [ n e x t [ 8 ] ] = 1 ; p8为b,p_{next\left[ 8\right] }为b,两者相等,nextval[8]=nextval[next[8]]=1; p8bpnext[8]b,两者相等,nextval[8]=nextval[next[8]]=1;

综上,nextval数组值为0 1 0 1 0 4 2 1

相关文章:

  • 外贸建站行业好做吗/seo在线优化
  • 金融网站建设公司/seo高手培训
  • o2o电子商务网站/seo网站推广价格
  • 一家做特卖的网站叫什么/营销100个引流方案
  • 家具网站开发目的/谷歌paypal官网登录入口
  • 太阳能建设网站/软件关键词排名
  • 【蓝桥杯真题练习】STEMA科技素养练习题库 答案版011 持续更新中~
  • Maven:命令行
  • java计算机毕业设计燕理快递中转站系统设计与实现MyBatis+系统+LW文档+源码+调试部署
  • 杰理之注册编码服务事件回调【篇】
  • SpringBoot统一返回处理出现cannot be cast to java.lang.String异常
  • (刘二大人)PyTorch深度学习实践-卷积网络(Advance)
  • mysql 理论知识
  • Decoder与Encoder重要组件
  • C · 初阶 | 循环语句
  • Vue-(7)
  • 『Material Design』CollapsingToolbarLayout可折叠标题栏
  • 详解MySQL数据类型