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

详细解读KMP模式匹配算法

首先我们需要了解什么是模式匹配? 子串定位运算又称为模式匹配(Pattern Matching)或串匹配(String Matching)。在串匹配中,一般将主串称为目标串,将子串称为模式串。本篇博客...

串的模式匹配算法——KMP

声明 原文链接:http://www.inf.fh-flensburg.de/lang/algorithmen/pattern/kmpen.htm ; 原文的“text”翻译为主串,通常用S表示,...

KMP算法模式匹配

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

KMP模式匹配算法

本文将讲解串匹配中的KMP模式匹配算法及其Java实现。

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

一、朴素模式假设我们要从主串S=”goodgoogle"中找到子串T=“google"的位置,步骤如下:i表示主串的当前位置下标,j表示子串的当前位置下标,如上图在第一轮比较(i=1开始)中j=4和i...

KMP字符串模式匹配详解

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

KMP字符串模式匹配详解

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

KMP算法详解

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

程序员的八重境界

看到一篇有趣的文章The Eight Levels of Programmers。以前似乎看过不少这种程序员的多少个级别、境界,但这篇语言很风趣,而且分类比较细化,让人觉得挺合情合理、无法反驳的。绝大...
  • dc_726
  • dc_726
  • 2017-08-31 04:58
  • 25585
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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