简单匹配算法和KMP算法
实现字符串匹配的简单匹配算法和KMP算法,并且使用相同的比较字符串重复比较至少5000次,计算两者的时间差别实验要求:完成实验内容要求,编写程序实现提交报告,报告分三部分内容:1) 自己是怎么做的?遇到什么问题,怎样解决的?2) 用了哪些数据,得到什么结果?程序结果是不是跟你想的一样?为什么不一样?3) 还有哪些值得改进或者不懂的?一、 实验方案源程序的头文件定义为:#include 〈stdio.h〉#include <stdlib.h>#include
\n”,k);ﻩif(j〉T[0]) ﻩ return i—T[0]; else return 0;}//Indexvoid get_next(SString T,int next[]){ //求KMP算法中的next函数值,并存入数组next[] int i=1; next[1]=0;ﻩ int j=0;ﻩ while(i〈(int)T[0])ﻩ {ﻩﻩ if(j==0 || T[i]==T[j])ﻩ { ﻩﻩ ++i;ﻩ ﻩ ++j; ﻩ if(T[i]!=T[j]) next[i]=j; ﻩ else next[i]=next[j]; ﻩ } else j=next[j]; }}//nextint Index_KMP(SString S,SString T,int pos){ //KMP算法的实现过程 int next[MAXSTRLEN];ﻩint i=pos; int j=1,k=0;ﻩwhile(i<=(int)S[0] && j〈=(int)T[0])ﻩ{ ﻩif(j==0 || S[i]==T[j]) { ﻩﻩ++i; ++j;ﻩ }ﻩﻩelseﻩ {ﻩ get_next(T,next); ﻩﻩj=next[j]; ﻩ} k++; } printf("KMP匹配查找的时间复杂度为%d。
\n",k);ﻩif(j>(int)T[0])ﻩ return i—T[0]; else return 0;}//Index_KMP源程序中主函数如下:void main(){ SString T,S;ﻩint p,i,j,k1,k2; p=1;ﻩi=1; j=1;ﻩprintf(”请输入字符串匹配主串:\n”); gets(&S[1]);ﻩprintf("请输入字符串匹配模式串:\n");ﻩgets(&T[1]); for(i=1;S[i]!=NULL;i++)ﻩ{ ﻩS[0]=(int)(i); } printf("字符串匹配中主串:\n”); puts(&S[1]);ﻩfor(j=1;T[j]!=NULL;j++)ﻩ{ﻩ T[0]=(int)(j); } printf("\n字符串匹配中模式串:\n");ﻩputs(&T[1]); ﻩprintf("-————————-普通算法——-——---————\n”);ﻩk1=Index(S,T,p);ﻩprintf(”普通匹配算法得模式串位置:%d\n\n",k1);ﻩprintf("———————---KMP算法———————-——-—\n”);ﻩk2=Index_KMP(S,T,p); printf("KMP算法得模式串位置:%d\n",k2);}二、 实验结果和数据处理(1)程序运行时,输入主串为S=’qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqws ‘;模式串为T='qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqws';运行界面如下:小结:得到普通匹配算法的时间复杂度为3793,而KMP算法的时间复杂度为174,显然在匹配算法中,KMP算法优于普通算法,节省了时间以及资源。
2)当输入主串为S=’A STRING SEARCHING EXAMPLE CONSISTING OF SIMPLE TEXT';模式串为T=’STING’运行结果如下:小结:当主串重复出现的字符不多时,KMP算法的优势无法明显体现出来4 / 4。




