编制kmp字符串匹配实验报告.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档