KMP算法原理详解_论文解读版

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

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],匹配失败
  • ...

暴力算法在匹配失败时每次都要回退到开头,而其实是可以避免回退这么多,那么有没有什么方法,在模式匹配失败时进回退一部分呢?

brute-force-worst-case
图1 暴力匹配算法

2. KMP原理

KMP算法的主要思想是提前判断重新开始查找的位置,而这种判断方式的生成只取决于模式本身。这里来证明其匹配模式的正确性。
 

先做以下几个符号定义

  • 待查找文本为text[1:n],长度为n
  • 模式字符串为pat[1:m],长度为m
  • k为文本当前所指位置,如text[k]
  • j为模式串所指位置,如pat[j]

假设文本和模式串匹配的起始位置为p+1,则有k=p+j,即匹配到当前位置时有text[p+j]=pat[j]

在匹配过程中,有以下两种情况

  1. j>m,即大于模式串的长度时,表示文本和模式串完全匹配,这里匹配结束。
  2. 1\leqslant j\leqslant m时,表示还在匹配,但发生了失配,接下来主要讨论这种情况。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值