KMP算法求next数组和nextval数组方法总结

KMP算法求next数组和nextval数组方法总结

首先next数组,以下是天勤给出的求解步骤

 

 

FL为从左边第一个字符起的字串

FR为从右边第一个字符起的字串

如果没理解可以看下面的例子

例如模式串为

1

2

3

4

5

6

7

8

9

10

11

12

a

b

a

b

a

a

a

b

a

b

a

a

首先next[1]为0

0

 

 

 

 

 

 

 

 

 

 

 

挡住2(就是用手挡住不堪后面的)及以后的所有字符,只有一个字符为a,则FL的长度为0,则next[2]为0+1=1

0

1

 

 

 

 

 

 

 

 

 

 

挡住3及以后的所有字符,只有a和b两个字符,FL和FR没有相同的字串,则长度为0则next[3]为0+1=1

0

1

1

 

 

 

 

 

 

 

 

 

挡住4及以后所有字符,FL=a,与FR=a,相等则FL和FR的长度为1,则next[4]为1+1=2

0

1

1

2

 

 

 

 

 

 

 

 

挡住5及以后所有字符,FL=ab,与FR=ab相等,则长度为2,则next[5]为2+1=3

0

1

1

2

3

 

 

 

 

 

 

 

挡住6及以后所有字符,FL=aba与FR=aba相等,则长度为3,则next[6]为3+1=4

0

1

1

2

3

4

 

 

 

 

 

 

挡住7及以后所有字符,FL=a与FR=a相等,则长度为1,则next[7]为1+1=2

0

1

1

2

3

4

2

 

 

 

 

 

以此类推

0

1

1

2

3

4

2

2

 

 

 

 

0

1

1

2

3

4

2

2

3

 

 

 

0

1

1

2

3

4

2

2

3

4

 

 

0

1

1

2

3

4

2

2

3

4

5

 

0

1

1

2

3

4

2

2

3

4

5

6

 

 

 

 

改进的K MP算法中求nexttval数组的方法

 

虽说天勤给的步骤看着挺简单的但是讲真我一开始没看懂,这啥玩意?????

还是用上面例子

想要求nextval需要先求出next数组的值

j

1

2

3

4

5

6

7

8

9

10

11

12

模式串

a

b

a

b

a

a

a

b

a

b

a

a

next[j]

0

1

1

2

3

4

2

2

3

4

5

6

首先j为1是nextval[1]赋值为0,特殊情况标记

nexttv a[j]

0

 

 

 

 

 

 

 

 

 

 

 

j等于2时,对应模式串的值为b,对因的next[j]的值为1,则找到j=1的模式串即为a,b不等于a则nextval[2]的值即为next[2]的值即为1

nexttv a[j]

0

1

 

 

 

 

 

 

 

 

 

 

j等于3时,对因的模式串的值为a,对因的next[j]的值为1,则找到j=1的模式串即为a,a等于a,则nextval[3]的值为nextval[next[3]]的值即为nextval[1]的值,即nextval[3]=0;

nexttv a[j]

0

1

0

 

 

 

 

 

 

 

 

 

j等于4时,对因的模式串的值为b,对因的next[j]的值为2,则找到j=2的模式串即为b,b等于b,则nextval[4]的值为nextval[next[4]]的值即为nextval[2]的值,即nextval[4]=1;

以此类推,这里就不再赘述

nexttv a[j]

0

1

0

1

0

4

2

1

0

1

0

4

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值