- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编制kmp字符串匹配实验报告
实验报告
题目:编制字符串匹配的KMP算法
班级:OOO 姓名:XXX
学号:ASDFGHJK 完成日期:20XX.XX.XX
需求分析
字符串匹配试求子串位置的定位函数,普通的字符串匹配函数时间复杂度较大达到了O(m*n),而KMP算法则可以将时间复杂度简化到O(m+n)。
本演示程序中,字符串的元素为除换行、退格等字符外的其他字符,字符串长度=MAXSIZE,字符串的输入的形式为string[0]储存长度,从string[1]开始存储字符,并以’\0’做结束标志,字符串中字符顺序不限,且允许出现重复字符,不能出现非法字符。输入两个字符串后,输入一个整形数pos,pos=MAXSIZE,pos的值必须合法。输出的结果为一个整形数,表示,从第一个字符串的pos位置开始,之后的子串能否与第二个字符串匹配,若能,输出匹配首地址的编号,若不能,输出0。
程序执行的命令包括:
构造字符串1;
构造字符串2;
kmp算法;
得到next[];
测试数据
string1=’abababab’ string2=’aba’ pos=1 output=1;
string1=’abababab’ string2=’aba’ pos=6 output=0;
概要设计
KMP算法是D.E.Knuth与V.R.Pratt和J.H.Morris同时发现的一种模式匹配的高效算法,,可以在O(m+n)的时间数量级上完成串的模式匹配操作。其改进在于:每当一趟匹配过程中出现的字符比较不等时,不需要回溯i指针,而是利用已经得到的“部分匹配”的结果将模式向右“滑动”尽可能远的一段距离后,继续进行比较。
为实现上述上述程序功能,应以串的定长顺序存储表示来存放字符串,且需要串的抽象数据类型。
串的定长顺序存储表示为:
#define MAXSTRLEN 255//用户可在255以内定义最大串长
typedef char SString[MAXSTRLEN+1];//0号单元存放串的长度
2.串的抽象数据类型定义为:
ADT String{
数据对象:D={ai|ai∈CharacterSet,i=1,2,...,n,n=0}
数据关系:R1={ai-1,ai|ai-1,ai∈D,i=1,2,...,n}
基本操作:
GetString(SString S)
初始条件:存在串的指针。
操作结果:生成一个由键盘键入的字符串S。
strlen(SString S)
初始条件:串S存在。
操作结果:返回S的元素个数,称为串的长度。
Index(SString S,SString T,int pos)
初始条件:串S和T存在,T是非空串,1=pos=Strlength(S)-pos+1.
操作结果:若主串S中存在和串T值相同的子串,贼返回它在主串S中第pos个字符之 后第一次出现的位置;否则函数值为0。
}//ADT String
KMP算法中,用到next函数,定义:
void get_next(SString T,int next[])
函数的调用关系图
main()-GetString()-strlenth()
-index_KMP-get_next()
调试分析
在GetString()中开始用了gets(S),S[0]没有用来记录字符串的长度,导致在后续的程序中运算出错。
next函数在某些情况下存在缺陷。例如模式‘aaaaa’在和主串‘aaabaaaab’匹配时,当i=4、j=4,时不匹配,需要进行多余的三次比较,实际上,因为模式中第1、2、3、个字符和第4个字符都相等,因此不再需要和主串中第四个字符进行比较,而可以将模式一气向右滑动4个字符的位置直接进行i=5、j=1时的字符比较。这就是说,若按上述定义得到next[j]=k,而模式中pj=pk,则当主串中字符si和pj不比较不等时,不需要在和pk进行比较,而直接和pnext[k]进行比较,即此时的next[j]应该和next[k]相同。由此得到修正算法:
void get_nextval(SString T,int nextval[])
四、测试结果
1.S=’abababab’ T=’aba’ pos=1 :1;
2.S=’abababab’ T=’aba’ pos=6 :0;
五、附录
源程序文件清单:
#define MAXSTRLEN 255
#includestdio.h
#includestdlib.h
#includestring.h
int next[MAXSTRLEN+1],nextval[MAXSTRLEN+1];
typedef char SString[MAXSTRLEN+1];
int Index_KMP(SString S,SStr
您可能关注的文档
最近下载
- 小学幼儿园正方体的11种展开图(打印版)-趣味版.pdf VIP
- (推荐!)2025医疗器械研究资料产品性能研究报告模板(护理包为例).docx VIP
- 部编版语文四年级上册第5单元习作《生活万花筒》优质课件.pptx VIP
- 罗宾斯管理学第15版中文PPT第14章.pptx VIP
- 初中化学校本课程(定稿).pdf VIP
- 人教版物理九年级 能量的转化和守恒 教案.docx VIP
- 苏教版六年级数学上册全册课时练含答案(共67份).pdf
- J-STD-035A非密封封装电子器件的声学显微技术.pdf VIP
- 医疗器械注册研究资料模板.pdf VIP
- 《国有企业采购操作规范:国有企业供应链采购活动与监督》2023修订版解读.pptx VIP
文档评论(0)