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

KMP算法:基于自动机的理解

阅读更多

 

KMP 算法学习总结

 

KMP 算法看似简单,其实想要完全理解还是有困难的。

 

KMP 其实可以搜索过程可以看成是一个自动机,分为 2 部分,第一部分自动机的构造 ( 对应一般的说法就是失效函数,转移函数, overlap 函数 ) ,第二部分在自动机上搜索过程。

举个例子: 目标串味 T = acabaabaabcacaabc; 模式串 P=abaabcac

 

第一步:根据模式串构造自动机

向前的箭头表示搜索前进的方向。向后的箭头表示不匹配的回溯,即失效函数,或者状态变迁函数。例如:

  f(j=1) = 0;

  f(j=2) = 0;

  f(j=3) = 1;

  f(j=4) = 1;

f(j=5) = 2;

f(j=6) = 0;

f(j=7) = 1;

 

 

 

 

 

 

 

 

假如已经构造出该自动机,那么匹配算法用伪代码描述如下:

KMP-Search

  int j = 0;   // 指示当前自动机所在状态

  int i;     // 指示目标串匹配过程中的位置

  int n;    // 目标串的长度

  int m;  // 模式串的长度

  for(i =0; i < n; i++) {       // 对目标串进行匹配

         for(;;) {

             if( T[i] == pattern[j] ) {

                  j++;

                 if ( j == m) {

  found a match // 找到一个匹配

j = overlap(j);   // 再找下一个匹配

}

                   break;

   }

            else if( j == 0 )   break;    // 如果没有与 T[i] 匹配,直接 i+1

            else j = overlap(j);   // 匹配了一部分出错的,根据箭头的指向回溯

}

}

 

接下里,就是对失效函数的构造,

KMP-Table

overlap(Pattern pattern)

{

   初始化 overlap 用来存放失效函数的值 ;

       overlap [0] = -1; overlap [1] = 0;

   Int j = 2;                                  // 状态机的位置

   Int cnd;                                 // 当前回溯的位置

   While j < m

   {

       If( pattern[ j -1 ] == pattern[cnd])        // 当前匹配成功 , 移到下一个位置,

          overlap [j] = cnd +1 ; cnd++; j++;

       Else if( cnd > 0 )  cnd = overlap [cnd];   // cnd > 0 说明匹配了一部分后遇到不匹配, // 根据箭头方向回溯,重新匹配;

       Else overlap[j] = 0; j++;               // cnd = 0 说明当前不匹配

}

Return overlap

}

 

 

算法实现:

#include <iostream>
using namespace std;

/**
*KMP-Table
*input: pattern 
*output : overlap[]
*/
void kmp_table(const char * P, int * overlap)
{
	overlap[0] = -1;
	overlap[1] = 0;
	unsigned int j = 2;
	int cnd = 0;

	while(j < strlen(P))
	{
		if( P[j-1] == P[cnd])
		{
			overlap[j] = cnd + 1;
			++j;
			++cnd;
		}
		else if( cnd > 0)
			cnd = overlap[cnd];
		else 
		{
			overlap[j] = 0;
			++j;
		}
	}
}

/**
*KMP_Search
*input: char * Target ;  char * Pattern:
*output ; the position of the Pattern in Traget;
**/
int kmp_search(const char * T, const char * P)
{
	int n = strlen(T);
	int m = strlen(P);
    int * overlap = new int[m];
    int j = 0;

	kmp_table(P,overlap);

	for( int k = 0; k < m; k++)
	{
		cout<<overlap[k]<< "" ;
	}
	cout<<endl;

	for( int i = 0; i < n; i++)
	{
		for(;;)
		{
			if( T[i] == P[j])
			{
				j++;
				if(j == m)
					return i-m + 1  ;
				break;
			}
			else if(j == 0) break;
			else
			{
				j = overlap[j];
			}
		}
	}
	return -1;
}

int main()
{
	char * S = "acabaabaabcacaabc";
	char * W = "abaabcac";

	int p = kmp_search(S,W);

	cout<<"p = "<< p <<endl;
}

 

分享到:
评论

