模式匹配kmp算法理解分析

首先说一下为什么当出现不匹配后,i不变,而j变成next(j)。主串abcabdc……,模式串abcabda。很明显,当i=j=7时,出现不匹配,如果用暴力算法,i回到2。j回到1。其实为了匹配子串,从子串的第一个到最后一个都要匹配,我们从子串第一个字符a可以从主串中看出,当i=1时,主串为a,而下一次i=4时,主串才出现a,也就是说i是可以不经过2和3的。当主串中4为a时,子串中由于7以前都是匹配好的,所以,子串4也为a,假设此时i=4,j=1。再往下一个i=5=b也是和j=2=b匹配的,此刻,利用之前的匹配,可看出j=i=5=b。匹配,。而当i=6=j6=d时!=j3=c。不匹配,所以从子串中就可以看出下一次j!=4。
       再看一个例子,主串abcabcd……,子串abcabca,同样第七个不匹配,前六个都匹配,对应相等下一次子串有可能放在第四个位置,i=4=a处,一一比较,发现主串456和子串123匹配,而第七个由于之前没有匹配成功,我们将可以从此刻再次重视这里,从这里再分析后面匹不匹配i=7了。由于主串子串前六个匹配,所以可以得到子串123和子串456匹配,next(7)=4,有一个重要性质子串1到4-1和子串7前面4-1个,也就是456匹配,其他情况类似,这就是next(j)最重要的一个性质。

        我们来看看如何得到每一个next(j)。我们首先要明确next(j)是子串的一个性质,与主串无关。当next(9)=4时,说明123和678匹配如果9和4相等也就是匹配那么1234和6789匹配,next(10)不就是5吗,即若j(9)=next(j)(4),那么next(j+1)(10)=next(j)+1(5)。
  如果j!=next(j)举个例子123456789中next(9)=6,但9和6的值不匹配那么有12345和45678匹配。。next(6)=4且4和9的值相等,有123和345匹配,联系两式,可以得出123和678匹配,又由于9和4的值相等所以1234和6789匹配,那么next(10)就为5了。这里有j(9)!=next(j)(6)但j(9)=next(next(9)(即6))=4,所以next(j+1)(10)=next(nextj)+1(4+1)=5,!,,
  然后再根据相应代码和书上内容,希望有所帮助理解kmp
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值