字符串模式匹配算法--详解KMP算法

原创 2014年10月26日 10:14:54

   在软考的复习中,看到过几次  字符串的模式匹配算法。看起来挺难的。所以花了点时间查了查关于字符串匹配的算法。下面详细介绍一下KMP模式匹配算法

 

什么是字符串的匹配?

    在文章中进行查找。需要找到要查找的内容所在的位置。就是字符串的匹配。

 

朴素的模式匹配算法

   朴素的模式匹配算法,就是把要查找的内容,一步步的与要查找的文章进行进行比较。如果匹配失败,则主串和字串回溯。字串位置加1.重新匹配。

 

模式匹配算法的流程如下:

在匹配失败的情况下,模式串仅右移一个之后。在从头开始匹配。

 

 

两个for循环

For i=1 to length(主串)-length(模式串)+1

   For j=1 to length(模式串)

 

所以时间复杂度为:O((n-m+1)*m)  在模式串较小的情况下,时间复杂度为O(mn)

 

 

KMP匹配算法:

 

在看这个例子的时候,如果匹配失败。令模式串右移一个位置。重新开始匹配。这种情况。主串与模式串的指针都要回溯。

 

   在朴素的匹配算法中,无论已经匹配正确了多少个字符,在遇到不配的情况下,指针就要进行回溯。重新开始下一轮匹配。这样就会造成资源的浪费。

 

KMP算法,就是消除这种浪费。KMP算法利用已经匹配好的部分字符串

 

用一个例子来说明,是如何利用已经匹配的字符串的。

c匹配失败。但是前面已经有匹配成功的子串为“abaaba“  所以  要利用这个已经匹配好的字符串。

只有在这种情况下,右移才能最大化。才能使得指针不用回溯。

 

在已经匹配成功的子串中。是如何求出最大偏移量呢?

 

可以利用的子串:

在这就要使用,字符串的前缀 和后缀了。

 

比如字符串“ABCDE”的

   前缀:A、AB、ABC、ABCD

   后缀:E、DE、CDE、BCDE

 

只要找到,前缀和后缀中 相同的部分。就是可以利用的部分。

 

例子中:

   abaaba前缀:a、ab、aba、abaa、abaab

   abaaba后缀:a、ba、aba、aaba、baaba

 

找到前缀和后缀中的公共部分长度最大的为"aba"  所以要利用的串为"aba"。

 

模式串的右移量:

利用已经匹配好的字符串,来确定子串右移的位数。利用next函数。

 

根据以上的描述,指针一直向右,不回溯。所以要匹配的长度为m+n

所以KMP算法的时间复杂度为:O(m+n)

 

 

 

KMP匹配算法中,常常看到。一个next函数:

形式如:

在模式串  abaabaca中。对应的next串为:01122341

 

Next[j]表示,在j匹配出错之后。要利用前面的子串,所能使用的子串长度+1。

 

至于next[j]表示的是什么。查了好多也不知道干什么用的。如果读者对next函数有了解,请留言。

 

 

参考博客:

http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

 

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

KMP算法详解

KMP算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,其对于任何模式和目标序列,都可以在线性时间内完成匹配查找,而不会发生退化,是一个非常优秀的模式匹配算法。但是相较于其他模式匹...

详细解读KMP模式匹配算法

首先我们需要了解什么是模式匹配? 子串定位运算又称为模式匹配(Pattern Matching)或串匹配(String Matching)。在串匹配中,一般将主串称为目标串,将子串称为模式串。本篇博客...
  • FightLei
  • FightLei
  • 2016年09月30日 16:54
  • 11115

KMP算法模式匹配

在一个长串中查找一个子串是较常用的操作。各种信息检索系统,文字处理系统都少不了。本文介绍一个非常著名的KMP模式匹配算法用于子串查找...

KMP字符串模式匹配详解

     个人觉得这篇文章是网上的介绍有关KMP算法更让人容易理解的文章了,确实说得很“详细”,耐心地把它看完肯定会有所收获的~~,另外有关模式函数值next[i]确实有很多版本啊,在另外一些面向对象...
  • lin_bei
  • lin_bei
  • 2006年09月20日 10:27
  • 53610

数据结构- 串的模式匹配算法:BF和 KMP算法

Brute-Force算法的思想 1.BF(Brute-Force)算法   Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字符起和模式串t的第一个字符进行比较...
  • hguisu
  • hguisu
  • 2012年06月20日 10:57
  • 24002

史上最浅显易懂的KMP算法讲解:字符串匹配算法

KMP算法是一种改进后的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法)。 KMP算法又称“看毛片”算...

字符串模式匹配算法之一:朴素模式匹配算法

被搜索的字符串称为主串,待搜索的字符串称为模式串。朴素模式匹配算法的基本思想: 对主串的每一个字符作为子串开头,与模式串进行匹配。对主串做大循环,每个字符开头做模式串长度的小循环,直到匹配成...
  • chfe007
  • chfe007
  • 2015年02月03日 13:35
  • 1756

ACM-字符串-模式串匹配-KMP算法

KMP

KMP算法 串的模式匹配算法优秀总结

转载大神的博客受益匪浅 这几天学习kmp算法,解决字符串的匹配问题,开始的时候都是用到BF算法,(BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符...

数据结构——串(朴素的模式匹配算法、KMP模式匹配算法)

提示:以下内容不适合零基础人员,仅供笔者复习之用。 概要: 串是由零个或多个字符组成的有限序列,又名叫字符串。 一、串的比较     给定两个串,s = "a1a2.....an",t="b1...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符串模式匹配算法--详解KMP算法
举报原因:
原因补充:

(最多只允许输入30个字)