kmp

转载 2012年03月23日 11:35:37

转自:http://duanple.blog.163.com/blog/static/709717672009825004092/

kmp

  首先这个匹配算法,主要思想就是要充分利用上一次的匹配结果,找到匹配失败时,模式串可以向前移动的最大距离。这个最大距离,必须要保证不会错过可能的匹配位置,因此这个最大距离实际上就是模式串当前匹配位置的next数组值。也就是max{Aj 是 Pi 的后缀 j < i},pi表示字符串A[1...i],Aj表示A[1...j]。模式串的next数组计算则是一个自匹配的过程。也是利用已有值next[1...i-1]计算next[i]的过程。我们可以看到,如果A[i] = A[next[i-1]+1] 那么next[i] = next[i-1],否则,就可以将模式串继续前移了。

  整个过程是这样的:

void next_comp(char * str){
   int next[N+1];
   int k = 0;
   next[1] = 0;
   //循环不变性,每次循环的开始,k = next[i-1]
   for(int i = 2 ; i <= N ; i++){
      //如果当前位置不匹配,或者还推进到字符串开始,则继续推进
      while(A[k+1] != A[i] && k != 0){
           k = next[k];
      }
      if(A[k+1] == A[i]) k++;
      next[i] = k;
   }
}

  复杂度分析:从上面的过程可以看出,内部循环再不断的执行k = next[k],而这个值必然是在缩小,也就是是没执行一次k至少减少1;另一方面k的初值是0,而最多++ N次,而k始终保持非负,很明显减少的不可能大于增加的那些,所以整个过程的复杂度是O(N)。

  上面是next数组的计算过程,而整个kmp的匹配过程与此类似。

KMP算法解释

  • 2017年11月29日 11:14
  • 175KB
  • 下载

C#实现-模式串匹配-KMP

  • 2017年11月19日 14:51
  • 33KB
  • 下载

KMP算法模板及问题解决

博大精深的KMP,我要开始搞你了!   首先,了解KMP算法,KMP是一种改进了的字符串算法,用于优化匹配字符串的。   至于具体内容,本人还是讲不出来的,见几种好的讲解。KMP  KMP理解 K...

KMP算法.ppt

  • 2017年10月30日 23:14
  • 269KB
  • 下载

kmp算法源码

  • 2015年08月16日 10:37
  • 3KB
  • 下载

数据结构——关于KMP算法中next函数的详细解析

之前看到数据结构中字符串的模式匹配时,花了半天的时间,才把KMP算法中的next函数整明白了,结果过了几天在看到这时,只记得next[j+1]=next[j]+1,可是有时候能套公式正确算出,有时候就...

KMP算法汇总

  • 2015年09月22日 16:40
  • 723KB
  • 下载

kmp算法代码

  • 2014年06月28日 13:08
  • 2KB
  • 下载

字符串匹配算法(KMP、BM和Sunday),及Python实现

 分类: Python/Ruby 这篇博客主要对三种字符串匹配算法(KMP、BM、Sunday)进行总结。这三种字符串匹配算法之间的主要区别在于:如果在匹配过程中遇到一个不匹配位,该用...

字符串查找KMP算法

  • 2017年08月22日 17:45
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:kmp
举报原因:
原因补充:

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