`
zhangyu8374
  • 浏览: 94591 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基本算法连载(9)-模式匹配之KMP(Knuth-Pratt-Morris)

阅读更多
KMP算法,在《数据结构》课上听过,似是非懂,读完大学后全忘光了。Brute-Force算法,简单,谁都知道。从主串S的第pos个字符起与模式串进行比较,匹配不成功时,从主串S的第pos+1个字符重新与模式串进行比较。如果主串S的长度是n,模式串长度是m,那么Brute-Force的时间复杂度是o(m*n)。最坏情况出现在模式串的子串频繁出现在主串S中。虽然它的时间复杂度为o(m*n),但在一般情况下匹配时间为o(m+n),因此在实际中它被大量使用。
前几日,重新拾起了KMP算法,然后向MM讲解之。KMP的主要思想是:每当一趟匹配过程中出现字符比较不等时,不需回溯主串S的指针,而是利用已经得到的“部分匹配”结果将模式串向右“滑动”尽可能远的一段距离后,继续进行比较。
模式串到底向右滑动多少,在KMP算法中是用一个数组来存储的。针对模式串中的每个索引j,都将有一个对应的值。此值的含义为模式串中位置从0到j-1构成的串中所出现的首尾相同的子串的最大长度加1。
下面给出具体实现:
/*
* n is the length of text,while m is the length of pattern.
* And pos which is zero-indexed is the start point of search.
*/
int kmp(char* text,int n,char *pattern,int m,int pos){
int i,j;
//Generate the array of next
int* next = (int*)malloc(m*sizeof(int));
i = 0;
j = -1;
next[i] = j;
while(i<m){
if((j==-1) || (pattern[i]==pattern[j])){
i++;
j++;
if(pattern[i]!=pattern[j])
next[i] = j;
else
next[i] = next[j];
}else{
j = next[j];
}
}

int k = 0;
for(k=0;k<m;k++)
printf("next:%d\n",next[k]);

//Search
i = pos;
j = 0;
while(i<n&&j<m){
if((j==-1) || (text[i]==pattern[j])){
i++;
j++;
}else{
j = next[j];
}
}
if(j==m)
return i-m;
else
return 0;
}
KMP算法的时间开销包括两部分,一个是求next数组元素的值,此时的时间开销是o(m);一个是搜索,此时的时间开销是o(n)。因此,它的时间复杂度是o(m+n)
分享到:
评论

相关推荐

    Knuth-Morris-Pratt(KMP)算法(字符串匹配)

    其中,Knuth-Morris-Pratt(KMP)算法是一种高效的字符串匹配算法,由Donald Knuth、James H. Morris和Vaughan Pratt共同提出。此算法能够有效地避免传统方法中重复计算的问题,从而将搜索效率提升至线性级别。 #### ...

    KMP算法(Knuth-Morris-Pratt算法

    kmp算法 KMP算法(Knuth-Morris-Pratt算法

    KMP算法(Knuth-Morris-Pratt算法)

    KMP算法(Knuth-Morris-Pratt Algorithm)是一种改进的字符串匹配算法,由D.E.Knuth、J.H.Morris和V.R.Pratt提出。该算法的核心思想是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数,以达到快速匹配的目的...

    KMP(Knuth-Morris-Pratt)算法是一种字符串匹配算法

    KMP算法,全称为Knuth-Morris-Pratt算法,是计算机科学中一种高效的字符串匹配算法,由唐纳德·克努斯、维尔莫特·莫里斯和弗兰克·普拉特在1970年提出。该算法主要用于在一个文本串中查找一个模式串(即目标字符串...

    KMP_Knuth-Morris-Pratt.rar_KMP_pratt.rar

    KMP(Knuth-Morris-Pratt)算法正是解决这一问题的一种经典方法。本文将深入探讨KMP算法的原理、实现以及它在实际应用中的价值。 1. KMP算法简介 KMP算法是由Donald Knuth、 Vaughan Pratt和James H. Morris三位...

    KMP算法,全称Knuth-Morris-Pratt字符串搜索算法,是一种线性时间复杂度的字符串匹配算法

    KMP算法,全称Knuth-Morris-Pratt字符串搜索算法,是一种线性时间复杂度的字符串匹配算法。它的主要思想是在发生不匹配时,能知道部分已经匹配的字符序列的后缀和模式串的前缀存在重复,因此可以利用这些信息避免...

    数据结构(C语言)--模式匹配--KMP算法

    KMP(Knuth-Morris-Pratt)算法是解决这个问题的一种高效方法,尤其适用于在长字符串中查找重复或特定的子串。 KMP算法是由D.E. Knuth、V.R. Morris和J.H. Pratt三位学者在1970年代提出的。它的核心思想是避免了在...

    模式匹配的一种改进算法----KMP算法

    KMP 算法是一种改进的模式匹配算法,由 D.E.Knuth、V.R.Pratt 和 J.H.Morris 共同发现,因此也称为克努特-莫里斯-普拉特算法。该算法可以在 O(n+m) 的时间数量级上完成串的模式匹配操作。 KMP 算法的改进在于:每当...

    KMP(Knuth-Morris-Pratt)算法简介及C语言实现.docx

    ### KMP(Knuth-Morris-Pratt)算法详解及C语言实现 #### 一、KMP算法概述 KMP算法是由Donald Knuth、James H. Morris和Vaughan Pratt三位计算机科学家共同提出的,它是一种高效的字符串匹配算法,主要用于在一个主...

    KMP 算法,即 Knuth-Morris-Pratt 算法,是一种用于字符串匹配的经典算法 与朴素的字符串匹配算法相比,KMP

    KMP 算法,全称 Knuth-Morris-Pratt 算法,是一种经典的字符串匹配算法。相较于朴素的字符串匹配方法,KMP 算法通过减少不必要的字符比较次数,大大提升了在大型文本中查找模式串的效率。本文旨在详细介绍 KMP 算法...

    KMP算法,全称Knuth-Morris-Pratt算法,是一种线性时间复杂度的字符串匹配算法.pdf

    KMP算法,全称Knuth-Morris-Pratt算法,是一种高效的字符串匹配算法。它的主要应用场景是在一个较大的文本字符串(通常称为“主串”)中查找一个较小的字符串(称为“模式串”)。这种查找在文本编辑器、搜索引擎、...

    模式匹配,KMP算法,string-match-kmp-master.zip

    KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,由D. Knuth、V. Morris和J. Pratt在1970年代提出。本项目"string-match-kmp-master.zip"显然专注于介绍和实现KMP算法。 KMP算法的主要目标是在一个大的...

    kmp(Knuth–Morris–Pratt Algorithm)算法讲解

    KMP(Knuth-Morris-Pratt)算法是一种改进的字符串匹配算法,用于在一个文本字符串(T)中查找一个词(W)的出现位置。KMP算法的核心在于当字符串匹配发生不一致时,能知道已经部分匹配这个有效信息,利用这个信息...

    kmp模式匹配算法

    KMP(Knuth-Morris-Pratt)模式匹配算法是一种在主串(目标字符串)中查找子串(模式字符串)的高效算法,由D.E. Knuth、V.R. Morris和J.H. Pratt于1977年提出。相较于简单的暴力匹配方法,KMP算法在模式匹配过程中...

    字符串处理- 单模式匹配- MP 算法与 KMP 算法.rar

    MP算法(Manacher's Algorithm)和KMP算法(Knuth-Morris-Pratt Algorithm)都是高效的单模式匹配算法,它们避免了不必要的字符比较,从而提高了搜索效率。下面将详细讲解这两种算法。 首先,我们来看KMP算法。KMP...

    各种字符串匹配算法--BM,KMP等

    在这个话题中,我们将深入探讨几种经典的字符串匹配算法,包括Bad Character Heuristic(BM算法)和Knuth-Morris-Pratt(KMP算法)。 **Bad Character Heuristic (BM算法)** BM算法是由Sunday和Sunday在1977年提出...

Global site tag (gtag.js) - Google Analytics