关于kmp算法的分析:
在最简单的朴素算法中,是从主串的第一个字符和模式字符地一个字符进行比较的,若相等则继续比较后续的字符,否则从主串的第二个字符开始重复与模式字符的比较。
改进一:在第n次的字符比较中,若前k个字符对应相等,但从k+1开始模式字符和主串的字符不相等时候。就不必要从上次比较的下一个字符开始与模式字符比较比较,而是从k+1个字符开始比较。
改进二:在改进一当中,虽然模式字符k时候相等,但是在k+1时候不相等,程序继续比较,在比较k+2时候,肯定不相等。这是不必要的比较。
Void   ff(sstring  t, int *array)
{
     m=t[0];
     f (t,array);
    for(q=1 ;q<=m;q++)
     {
           k=f[q];
           while(k>0&&t [k+1]==t[q+1])
            k=f[k];
            f[q]=k
     }
}
 在实际应用中,模式串与主串一般要进行多次匹配,以便找到在主串含有多少个这样的子串,典型的应用就是在数据库中的查找。例如输入某人的姓名,然后在姓名这一主串内查找有多少个这样的子串。下面结合前缀函数ff(x)的求解算法给出多次模式匹配的算法:
void  match(string s,string t, int a[])
{
     n=s[0];//主串的长度
    m=t.[0];//模式串的长度
    ff(t,f)//求出模式串中各个字符的前缀函数ff(x)
    d=0;//该变量用来统计与模式串匹配成功的子串的个数
    q=0//该变量表示模式串中与主串匹配成功的字符的个数
for(i=1;i<=n;i++)
  {
      while(q>0&&t[q+1]!=s[i])
       q=f[q];
      if(t[q+1]==s[i])  q=q+1;
      if(q==m) {d=d+1;   a[d]=i-m+1;}
  }
}
总结:通过改进把朴素算法和改进一的效率都有啦很大的提高。缩短啦查询的时间。