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

字符串匹配,KMP算法

阅读更多
1,算法简介
KMP算法是模式匹配算法的一种改进算法,是D.E.Knuth与V.R.Pratt和J.H.Morris同时发现的,因此人们称它为克努特-莫里斯- 普拉特操作(简称KMP算法)。
2,算法核心
对字串进行预处理.
依靠get_next函数计算出子串中每个字符对应的next[j]的值,从而减少子串回溯的距离,减少时间复杂度。
3,算法性能

简单匹配算法的时间复杂度为O(m*n);可以证明KMP匹配算法的时间复杂度为O(m+n).
4,计算子串的模式函数值.
子串的模式函数值.next[i]有很多版本,这里介绍其中的一种.
定义:
(1)next[0]= -1 意义:任何串的第一个字符的模式值规定为-1
(2)next[j]= -1  意义:模式串T中下标为j的字符,如果与首字符相同,且j的前面的1-k个字符与开头的1-k个字符不等(或者相等但T[k]==T[j])(1≤k).
(3)next[j]=k    意义:模式串T中下标为j的字符,如果j的前面k个字符与开头的k个字符相等,且T[j] != T[k] (1≤k).
(4)其他情况0.

例如:T="abCabCad",对应的函数模式值为
-1: 第一个字符规定为1
0: T[1]前面的字符与开头没有字符相等
0: T[2]前面的字符与开头没有字符相等
-1: T[3]与首字符相同,且j的前面的1-k个字符与开头的1-k个字符不等
0: T[4]的前面1个字符与开头的1个字符相等,但T[4] == T[1]
0: T[5]的前面2个字符与开头的2个字符相等,但T[5] == T[2]
-1: T[6]与首字符相同,T[6]的前面3个字符与开头的3个字符相等,但T[6] == T[3]
4: T[7]的前面4个字符与开头的4个字符相等,且T[7] != T[4]


4,next 函数值究竟是什么含义,前面说过一些,这里总结。
设在字符串S中查找模式串T,若S[m]!=T[n],那么,取T[n]的模式函数值next[n],
(1).next[n]= -1 表示S[m]和T[0]间接比较过了,不相等,下一次比较 S[m+1] 和T[0]
(2).next[n]=0 表示比较过程中产生了不相等,下一次比较 S[m] 和T[0]。
(3).next[n]= k >0 但k<n, 表示,S[m]的前k个字符与T中的开始k个字符已经间接比较相等了,下一次比较S[m]和T[k]相等吗?
(4).其他值,不可能。

5,具体算法如下:
#include<iostream>
#include<string>
using namespace std;

//求模式串T的next函数值并存入数组next[]中。
void getNext(const char* pattern,int next[])
{
   next[0]=   -1;
   int k=-1,j=0;
   while(pattern[j] != '\0')
   {
      if(k!= -1 && pattern[k]!= pattern[j] )
             k=next[k];
      ++j;++k;
      if(pattern[k]== pattern[j])
             next[j]=next[k];
      else
             next[j]=k;
   }
    for(int i=0;i<j;i++)
        cout<<next[i]<<" ";
    cout<<endl;
}

int KMP(const char *Text,const char* Pattern)
{
       if( !Text||!Pattern|| Pattern[0]=='\0' || Text[0]=='\0' )//
              return -1;//空指针或空串,返回-1。
       int len=0;
       const char * c=Pattern;
       while(*c++!='\0') ++len;//字符串长度。
       int *next=new int[len];
       getNext(Pattern,next);//求Pattern的next函数值

       int index=0,i=0,j=0;
       while(Text[i]!='\0' && Pattern[j]!='\0' )
       {
              if(Text[i]== Pattern[j]) ++i,++j; // 继续比较后继字符
              else
              {
                     index += j-next[j]; //主串前进的步伐数 ,连续两次不等,index变为0
                     if(next[j]!=-1) j=next[j]; // 表示子串的前j个与当前的主串匹配.
                     else  j=0,++i; // 表示子串当前的主串根本不匹配,子串从头开始,主串移动到下一个字符.
              }
       }

       delete[] next;
       if(Pattern[j]=='\0')
              return index;// 匹配成功
       else
              return -1;
}


int main()
{
    char* text="bababCabCadcaabcaababcbaaaabaaacababcaabc";
    char*pattern="abCabCad";
    cout<<KMP(text,pattern)<<endl;
	return 0;
}
分享到:
评论

