数据结构---KMP算法(1)

0.简介

KMP算法,在方法上是一个比较难理解的,以前我只是记住了算法的具体步骤,不理解其中原理,久而久之就忘记了算法具体怎么做了,最后只留下了KMP这三个字母。学习算法的目的可以有好多种,可以应付应用,可以应付考试,还可以学习细想,形成思维方式。本篇只介绍思想,不做实现。

1.字符串匹配

假设A为主串,B为匹配串,普通的匹配方法就是在A中去找B,并且一旦有一个字符不匹配,B就向后移动一次。

匹配

那么,可不可以一次就将B串移动到一个更好的位置上呢,当然是可以的。

新方案

我们假定图中字符串某次匹配到d字符匹配失败,我们希望将B串的开头移动到后面字符a开始的地方,那么我们就得提前知道在B的abcab部分中,开头的a和串中哪个位置的a能匹配的最长。

寻找自身匹配

就是图中两个方框中ab的位置,也就是在匹配算法开始之前,串B对于自身的不同位置应该如何最大匹配有了预先的计算,当匹配到d时候,发现匹配失败,然后串abcab中,我们预先知道了开头的a移动到第四位上的a是最佳选择,这个最佳选择是通过计算abcab串的开头和结尾匹配最长结果选的,也就是每次分别从开头和结尾取一样长度的字符串,比较是否一致,选最长的,

a  b

ab  ab

abc   cab

abca   bcab

我们发现ab和ab是匹配的,也就是说将开头的a移动到第四位开头的a的位置就可以了。

那么为什么不移动到,后面两个a的位置?因为此时还没有比较到后面的a,我们只是假设比较多到d就匹配失败了,所以直接跳到后面的a会导致字符串匹配不全。

2.总结

觉得说了一堆,还是说不清,主要思想就是,预先计算出串B的最佳移动方式,而这个最佳移动方式是串B根据自身的情况,来计算的,有效也是因为B串开始到d字符截止之前,串A和串B的重叠部分是相同的,那么对B串的这部分做预测就是对A串的这里做 预测。将信息最大化利用了,这也是算法优化的一种思想。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值