KMP算法求模式串的next 与nextval值

例:
求模式串abaabcac 的next值与nextval值?

j12345678
模式串abaabcac
next01122312
nextval01021302

解析
next:

  1. 前两位必定为0和1。
  2. 计算第三位的时候,看第二位b的next值,为1,则把b和1对应的a进行比较,不同,则第三位a的next的值为1,因为一直比到最前一位,都没有发生比较相同的现象。
  3. 计算第四位的时候,看第三位a的next值,为1,则把a和1对应的a进行比较,相同,则第四位a的next的值为第三位a的next值+1=2 ,因为是在第三位实现了其next值对应的值与第三位的值相同。
  4. 计算第五位的时候,看第四位a的next值,为2,则把a和2对应的b进行比较,不同,则再将b对应的next值1对应的a与第四位的a进行比较,相同,则第五位的next值为第二位b的next值+1=2。因为是在第二位实现了其next值对应的值与第四位的值相同。
  5. 计算第六位的时候,看第五位b的next值,为2,则把b和2对应的b进行比较,相同,则第六位c的next值为第五位b的next值加上1,为3,因为是在第五位实现了其next值对应的值与第五位相同。
  6. 计算第七位的时候,看第六位c的next值,为3,则把c和3对应的a进行比较,不同,则再把第3位a的next值1对应的a与第六位c比较,仍然不同,则第七位的next值为1。
  7. 计算第八位的时候,看第七位a的next值,为1,则把a和1对应的a进行比较,相同,则第八位c的next值为第七位a的next值加上1,为2,因为是在第七位和实现了其next值对应的值与第七位相同。
j12345678
模式串abaabcac
next01122312
nextval01021302

nextval :

  1. 第一位必为0,第2位b对应next值1,b与索引1对应的a比较,不相等,则第二位b的nextval值为为自身的next值1
  2. 第3位a对应next值1,a与索引1对应的a比较,相等,则第三位a的nextval值为索引1对应的nextval值0
  3. 第4位a对应next值2,a与索引2对应的b比较,不相等,则第四位a的nextval值为自身的next值2
  4. 第5位b对应next值2,b与索引2对应的b比较,相等,则第五位b的nextval值为索引2对应的nextval值1
  5. 第6位c对应next值3,c与索引3对应的a比较,不相等,则第六位c的nextval值为为自身的next值3
好的,我会保密您的要。以下是您的问题的回答: (1)计算模式P的next和nextval函数: P的next数组为[0,0,0,1,2,0,1]。 nextval函数为[0,0,0,1,2,0,1],因为P中的第一个字符a没有前缀也没有后缀,其next为0,所以nextval(1)=0。第二个字符b没有前缀,后缀为a,则nextval(2)=0。第三个字符c没有前缀,后缀为ab,则nextval(3)=0。第四个字符a有前缀和后缀均为abc,则nextval(4)=1。第五个字符b有前缀和后缀均为abc,ab,则nextval(5)=2。第六个字符a没有前缀和后缀均为abcab,则nextval(6)=0。第七个字符a有前缀和后缀均为abcaba,则nextval(7)=1。 (2)利用KMP算法进行模式匹配时每一趟的匹配过程: 将主模式对齐后,首先将模式第一个字符与主对应位置进行比较,如果相同,则继续比较下一个字符,否则利用next数组向右移动模式。 以S=‘abcaabbabcabaacbacba’,P=‘abcabaa’为例,匹配过程如下表所示: | 主位置 | 匹配字符 | 模式位置 | next | nextval | | ---------- | ---------- | ---------- | -------- | --------- | | 1 | a | 1 | 0 | 0 | | 2 | b | 2 | 0 | 0 | | 3 | c | 3 | 0 | 0 | | 4 | a | 4 | 1 | 1 | | 5 | a | 5 | 2 | 2 | | 6 | b | 6 | 0 | 0 | | 7 | a | 4 | 1 | 1 | | 8 | b | 2 | 0 | 0 | | 9 | c | 3 | 0 | 0 | | 10 | a | 4 | 1 | 1 | | 11 | a | 5 | 2 | 2 | | 12 | c | 6 | 0 | 0 | | 13 | b | 2 | 0 | 0 | | 14 | a | 4 | 1 | 1 | | 15 | a | 5 | 2 | 2 | | 16 | c | 6 | 0 | 0 | | 17 | b | 2 | 0 | 0 | | 18 | a | 4 | 1 | 1 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值