相关推荐

    字符串匹配KMP算法

    字符串匹配 KMP算法

    编程字符串匹配KMP算法的C++实现(ppt)

    编程字符串匹配KMP算法的C++实现(ppt)

    字符串匹配KMP算法讲解

    KMP算法是一种高效的字符串匹配算法,由D.E.Knuth、V.R.Pratt和J.H.Morris三位学者共同提出,其核心思想在于利用已有的部分匹配信息避免在比较过程中不必要的回溯,从而提高效率。在传统的字符串匹配算法中,当主串S...

    C语言实现字符串匹配KMP算法

    字符串匹配是计算机的基本任务之一。 举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”? 下面的的KMP算法的解释步骤 1. 首先,字符串”BBC ABCDAB ...

    KMP字符串匹配算法

    **KMP字符串匹配算法详解** KMP(Knuth-Morris-Pratt)字符串匹配算法是由D.E. Knuth、V.J. Morris和J.H. Pratt三位学者于1977年提出...在实际编程中,理解并运用KMP算法能够有效地解决字符串匹配问题,提高程序性能。

    串的基本操作 kmp算法实现

    串的替换,删除,查找 以及KMP算法的具体的实现 c语言 数据结构

    带通配符的字符串匹配算法

    在IT领域,字符串匹配是计算机科学中的一个基本问题,尤其在文本处理、数据搜索和模式识别等场景中广泛应用。带通配符的字符串匹配算法则是这个领域的延伸,它允许在模式字符串中包含特殊字符,如星号(*)或问号(?),...

    字符串匹配的KMP算法.rar_KMP_KMP算法_kmp 字符串匹配_字符串匹配_文件

    总的来说,KMP算法是一种高效的字符串匹配方法,它通过避免不必要的字符比较和回溯,大大提高了搜索效率。理解并掌握KMP算法,对于从事编程和相关领域的专业人士来说,是提高工作效率和解决问题的关键技能之一。

    KMP字符串模式匹配算法ppt

    KMP(Knuth-Morris-Pratt)字符串模式匹配算法是一种高效的字符串搜索算法,由D.M. Knuth、V. Morris和J.H. Pratt在1970年提出。该算法避免了简单匹配算法中的不必要的回溯,显著提高了在文本字符串中查找模式字符串...

    字符串匹配的KMP算法

    KMP算法,全称为克努斯-莫里斯-普拉特算法,是一种高效解决字符串匹配问题的算法。在计算机科学中,字符串匹配是指在主文本字符串S中寻找目标字符串W的所有出现位置。KMP算法的独特之处在于它能够在不匹配发生时,...

    《字符串模式匹配KMP算法》教学课例设计[归纳].pdf

    《字符串模式匹配KMP算法》教学课例设计 在这篇教学设计中,我们旨在帮助学生掌握KMP字符串模式匹配算法的基本概念和应用。通过本课例设计,学生将了解KMP算法的应用普遍性、实现机制和时间复杂度,并掌握计算next...

    KMP(字符串匹配)算法

    程序开发过程中的字符串匹配算法很多,这里出了算法的程序源代码,包括C#,C++, Delphi代码,大家直接下载就可以拷贝到自己程序中使用。

    KMP(字符串匹配)算法总结

    ##### 1、普通字符串匹配BF算法与KMP算法的时间复杂度比较 KMP算法是一种高效的字符串匹配算法,它对基本的BF算法进行了优化。对于给定的原始串`S`和模式串`T`,目标是找到`T`在`S`中的位置。 **BF算法**(Brute-...

    字符串的模式匹配算法——KMP

    字符串的模式匹配算法在计算机科学中占据着重要的...总之,KMP算法通过构建部分匹配表有效地避免了无效的字符比较,提高了字符串模式匹配的效率。在C++中实现KMP算法,可以方便地将其应用于各种文本处理和搜索任务。

    传统字符串匹配以及kmp算法匹配,包含kmp 导出的Archive file 文件修改jdk可以直接运行

    总结来说,KMP算法是一种高效的字符串匹配方法,它通过部分匹配表避免了不必要的回溯,提高了匹配效率。"DemoZwb"压缩包文件提供了一个实际的KMP算法实现,通过运行和分析这个程序,你可以进一步加深对KMP算法的理解...

    Python实现字符串匹配的KMP算法

    KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的...

    KMP算法:高效字符串匹配算法详解

    KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,由Donald Knuth、Vaughan Pratt和James H. Morris共同发明。KMP算法通过使用一个称为“部分匹配表”或“next数组”的数组来减少字符串匹配过程中的...

    KMP.rar_KMP_KMP算法_visual c_字符串匹配_字符串匹配算法

    KMP算法,全称为Knuth-Morris-Pratt算法,是一种高效的字符串匹配算法,由Donald Knuth、James H. Morris和 Vaughan Pratt三位学者在1970年代提出。该算法在处理字符串匹配问题时,避免了不必要的回溯,极大地提高了...

    算法与数据结构 算法分析课程 第11章 字符串匹配 字符串匹配算法 KMP算法 共11页.pptx

    本章节将重点介绍字符串匹配的基本概念以及两种重要的算法——简单字符串匹配算法和KMP算法。 #### 一、简单字符串匹配算法 简单字符串匹配算法是最基础的一种方法,其基本思想是从文本串的第一个字符开始,逐个...

    字符串匹配的KMP算法浅析

    KMP算法,全称Knuth-Morris-Pratt算法,是一种高效的字符串匹配算法,主要用于在一个文本字符串S内查找一个词W的出现位置。该算法由Donald Knuth、Vaughan Pratt和James H. Morris发明,因此得名。KMP算法的核心在于...

Global site tag (gtag.js) - Google Analytics