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

0.简介

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

1.字符串匹配

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

数据结构---KMP算法(1)_第1张图片 匹配

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

数据结构---KMP算法(1)_第2张图片 新方案

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

数据结构---KMP算法(1)_第3张图片 寻找自身匹配

就是图中两个方框中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串的这里做 预测。将信息最大化利用了,这也是算法优化的一种思想。

你可能感兴趣的:(数据结构与算法)