数据结构复习5:KMP算法next数组计算方法

串的模式匹配KMP算法中next[]数组的求解总结

步骤(1)

初始化

next[1]=0  

next[2]=1;

步骤(2) 求next[j],令k=next[j-1]
步骤(3)

S[j-1]    S[k]  比较大小

         = ,   next[j]=k+1

         != ,  k=next[k], k!=0, 返回(3);

         k= 0,next[j]=1

根据以上方法,在具体习题中,需要建立一个表格,即可解决此类问题。

j(字符串位序) 1 2 3 4 5 ....
S[j]  (字符串对应位序的字符) ... ... ... ... ... ...
next[j]  (下一次需要开始匹配的字符位序) ... ... ... ... ... ...

具体计算过程

下面是结合具体例题的实际计算过程:

例题:在kmp算法中进行模式匹配,模式串为“ababaaababaa”的next数组值为(   )

首先建立表格如下:

j 1 2 3 4 5 6 7 8 9 10 11 12
S[j] a b a b a a a b a b a a
next[j]

然后按照方法进行计算next(j)数组:   

        1),初始化:next[1]=0     next[2]=1

        2), j=3 ,求 next[3],

                        k = next[j-1]=next[3-1]=next[2]=1,

                        S[k]=S[1]=a   S[j-1]=S[3-1]=S[2]=b  S[k]!=S[j-1]    k=next[k]=next[1]=0 

                        next[3]=1

        3),j=4, 求next[4]

                        k=next[j-1]=next[4-1]=next[3]=1

                        S[k]=S[1]=a   S[j-1]=S[4-1]=S[3]=a   S[k]=S[j-1]   next[j]=k+1

                        next[4]=1+1=2

        4),j=5,求next[5]

                        k=next[5-1]=next[4]=2

                        S[k]=S[2]=b   S[j-1]=S[4]=b  S[k]=S[j-1]   next[j]=k+1

                        next[5]=2+1=3

        5),j=6,求next[6]

                        k=next[6-1]=next[5]=3

                        S[k]=S[3]=a   S[j-1]=S[5]=a    S[k]=S[j-1]   

                        next[j]=k+1=4

        6),j=7,求next[7]

                        k=next[7-1]=next[6]=4

                        S[k]=S[4]=b  S[j-1]=S[6]=a      S[k]!=S[j-1]    k=next[k]=next[4]=2

                        S[k]=S[2]=b   S[k]!=S[j-1]    k=next[k]=next[2]=1

                        S[k]=S[1]=a    S[k]=S[j-1]   

                        next[j]=k+1=2

        7),j=8,求next[8]

                        k=next[8-1]=next[7]=2

                        S[k]=S[2]=b   S[j-1]=S[7]=a     S[k]!=S[j-1]    k=next[k]=next[2]=1

                        S[k]=S[1]=a  S[k]=S[j-1]   

                        next[j]=k+1=2

        8),j=9,求next[9]

                        k=next[9-1]=next[8]=2

                        S[k]=S[2]=b   S[j-1]=S[8]=b   S[k]=S[j-1]   

                        next[j]=k+1=3

        9),j=10,求next[10]

                        k=next[10-1]=next[9]=3

                        S[k]=S[3]=a  S[j-1]=S[9]=a   S[k]=S[j-1]   

                        next[j]=k+1=4

        10),j=11,求next[11]

                        k=next[11-1]=next[10]=4

                        S[k]=S[4]=b  S[j-1]=S[10]=b  S[k]=S[j-1]   

                        next[j]=k+1=5

        11),j=12,求next[12]

                        k=next[12-1]=next[11]=5

                        S[k]=S[5]=a  S[j-1]=S[11]=a  S[k]=S[j-1]   

                        next[j]=k+1=6

因此表格填写如下:

j 1 2 3 4 5 6 7 8 9 10 11 12
S[j] 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

おすすめ

転載: blog.csdn.net/weixin_40165004/article/details/120616623