相关推荐

    KMP算法 AC自动机.ppt

    ### KMP算法与AC自动机知识点详解 #### KMP算法概览 KMP算法是一种高效的字符串匹配算法,其全称为Knuth-Morris-Pratt算法,由Donald E. Knuth、Vaughan Pratt以及James H. Morris三位计算机科学家共同提出。该...

    自动机理论,KMP算法等

    总的来说,自动机理论和KMP算法是计算机科学教育中不可或缺的部分,它们提供了对计算能力的基本理解,并培养了分析和解决问题的能力。随着技术的发展,这些理论知识将继续为新的研究和创新提供坚实的基础。

    字符串多模匹配算法之AC自动机理解心得.doc

    Failure Function 或 Failure Link),使得在匹配过程中,一旦当前字符无法匹配,能够迅速跳转到下一个可能匹配的位置,避免了对每个模式串单独进行KMP等单模匹配算法的多次回溯。 1. 字典树的构造: - 构建字典树...

    模式匹配 经典算法详解

    为了更深入地学习这两种算法,可以参考《AC自动机.doc》和《KMP算法详解.doc》文档,它们应该提供了详细的理论解析、实例演示以及实现代码,帮助你更好地理解和掌握这两种模式匹配的经典算法。在阅读和实践过程中,...

    串KMP算法的作业

    这是我上实验课时候做的KMP算法,基本实现了串的一些基本功能

    基本字符串全家桶(Hash,KMP,Trie,AC自动机)

    本文将深入探讨四种重要的字符串处理技术:哈希(Hash)、KMP算法、Trie树(字典树)以及AC自动机。这些都是在解决字符串匹配问题时常用的方法,它们各有优缺点,适用于不同的场景。 1. **哈希(Hash)**: 哈希是...

    从头到尾彻底理解KMP(2014年8月22日版)

    本文由July撰写,并在2014年8月22日完成,旨在提供一个清晰、完整的KMP算法理解框架。 ### 算法内容 #### 1. 暴力匹配算法 暴力匹配算法是一种基础的字符串匹配方式。其基本思想是将文本串S与模式串P进行对比,...

    使用自动机的高效多模式匹配算法

    本文将深入探讨一种基于自动机的多模式匹配算法。自动机,尤其是有限状态自动机(FSM),在处理字符串模式方面展现出了强大的性能。常见的自动机有确定有限状态自动机(DFA)和非确定有限状态自动机(NFA)。DFA对每...

    KMP算法详解

    KMP算法实际上是在构建一个有限状态自动机(FSM),用来识别模式串。每个状态代表模式串的一部分,而状态之间的转换则是由next数组决定的。这种自动机的构建使得匹配过程能够在不回溯的情况下完成,极大地提高了效率。...

    字符串匹配_kmp_extend-kmp_trie_suffix-array

    在给定的标题和描述中,提到了几种不同的字符串匹配方法:KMP算法、AC自动机与Trie树以及后缀数组。接下来,我们将详细讨论这些算法。 1. **KMP算法**: KMP(Knuth-Morris-Pratt)算法是一种高效的单串匹配算法,...

    C++常用算法模板.pdf

    这些代码片段展示了四种不同的字符串处理算法在C++中的实现,分别是KMP算法、Trie树、Karp-Rabin算法和AC自动机。下面将分别解释这些算法以及它们在给定代码中的应用。 1. KMP算法: KMP(Knuth-Morris-Pratt)算法...

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

    考虑一个仅包含三个字符(A、B、C)的模式串,我们可以构造一个有限状态机流图来辅助理解KMP算法的工作原理。例如,对于模式串"ABABABCB",可以通过构建相应的流图来直观地展示匹配过程中的状态转换。 #### 总结 ...

    ;;;kmp的多种算法

    在理解KMP算法之前,首先需要了解字符串中的前缀和后缀的概念。对于一个字符串s,其前缀是指s的任意开头连续子串,而后缀则是指s的任意结尾连续子串。例如,字符串“ABCD”的所有前缀包括“”、“A”、“AB”、“ABC...

    ACM算法模板(分享)

    - KMP算法:不回溯的模式匹配算法。 - Rabin-Karp算法:滚动哈希实现的模式匹配。 - Boyer-Moore算法:坏字符规则和好后缀规则提高效率。 - AC自动机:处理多个模式串的匹配。 6. **数据结构**: - 树结构:...

    深入理解Aho-Corasick自动机算法1

    **深入理解Aho-Corasick自动机算法** Aho-Corasick自动机(简称AC自动机)是一种在字符串搜索中非常高效的算法,尤其在处理多个模式串匹配时。该算法由Aho和Corasick在1975年提出,它结合了Trie树和KMP算法的优点,...

    AC自动机详解+例题详解

    AC自动机主要用于解决在一个主文本中寻找多个模式串的问题,相比于传统的单模式匹配算法(如KMP算法),AC自动机在处理多个模式串时具有更高的效率。 #### 二、AC自动机与多模式匹配 ##### 多模式匹配定义 多模式...

    串匹配算法

    串匹配算法 1 第一章 引言 2 第一节 2 第二节 2 第二章 精确串匹配算法 3 引论 精确串匹配算法的分类 3 ...5.kmp算法 47 A 6 自动机算法 47 A 7 bom 算法 48 A 8 shift-or 算法 50 A 9 BNDM算法 51 A 10 哈希法 51

    算法文档无代码多串匹配算法及其启示

    - 常见的多串匹配算法包括:AC自动机、后缀树、后缀数组、KMP算法等。 - 这类算法广泛应用于文本编辑器、搜索引擎、生物信息学中的基因序列匹配等场合。 2. 算法文档: - 算法文档是指对某个算法的描述、原理、...

    AC自动机实现多模式串匹配,支持中文

    它的核心思想是构建一个自动机结构,该结构能够在一次遍历文本的过程中,同时匹配多个模式串,大大提高了搜索效率,避免了对每一个模式串单独进行KMP或BF(Brute Force)等算法的重复工作。 AC自动机的基本构造过程...

    各种字符串匹配算法--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