KMP算法小析

来源:互联网 发布:ipad下载东西软件 编辑:程序博客网 时间:2024/06/06 07:36

对于串的模式匹配算法,相信学data structure的都不会很陌生,不过当我们看到各种书上对算法KMP的讲解时,我们会有种不知所云的感觉就算有的C++的算法实现,和例子的讲解,当换成另外一个串时,我们将无从下手,其中对NEXT的求解,更让我们痛苦。在这里Sinpoal将自己对这个算法的看法记录下来,在谈及KMP之,我先谈谈另外一种串的模式匹配算法(朴素的模式匹配)
eg :
object[i]    : q w e r t y u
subobject[j] : t y u

在上面写出的两个字符串中我们用朴素的模式匹配来查找 subobject[j] 这个字符串, 首先定义两个int 型数: int i=0;int j=0;
  object[i]==?subobject[j]  beacusei=0; j=0;。q!=t; and now excute i++;
  object[i]==?subobject[j]  beacusei=1; j=0;。w!=t; and now excute i++;
  object[i]==?subobject[j]  beacusei=2; j=0;。e!=t; and now excute i++;
  object[i]==?subobject[j]  beacusei=3; j=0;。r!=t; and now excute i++;
  object[i]==?subobject[j]  beacusei=4; j=0;。t==t; and now excute      i++&&j++
 
  object[i]==?subobject[j]  beacusei=5 j=1;。y==y; and now excute      i++&&j++
  object[i]==?subobject[j]  beacusei=6; j=2;。u==u; and now excute      i++&&j++

  此时查找结束。
  接下来我们看KMP算法。 在这里我给出NEXT的算法:
     1)next[0]= -1  意义:任何串的第一个字符的模式值规定为-1。

(2)next[j]= -1   意义:模式串T中下标为j的字符,如果与首字符

相同,且j的前面的1—k个字符与开头的1—k

个字符不等(或者相等但T[k]==T[j])(1≤k<j)。

如:T=”abeabead” 则 next[6]=-1,因T[3]=T[6]
(3)next[j]=k    意义:模式串T中下标为j的字符,如果j的前面k个

字符与开头的k个字符相等,且T[j] != T[k] (1≤k<j)。

                       即T[0]T[1]T[2]。。。T[k-1]==T[j-k]T[j-k+1]T[j-k+…T[j-1]

且T[j] != T[k].(1≤k<j);

(4) next[j]=0   意义:除(1)(2)(3)的其他情况。