KMP模式匹配算法分析与实现

基本概念:

模式匹配是对字符串的一种非常重要的操作,假设被匹配的正文字符串是 text,模式串是pattern,则模式匹配的任务就是在text中找出所有的pattern, 给出pattern在text中的位置。

例如:text是“cdghcdghhcdr”,pattern是“cd”, 则答案是0,4,9(下标计数从0开始)

简单字符匹配:

第1轮:

用pattern的第1个字符与text的第1个字符比较,不等就结束,相等就

用pattern的第2个字符与text的第2个字符比较,不等就结束,相等就 ……

第2轮:

用pattern的第1个字符与text的第2个字符比较,不等就结束,相等就

用pattern的第2个字符与text的第3个字符比较,不等就结束,相等就 ……

……

这种做法非常直观,实际上就是把模式串pattern放到正文text的各个位置逐 一匹配,假设text、pattern的长度分别是m、n,则上述做法总共有m轮,每一轮 比较n次,所以该算法的时间复杂性是O(mn)。

KMP模式匹配:

简单匹配法在一次字符比较失败后,只是向前移动一个位置,丢掉了由前面 已做过的字符匹配的信息,当模式串pattern后面部分与前面部分有重复(匹配 )时,一次可以移动多个位置。

考虑如下例子:

表1

位置i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
正文text c a g a c a g a c a g a t a    
模式pattern a g a c a g a t a              
时间: 2024-11-08 19:13:36

KMP模式匹配算法分析与实现的相关文章

c语言kmp模式匹配如何处理文章,段落

问题描述 c语言kmp模式匹配如何处理文章,段落 小段落,句子可以得到好的反馈,然而段落一长就不行了,不是数组的问题...新手求教...是电脑设置的什么问题 解决方案 等下我把代码发过来,大家帮我看看是什么问题啊.....谢谢

算法研究:字符串的KMP模式匹配

在朴素的模式匹配算法中,主串的pos值(i)是不断地回溯来完成的(见字符串的基本操作中的Index函数).而计算机 的大仙们发现这种回溯其实可以是不需要的.既然i值不回溯,也就是不可以变小,那么考虑的变化就是子串的pos值(j)了 .通过分析发现子串中如果有相等字符,j值的变化就会不相同,也就是说,这个j值的变化跟主串其实没什么关系,关键就 取决于子串的结构中是否有重复的问题. 我们把子串各个位置的j值变化定义为一个数组next,那么next的长度就是 子串的长度(next[0]空置).于是可以

字符串模式匹配之KMP算法图解与 next 数组原理和实现方案

之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下.   KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 i指针,而是利用已经得到的"部分匹配"的结果将模式子串向右"滑动"尽可能远的一段距离后,继续进行比较.如果 ok,那么主串的指示指针不回溯!算法的时间复杂度只和子串有关!很好. KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目

KMP算法

刚看到位兄弟也贴了份KMP算法说明,但本人觉得说的不是很详细,当初我在看这个算法的时候也看的头晕昏昏的,我贴的这份也是网上找的. 且听详细分解: KMP字符串模式匹配详解 来自CSDN     A_B_C_ABC 网友 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算法.可以证明它的时间复杂度为O(m+n).. 一.  简单匹配算法 先来看一个简单匹配算法的函数: int Index_BF ( char S [ ],

大话数据结构十一:字符串的模式匹配(KMP算法)

1. KMP算法简介: kmp算法是一种改进的字符串匹配算法,相比朴素算法,KMP算法预先计算出了一个哈希表,用来指导在匹配过程中匹配失败后尝试下次匹配的起始位置,以此避免重复的读入和匹配过程.这个哈希表被称为"部分匹配值表"(Particial match table),这种设计是KMP算法最精妙之处. 2. KMP算法分析: 下面以阮一峰老师博客中的一篇文章来分析KMP算法的原理:有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否

数据结构例程——串的模式匹配(KMP算法)

本文针对数据结构基础系列网络课程(4):串中第5课时串的模式匹配(KMP算法). 问题:串的模式匹配 KMP算法: #include <stdio.h> #include "sqString.h" void GetNext(SqString t,int next[]) /*由模式串t求出next值*/ { int j,k; j=0; k=-1; next[0]=-1; while (j<t.length-1) { if (k==-1 || t.data[j]==t.d

字符串的模式匹配详解--BF算法与KMP算法_C 语言

一.BF算法    BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符:若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果.    举例说明: S: ababcababa P: ababa BF算法匹配的步骤如下 i=0 i=1 i=2 i=3 i=4 第一趟:ababcababa 第二趟:ababcababa 第三趟:ababcababa 第四趟:ababcab

模式匹配:从BF算法到KMP算法

模式匹配 子串的定位操作通常称为串的模式匹配.模式匹配的应用很常见,比如在文字处理软件中经常用到的查找功能.我们用如下函数来表示对字串位置的定位: int index(const string &Tag,const string &Ptn,int pos) 其中,Tag为主串,Ptn为子串(模式串),如果在主串Tag的第pos个位置后存在与子串Ptn相同的子串,返回它在主串Tag中第pos个字符后第一次出现的位置,否则返回-1. BF算法 我们先来看BF算法(Brute-Force,最基本

大话数据结构十二:字符串的模式匹配(BM算法)

1. BM算法简介: KMP算法其实并不是效率最高的字符串匹配算法,实际应用的并不多,各种文本编辑器的"查找"功能大多采用的是BM算法(Boyer Moore).BM算法效率更高,更容易理解. 2. BM算法分析: (1) 假定字符串为"HERE IS A SIMPLE EXAMPLE",搜索词为"EXAMPLE". (2) 首先,"字符串"与"搜索词"头部对齐,从尾部开始比较.这是一个很聪明的想法,因为如