26 123
发新话题
打印

KMP模式匹配算法的问题

KMP模式匹配算法的问题

那个失效函数搞不太懂...哪位指点一下?谢谢

[em04]

TOP

我现在也正在看这个算法,也搞不大清楚。
************* 宝剑锋从磨砺出, 梅花香自苦寒来。 *************

TOP

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

aabbaaccaabb

abcdcbabcdcba

abacadacaba

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

************* 宝剑锋从磨砺出, 梅花香自苦寒来。 *************

TOP

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

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

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

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

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

多多交流.多多关照.

TOP

KMP算法详细求解

以下是引用恒翔在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)

晕,计算太麻烦,不知道有没有粗心的地方,请楼上自己再算一下.

[em06][em06][em06]

[此贴子已经被作者于2004-10-8 17:31:29编辑过]

多多交流.多多关照.

TOP

理解这个算法好的方法就是画个图表,根据算法走一个简单的流程,再回过头去看算法,如此往复。把你的大脑当成计算机去运行一下这个算法程序,其中图表会帮助你理解的,呵呵

TOP

好问题,精华收藏

多多交流.多多关照.

TOP

呵呵,我还没想过这个算法,今天想想
骑着小猪学VC~~~~~~~~

TOP

呵呵,用程序设计语言来做倒真的是要比手工快多了,

如果这个子串相当长,那这个推算的过程用计算机就较好一些了.

还有,关于递推公式求F(j)的方法也应该不错.

[em05]
多多交流.多多关照.

TOP

太感激了,

书中对Next得函数的定义如下:

(1) j =1 时 Next[j] = 0

(2) {k|1<k<j 且 'p1....pk-1' = ' pj-k=1...pj-1'}此集合不空时。Next[j] = max{k|1<k<j 且 'p1....pk-1' = ' pj-k=1...pj-1'}

(3) 其它情况 Next[j] = 1

************* 宝剑锋从磨砺出, 梅花香自苦寒来。 *************

TOP

 26 123
发新话题