34|字符串匹配基础(下):如何借助BM算法轻松理解KMP算法?

34|字符串匹配基础(下):如何借助BM算法轻松理解KMP算法?

KMP算法基本原理

KMP算法是根据三位作者(D.E.Knuth,J.H.Morris和V.R.Pratt)的名字来命名的,算法的全称是 Knuth Morris Pratt算法,简称为KMP算法。 KMP算法的核心思想,跟上一节讲的BM算法非常相近。我们假设主串是a,模式串是b。在模式串 与主串匹配的过程中,当遇到不可匹配的字符的时候,我们希望找到一些规律,可以将模式串往后 多滑动几位,跳过那些肯定不会匹配的情况。 还记得我们上一节讲到的好后缀和坏字符吗?这里我们可以类比一下,在模式串和主串匹配的过程 中,把不能匹配的那个字符仍然叫作坏字符,把已经匹配的那段字符串叫作好前缀。
解答开篇&内容小结 KMP算法讲完了,不知道你理解了没有?如果没有,建议多看几遍,自己多思考思考。KMP算法和 上一节讲的BM算法的本质非常类似,都是根据规律在遇到坏字符的时候,把模式串往后多滑动几 位。 BM算法有两个规则,坏字符和好后缀。KMP算法借鉴BM算法的思想,可以总结成好前缀规则。这 里面最难懂的就是next数组的计算。如果用最笨的方法来计算,确实不难,但是效率会比较低。所 以,我讲了一种类似动态规划的方法,按照下标i从小到大,依次计算next[i],并且next[i]的计算通 过前面已经计算出来的next[0],next[1],......,next[i-1]来推导。 KMP算法的时间复杂度是O(n+m),不过它的分析过程稍微需要一点技巧,不那么直观,你只要看 懂就好了,并不需要掌握,在我们平常的开发中,很少会有这么难分析的代码。

你可能感兴趣的:(34|字符串匹配基础(下):如何借助BM算法轻松理解KMP算法?)