模式匹配next c语言,数据结构与算法~串的模式匹配~KMP匹配算法中next的快速计算法...

在数据结构与算法课程中,串的匹配中,时间和空间消耗最大的是BF蛮力法。

基于BF蛮力法的低效率,KMP算法减少了不必要的无效匹配。算法中的核心是要对子串计算next值

下面先来看下公式的定义:

219d87f1f95d62f4e77a8b826fb199ac.png

这个公式比较抽象,我们用这个公式来看看教材上的一个子串的计算过程。

模式串的index计算

j

1

2

3

4

5

6

7

8

9

模式串

a

b

c

a

a

b

a

b

c

next值

0

1

1

1

2

2

3

2

3

获得步骤

计算1

计算2

计算3

计算4

计算5

计算6

计算7

计算8

计算9

计算1:next[1]=a   因为  j=1 ,直接对应公式第一项,next=0

计算2:next[2]=b   j=2;对应公式第二项 1<=k<2 ;当k=1时,公式为

553c0e3b5944b23c8c29f34d684ecacb.png  但 

90e7a4e400949bcda4bd075b05c514a8.png 。使用第三项  next=1

计算3:next[3]=c   j=3;对应公式第二项2b4c5f19626dd356ff570aab5267c5c9.png;k=1/2 ;k=1没有意义,下面不再判断

当k=2时,公式为955b3495ba018d67bf7d44a9cdc0e23e.png    但

8a65d9ec98422e9f08c32b82e981424e.png    使用第三项next=1

计算4:next[4]=a   j=4;对应公式第二项

99aa190b4483103ea504468044512965.png ,k=2/3。

当K=2时,判断公式  94e5acba66a810e2b32655ffeb0226ca.png               但

fd43edd7f2be817b91690bd5db96d227.png

当k=3时,判断公式  47f90f7fa0a638ddd69f1e22844a9f25.png   但   

ed8e755aba71dffd9985d04ec548defa.png两个K值都不满足,使用第三项  next=1

计算5:next[5]=a j=5;对应公式第二项

ca12b109c5b5a40456f57a8609c9de27.png ,k=2/3/4。

当K=2时,判断公式  878b4b8d9d0d729afb858d78c3cf1f07.png

a2cbc18c4fd55549da6464cb50efa8d5.png

当k=3时,判断公式  d68f02bba88b885c73436e9ab2b5af92.png                      

3862e38d7f3da560128f8270ebbde909.png

当K=4时,判断公式15cf5053039d38e65d25a11f7475e310.png    

d090a86b866876e248e442f2e99c7ff1.png      k=2可用,next=2

计算6:next[6]=b     j=6 ;对应公式第二项

5083947943a5a657dbc447c8c150ec6b.png ,k=2/3/4/5

当K=2时,判断公式  d601ff2fdaf37b7428e3e9d8fc8b70a3.png

a60b155ef3c8c522b5986b5482c93df8.png

当k=3时,判断公式  0dd151933b000e8eff42297881f397ac.png                      

28b045ba416ce983faa5b33a236cc7ec.png

当K=4时,判断公式93d934cb340848b3bf27f85455b793ac.png    

5163373449628f8a8e818d60b46a1978.png

当K=5时,判断公式ed496071dec46abc2b37fd50e839ab84.png    

6251e8a6e35f229dee3c81e7970e7947.png     k=2可用,next=2

计算7:next[7]=a     j=7 ;对应公式第二项

285fc3bf14a4923241308b06a93e1475.png ,k=2/3/4/5/6

当K=2时,判断公式  83fa4642cda59fa4e02f2f30cdc88f80.png

9b4233c8c4828c19fbfb87e5dede3bc2.png

当k=3时,判断公式  fb80d6d23a4ba97778d9521dbb6ab2b9.png                      

0abf8008523c24baaecaa99ead4ba4ab.png

当K=4时,判断公式8af58489aa26e02a39afdecadb8ddf2b.png    

77731a5cfd0e05bb3c630cde5afec1cf.png

当K=5时,判断公式da2925d4c61ef5459bf204337b188c0b.png    

3f5a004b6128ba94d813b70df5a9c318.png     k=3可用,next=3

按照公式来计算,看出来非常的繁琐,有没有简单的计算方法呢?仔细看计算1-7中的比对步骤,可以得到下面的直观步骤。

计算字符位置为n的字符的index值,看前面有n-1个字符,需要判断n-2次。

将位置n字符前面的子串,分为从第一个字符开始命名为A   和   从n-1位置往前命名为B,

判断分别是  A1 vs B1,A2 vs B2  ......... An-2 vs Bn-2,如果相等,取第几次的值+1,就是字符的next值。

下面用这个方法来计算后面两个字符:

计算8:next[8]=b,前面有7个字符,需要比较6次:

A1 vs B1:[1] vs [7]     a=a           A1 vs B1 可用,next=1+1=2

A2 vs B2:[1][2] vs [6][7]      ab <>ba

A3 vs B3:[1][2][3] vs [5][6][7]      abc <>aba

A4 vs B4:[1][2][3][4] vs [4][5][6][7]      abca <>aaba

A5 vs B5:[1][2][3][4][5] vs [3][4][5][6][7]      abcaa <>caaba

A6 vs B6:[1][2][3][4][5][6] vs[2][3][4][5][6][7]      abcaab <>bcaaba

计算9:快速计算,只有 A2 vs  B2     ab=ab ,next=2+1=3

这样基本可以在1-2分钟之内,快速的写出字符串的next值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值