字符串匹配算法(二)-KMP算法

   KMP算法是由大牛D.E.Knuth与V.R.Pratt和J.H.Morris同时发现的,主要是针对BF算法中很多重复比较的改进。BF算法中,每次匹配不成功就往右移动一个字符,接着比较。其实我们大可以利用已经比较过相同的那段字符串的信息,最大可能的往前移动,省略掉不必要的重复比较。

    可能的情况有两种:

  (1)第一种情况。主串T=“cddcdc”、模式串P=“cdc”的模式匹配过程为:当T0=P0,T1=P1,T2≠P2时,算法中下一次的比较位置为i=1,j=0,即下来比较T1和P0。但是因P0≠P1,而T1=P1,所以一定有T1≠P0。所以此时比较T1和P0无意义,实际上随后可直接比较T2和P0。

  (2)第二种情况。主串T=“abacabab”、模式串P=“abab”的第一次匹配过程如图4-5所示。此时有T0=P0=’a’,T1=P1=’b’,T2=P2=’a’,T3≠P3。因有P0≠P1,T1=P1,所以必有T1≠P0。又因有P0=P2,T2=P2,所以必有T2=P0,因此下来可直接比较T3和P1

   KMP算法思想:

   模式串中是否存在可相互重叠的最长前缀串,只与模式串自身有关,与主串无关。T=“t0t1…tn-1”,子串P=“p0p1…pm-1”,可以首先计算出模式串t中每个字符的最大真子串的字符个数k。当模式匹配比较到ti≠pj(0≤i<n,0≤j<m)时,随后要比较的主串的下标值不变,模式串的下标值即为k。

   KMP步骤:

   模式串P开头的任意个字符,把它称为前缀子串,如p0p1p2…pm-1。在P的第i位置的左边,取出k个字符,称为i位置的左子串,即pi-k+1... pi-2 pi-1 pi。求出最长的(最大的k)使得前缀子串与左子串相匹配称为,在第i位的最长前缀串。定义为模式串的next[j]函数。模式串的next[j]函数定义如下:

 Next函数计算

 

 

 

 

 


next函数可以在匹配前构造,只要已知模式串,最后具体的匹配就很简单了,根据next函数找到第j位置不相同时,模式串往前移动的距离k.....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值