KMP算法的学习心得

今天看了半天的KMP算法,算法看完后不是很难,但是觉得,为什么knute能想到,我为什么想不到呢,

所以把ouKMP算法琢磨了半天,首先应该想到的有:我们必须利用曾经得到的信息。

当模式匹配时,主字符串并不需要回指针,而只需要将模式的往右移动,但问题是,往右移动距离怎么算,这其实不难想到,当模式的第j个字符与主串中的第i个字符不等时,我们得到的数据有前j-1个,可以充分利用这个信息。假设往右移动模式使得模式的第k个字符与主串的第i个字符进行比较,则此时,前k-1个字符应该与j-k+1到j-1的k-1个字符是相等的。这样我们设一数组,用于保存这些信息,next【j】 = k;即当第j个字符与主串某个字符不等时,则将模式往右移动使得第k个字符与主串第i个字符进行比较,这里还要考虑的一个问题是,当第j个字符与第k个字符相等时,则将next[j] = next[k];

具体的算法描述如下

设next[j]= k;

p(i)代表模式里的第i个字符,则有:p(0)...p(k-1) = p(j-k)...p(j-1)

当p(j) = p(k)时,则next[j+1]  = k+1;

否则应该考虑一段更短的字符串,假设为k1【如果p(k1) != p(j),则继续找,知道有相等的为止】。则此时这个长度为k1的子字符串,应该有,p(0)...p(k1-1) = p(j-k1)...p(j-1),

而有前面可知,p(j-k1)...p(j-1) = p(k-k1)...p(k-1),继而有:p(0)...p(k1-1) = p(k-k1)...p(k-1)

所以上面k1 应该为:k1 = next[k];【求k1的过程是个递归的过程】

算法很简单,关键是为什么这样,原创者为什么能想到这个想法,而我就想不到!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值