KMP算法的最通俗易懂的解答

      系统分析师 2007-10-17 11:22

如果你确实只是想完成练习题  那看看这个解答吧 反正我算是看明白了

当用KMP算法时,进行查找时扫描指针的动作就只依赖于模式,而与目标无关.

所以解此类题时,只将焦点集中于模式串并根据失效函数定义公式计算即可.

公式如下: f(j)=K 或-1.

取K时,满足的条件为:0<=K<J,且使得P0..PK=P(J-K)..P(J). 

(J依次从0到N-1进行计算.)

以下是引用恒翔在2004-10-8 15:13:45的发言:

请根据改进KMP算法计算以下三个模式串的对应的Next值?

aabbaaccaabb

abcdcbabcdcba

abacadacaba

最好能够根据该题进行详细的说明?不胜感激

对于第一串: aabbaaccaabb

   分别编号:0 1 2 3 4 5 6 7 8 9 10 11

J=0:K无值,f(0)= -1

J=1:K=0, p0=p1, f(1)=0

J=2:K=0,1,p0<>p2,p0p1<>p1p2,f(2)= -1

J=3:K=0,1,2,p0<>p3,p0p1<>p2p3,p0p1p2<>p1p2p3, f(3)=-1

J=4:K=0,1,2,3, p0=p4,p0p1<>p3p4,p0p1p2<>p2p3p4;p0p1p2p3<>p1p2p3p4, f(4)=0

J=5,K=0,1,2,3,4:p0=p5,p0p1=p4p5;p0p1p2<>p3p4p5,p0p1p2p3<>p2p3p4p5,

p0p1p2p3p4<>p1p2p3p4p5 , f(5)=1

J=6,K=0,1,2,3,4,5: p0<>p6,p0p1<>p5p6;p0p1p2<>p4p5p6,p0p1p2p3<>p3p4p5p6

aabba<>bbaac, aabbaa<>abbaac f(6)= -1

J=7,K=0,1,2,3,4,5,6, a<>c, aa<>cc,aab<>acc.aabb<>aacc,aabba<>baacc,aabbaa<>bbaacc

aabbaac<>abbaacc f(7)= -1

J=8,K=0,1,2,3,4,5,6,7, a=a, aa<>ca,aab<>cca,aabb<>acca,aabba<>aacca,aabbaa<>baacca,

aabbaac<>bbaacca, aabbaacc<>abbaacca f(8)=0

J=9,K=0,1,2,3,4,5,6,7,8. a=a,aa=aa,aab<>caa, aabb<>ccaa,aabba<>accaa

aabbaa<>aaccaa,aabbaac<>baaccaa,aabbaacc<>bbaaccaa,aabbaacca<>abbaaccaa

f(9)=1

J=10,K=0~9,a<>b,aa<>ab,aab=aab,aabb<>caab,aabba<>ccaab,aabbaa<>accaab

aabbaac<>aaccaab, aabbaacc<>baaccaab,aabbaacca<>bbaaccaab,

aabbaaccaa<>abbaaccaab. f(10)=2

J=11,K=0~10, a<.b,aa<>bb,aab<>aabb,aabb=aabb,aabba<>caabb,aabbaa<>ccaabb

aabbaac<>accaabb,aabbaacc<>aaccaabb,aabbaacca<>baaccaabb

aabbaaccaa<>bbaaccaabb, aabbaaccaab<>abbaaccaabb

f(11)= 3

综上所述,所求失效函数的值为 (-1,0,-1,-1,0,1,-1,-1,0,1,2,3)

标签集:TAGS:流行 免费 学习 网络管理
回复Comments() 点击Count()

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}