1. KMP算法
KMP算法是一种保证线性时间的字符串查找算法,由Knuth、Morris和Pratt三位大神发明,而算法取自这三人名字的首字母,因而得名KMP算法。
那发明这样的字符串查找算法又有什么用?在当时计算机本身非常昂贵,计算资源更是极其稀缺,而仅仅进行大文本字符查找的响应时间就很长,没法充分利用计算资源。计算机可是拿来算更有意义的事的,光为了找个文本就得浪费这么多时间,不行啊,这得优化啊。1970年,S.Cook在理论上证明了一个某种特定类型抽象计算机理论。这个理论暗示了一种在最坏情况下时也只是与M+N成正比的解决子字符串查找问题的算法。D.E.Knuth和V.R.Pratt改进了Cook证明定理的框架,并提炼为一个相对简单而使用的算法,算法最终在1976年发表。
首先一个例子,这里使用暴力算法进行求解(即每次查找失败时,移动一个位置,一直查找,直到找到完全匹配的字符):其中,文本txt[0:9]=“AAAAAAAAAB”,查找的字符pat[0:4]=“AAAAB”。
- i=0时, txt[0:3]=pat[0:3],而txt[4]≠pat[4],匹配失败
- i=1时, txt[1:4]=pat[0:3],而txt[5]≠pat[4],匹配失败
- ...
- i=4时, txt[4:7]=pat[0:3],而txt[8]≠pat[4],匹配失败
- ...
暴力算法在匹配失败时每次都要回退到开头,而其实是可以避免回退这么多,那么有没有什么方法,在模式匹配失败时进回退一部分呢?
2. KMP原理
KMP算法的主要思想是提前判断重新开始查找的位置,而这种判断方式的生成只取决于模式本身。这里来证明其匹配模式的正确性。
先做以下几个符号定义
- 待查找文本为
,长度为
- 模式字符串为
,长度为
为文本当前所指位置,如
- j为模式串所指位置,如
假设文本和模式串匹配的起始位置为,则有
,即匹配到当前位置时有
。
在匹配过程中,有以下两种情况
- 当
,即大于模式串的长度时,表示文本和模式串完全匹配,这里匹配结束。
- 当
时,表示还在匹配,但发生了失配,接下来主要讨论这种情况。
当

本文深入讲解KMP算法,一种高效的字符串查找算法,由Knuth、Morris和Pratt发明。文章详细介绍了KMP算法的原理,包括如何通过计算模式串的前缀和后缀最大匹配长度来确定最小偏移量,从而避免了暴力匹配算法中的重复工作。
最低0.47元/天 解锁文章
4327

被折叠的 条评论
为什么被折叠?



