• 1.摘要
  • 2.基本信息
  • 3.基础定义
  • 4.字符串的模式匹配
  • 5.模式匹配的类型
  • 6.KMP模式匹配算法
  • 7.改进的KMP算法
  • 8.算法说明
  • 9.优化
  • 10.代码
  • 11.参考资料

kmp算法

字符串匹配算法

kmp算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作。

它的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。kmp算法的时间复杂度O(m+n)。

基本信息

  • 中文名

    KMP算法

  • 外文名

    The Knuth-Morris-Pratt Algorithm

  • 学科

    数据结构

  • 应用

    字符串匹配

  • 发现者

    D.E.Knuth等

  • 时间复杂度

    O(m+n)

  • 算法基础

    Brute-Force

基础定义

1/4

字符串的模式匹配是对字符串的基本操作之一,广泛应用于生物信息学、信息检索、拼写检查、语言翻译、数据压缩、网络入侵检测等领域,如何简化其复杂性一直是算法研究中的经典问题。字符串的模式匹配实质上就是寻找模式串P是否在主串T 中,且其出现的位置。我们对字符串匹配的效率的要求越来越高, 应不断地改良模式匹配算法,减少其时间复杂度。

KMP算法是由D.E. Knuth、J.H.Morris和V.R. Pratt提出的,可在一个主文本字符串S内查找一个词W的出现位置。此算法通过运用对这个词在不匹配时本身就包含足够的信息来确定下一个匹配将在哪里开始的发现,从而避免重新检查先前匹配的字符。这个算法是由高德纳和沃恩·普拉特在1974年构思,同年詹姆斯·H·莫里斯也独立地设计出该算法,最终由三人于1977年联合发表。该算法减少了BF算法中i回溯所进行的无谓操作,极大地提高了字符串匹配算法的效率。1

字符串的模式匹配

字符串的模式匹配是一种常用的运算。所谓模式匹配,可以简单地理解为在目标(字符串)中寻找一个给定的模式(也是字符串),返回目标和模式匹配的第一个子串的首字符位置。通常目标串比较大,而模式串则比较短小

模式匹配的类型

(1)精确匹配

如果在目标T中至少一处存在模式P,则称匹配成功,否则即使目标与模式只有一个字符不同也不能称为匹配成功,即匹配失败。给定一个字符或符号组成的字符串目标对象T和一个字符串模式P,模式匹配的目的是在目标T中搜索与模式P完全相同的子串,返回T和P匹配的第一个字符串的首字母位置

(2)近似匹配

如果模式P与目标T(或其子串)存在某种程度的相似,则认为匹配成功。常用的衡量字符串相似度的方法是根据一个串转换成另一个串所需的基本操作数目来确定。基本操作由字符串的插入、删除和替换来组成

KMP模式匹配算法

编辑 播报

KMP算法是一种改进的字符串匹配算法,其关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的明  。

求得模式的特征向量之后,基于特征分析的快速模式匹配算法(KMP模式匹配算法)与朴素匹配算法类似,只是在每次匹配过程中发生某次失配时,不再单纯地把模式后移一位,而是根据当前字符的特征数来决定模式右移的位数 。

改进的KMP算法

复旦大学朱洪教授对KMP串匹配算法进行了改进,他主要是修改了next函数,在求 next[j]时,不但要求P[i]=P[j-( next[j]-i)](i=1,2,…, next [j]-1)成立,而且要求P[next[j]]!=p[j]。我们把修改后的next函数计作 Newnext。则计算函数 Newnext值的算法如下

计算函数 Newnext值的算法

算法说明