KMP算法的关键思想总结
kmp算法的核心在于其优化了模式匹配失配时的开销,在BF算法中失配时直接将主串指针回溯至开始本次匹配的下一个位置,这样使得失配开销略大,效率不高。
而kmp算法通过分析子串的结构,对子串失配时的情况进行了简单分析,以O(n+m)的时间复杂度替换了O(n*m)的时间复杂度,优化了模式匹配的性能。那么kmp算法是如何做到这一点的呢?
其要点在于:kmp算法对子串的前后缀进行了简要分析,举个例子:
主串 EKKLABCDEFGH666ABCDEFGHABCDEFGHPPJGABCDPPHMBVRTTY
子串 ABCDEFGH666ABCDEFGHPP
显然匹配到P处时失配,若是BF算法,则此时要将主串回溯至(EKKLA)B,我们会认为这种处理稍显笨拙,于是我们分析子串的前后缀发现,其最大相等前后缀为ABCDEFGH,长度为8,这给我们一个提示:既然串首和串尾有一部分是重复的,那么我们还需要回溯重新比较吗?当然不用,我们直接找到最大长度的重复串然后只进行子串移动就完美解决了,于是我们不用再回溯主串,直接将子串移动到这里:
主串 EKKLABCDEFGH666ABCDEFGH666ABCDEFGHPPJGABCDPPHMBVRTTY
子串 ABCDEFGH666ABCDEFGHPP
毫无疑问这会大大提升算法的效率,在对处理从外设输入的庞大文件很有效,可以边度如边匹配,而无需回头重读。
下面介绍一下next数组的计算方法:
1.首先