用C语言分别实现简单的模式匹配算法和KMP模式匹配算法,在DEV C++下运行通过,对于同一个模式匹配,两者的时间分别是0.01239和0.007465,简单的说明了KMP算法的高效。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<time.h>
#include<windows.h>
//simple index
/*返回字串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0,T非空,1<=pos<=StrLength(S)*/
int Index(int *S,int *T,int pos)
{
int i=pos;
int j=1;
while(i<=S[0]&&j<=T[0])
{
if(S[i]==T[j])
{
++i;
++j;
}
else
{
i=i-j+2;//i回到上一次匹配首位的下一位
j=1;
}
}
if(j>T[0])
return i-T[0];
else
return 0;
}
//next
/*通过计算返回子串T的next数组*/
void get_next(int *T,int *next)
{
int i,j;
i=1;
j=0;
next[1]=0;
while(i<T[0])
{
if(j==0||T[i]==T[j])
{
++i;
++j;
next[i]=j;
}
else
j=next[j];
}
}
int Index_KMP(int *S,int *T,int pos)
{
int i=pos;
int j=1;
int next[255];
get_next(T,next);
while(i<=S[0]||j<=T[0])
{
if(j==0||S[i]==T[j])
{
++i;
++j;
}
else
j=next[j];
}
if(j>T[0])
return i-T[0];
else
return 0;
}
int main()
{
int S[11]={10,0,0,1,1,0,0,1,1,1,0};
int T[7]={6,0,0,1,1,1,0};
//printf("%d\n",Index(S,T,1));
printf("%d\n",Index_KMP(S,T,1));
return 0;
}