欢迎来到天天文库
浏览记录
ID:62044957
大小:160.50 KB
页数:4页
时间:2021-04-16
《KMP算法复杂度与简单比较.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、个人收集整理勿做商业用途 3110008344 王扬旭 信计二班实现字符串匹配的普通匹配算法和KMP算法#include<iostream>#includeusingnamespace std;#defineMAXL255//可由用户定义的字符串的长度为255(数值自己设置)typedefunsignedcharSString[MAXL +1];intIndex(SString S,SStringT,intpos){ //按照普通匹配查找方式查找模式串ﻩinti=pos;ﻩintj=1,k=1;while(i<=S[0]&&j<=T[0]){ﻩif
2、(S[i]==T[j]){ﻩ++i;ﻩﻩ++j;ﻩ} //继续比较后继字符ﻩelseﻩﻩ{ﻩﻩi=i-j+2;j=1;ﻩ} //指针后退重新开始匹配ﻩk++;ﻩ}ﻩcout<<"普通匹配查找的时间复杂度为"<T[0])ﻩﻩreturni-T[0]; //匹配成功ﻩelsereturn0;}//Indexvoidget_next(SStringT,intnext[]){ //求KMP算法中的next函数值,并存入数组next[] inti=1;ﻩnext[1]=0;intj=0;ﻩwhile(i3、j==0|4、T[i]==T[j]){ ++i;ﻩﻩ++j;ﻩﻩﻩnext[i]=j;ﻩ}ﻩelse j=next[j];ﻩ }个人收集整理勿做商业用途}//get_nextintIndex_KMP(SStringS,SStringT,int pos){ //KMP算法的实现过程intnext[MAXL];ﻩinti=pos;ﻩintj=1,k=1;while(i<=S[0]&&j<=T[0]){ﻩﻩif(j==05、6、S[i]==T[j]){ﻩ++i;ﻩ++j;ﻩ} //继续比较后继字符ﻩelse{ﻩﻩget_next(T,next);ﻩj=nex7、t[j];ﻩﻩ} //模式串向右移动k++;}ﻩcout<<"KMP匹配查找的时间复杂度为"<(int)T[0])returni-T[0]; //匹配成功ﻩelsereturn0;}//Index_KMPvoidmain(){ﻩSStringT,S;intp,i,j,k1,k2;p=1;ﻩcout<<"请输入字符串匹配主串:"<<endl;cin>>S;ﻩcout<<"请输入字符串匹配模式串:"<8、j++) {ﻩT[0]=j; } //存储字符串 ﻩcout<<"普通算法:"<9、qqqqqqqqqqqqqqqqqqqqqvbn’;运行界面如下:小结:得到普通匹配算法的时间复杂度为440,而KMP算法的时间复杂度为66,显然在匹配算法中,KMP算法优于普通算法,节省了时间以及资源。(2)当输入主串为S=’asdfghjlklzxcvbnmqwertyuiop’;模式串为T=qwertyui’运行结果如下:小结:当匹配串重复出现的字符不多时,KMP算法的优势无法明显体现出来,KMP的复杂度不一定比普通匹配的小。(3)还有一个问题就是当我匹配模式串只输入一个字符的话系统会出现问题普通算法的可以做但是KMP的就出错了。个人收集整理勿做商业用途(4)对于T(0)我是这样10、理解的1.//生成一个其值等于串常量strs的串T2.voidStrAssign(SString&T,char *strs)3.{4.inti;5.T[0]=0;//0号单元存储字串长度6.for(i=0;strs[i];i++) //用数组strs给串T赋值7.T[i+1] =strs[i];8.T[0] = i;9.}但是在上面的程序上我看书里面可以直接拿来用,就没有重新去对T进行赋值了。问题出现在get_next()
3、j==0|
4、T[i]==T[j]){ ++i;ﻩﻩ++j;ﻩﻩﻩnext[i]=j;ﻩ}ﻩelse j=next[j];ﻩ }个人收集整理勿做商业用途}//get_nextintIndex_KMP(SStringS,SStringT,int pos){ //KMP算法的实现过程intnext[MAXL];ﻩinti=pos;ﻩintj=1,k=1;while(i<=S[0]&&j<=T[0]){ﻩﻩif(j==0
5、
6、S[i]==T[j]){ﻩ++i;ﻩ++j;ﻩ} //继续比较后继字符ﻩelse{ﻩﻩget_next(T,next);ﻩj=nex
7、t[j];ﻩﻩ} //模式串向右移动k++;}ﻩcout<<"KMP匹配查找的时间复杂度为"<(int)T[0])returni-T[0]; //匹配成功ﻩelsereturn0;}//Index_KMPvoidmain(){ﻩSStringT,S;intp,i,j,k1,k2;p=1;ﻩcout<<"请输入字符串匹配主串:"<<endl;cin>>S;ﻩcout<<"请输入字符串匹配模式串:"<8、j++) {ﻩT[0]=j; } //存储字符串 ﻩcout<<"普通算法:"<9、qqqqqqqqqqqqqqqqqqqqqvbn’;运行界面如下:小结:得到普通匹配算法的时间复杂度为440,而KMP算法的时间复杂度为66,显然在匹配算法中,KMP算法优于普通算法,节省了时间以及资源。(2)当输入主串为S=’asdfghjlklzxcvbnmqwertyuiop’;模式串为T=qwertyui’运行结果如下:小结:当匹配串重复出现的字符不多时,KMP算法的优势无法明显体现出来,KMP的复杂度不一定比普通匹配的小。(3)还有一个问题就是当我匹配模式串只输入一个字符的话系统会出现问题普通算法的可以做但是KMP的就出错了。个人收集整理勿做商业用途(4)对于T(0)我是这样10、理解的1.//生成一个其值等于串常量strs的串T2.voidStrAssign(SString&T,char *strs)3.{4.inti;5.T[0]=0;//0号单元存储字串长度6.for(i=0;strs[i];i++) //用数组strs给串T赋值7.T[i+1] =strs[i];8.T[0] = i;9.}但是在上面的程序上我看书里面可以直接拿来用,就没有重新去对T进行赋值了。问题出现在get_next()
8、j++) {ﻩT[0]=j; } //存储字符串 ﻩcout<<"普通算法:"<9、qqqqqqqqqqqqqqqqqqqqqvbn’;运行界面如下:小结:得到普通匹配算法的时间复杂度为440,而KMP算法的时间复杂度为66,显然在匹配算法中,KMP算法优于普通算法,节省了时间以及资源。(2)当输入主串为S=’asdfghjlklzxcvbnmqwertyuiop’;模式串为T=qwertyui’运行结果如下:小结:当匹配串重复出现的字符不多时,KMP算法的优势无法明显体现出来,KMP的复杂度不一定比普通匹配的小。(3)还有一个问题就是当我匹配模式串只输入一个字符的话系统会出现问题普通算法的可以做但是KMP的就出错了。个人收集整理勿做商业用途(4)对于T(0)我是这样10、理解的1.//生成一个其值等于串常量strs的串T2.voidStrAssign(SString&T,char *strs)3.{4.inti;5.T[0]=0;//0号单元存储字串长度6.for(i=0;strs[i];i++) //用数组strs给串T赋值7.T[i+1] =strs[i];8.T[0] = i;9.}但是在上面的程序上我看书里面可以直接拿来用,就没有重新去对T进行赋值了。问题出现在get_next()
9、qqqqqqqqqqqqqqqqqqqqqvbn’;运行界面如下:小结:得到普通匹配算法的时间复杂度为440,而KMP算法的时间复杂度为66,显然在匹配算法中,KMP算法优于普通算法,节省了时间以及资源。(2)当输入主串为S=’asdfghjlklzxcvbnmqwertyuiop’;模式串为T=qwertyui’运行结果如下:小结:当匹配串重复出现的字符不多时,KMP算法的优势无法明显体现出来,KMP的复杂度不一定比普通匹配的小。(3)还有一个问题就是当我匹配模式串只输入一个字符的话系统会出现问题普通算法的可以做但是KMP的就出错了。个人收集整理勿做商业用途(4)对于T(0)我是这样
10、理解的1.//生成一个其值等于串常量strs的串T2.voidStrAssign(SString&T,char *strs)3.{4.inti;5.T[0]=0;//0号单元存储字串长度6.for(i=0;strs[i];i++) //用数组strs给串T赋值7.T[i+1] =strs[i];8.T[0] = i;9.}但是在上面的程序上我看书里面可以直接拿来用,就没有重新去对T进行赋值了。问题出现在get_next()
此文档下载收益归作者所有