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算法_实验报告

西安交通大学实验报告 课程 数据结构 实验名称 基于串的模式匹配 第 1 页 共 页 系别__ 自动化 实 验 日 期 / 2014 年 11 月 15日 专业班级 自动化43班 实 验 报 告 日 期 2014 年 11月 22 日 姓名 李欣阳 学号 2140504066 报 告 退 发 ( 订正 、 重做 ) 同 组 人 无 教 师 审 批 签 字 一、实验目的 熟练掌握串的运用,以及线性表、栈、队列等的基本操作;理解KMP模式匹配算法的原理,能够利用该算法解决实际问题。 二、实验内容与要求 1. 自由选择一个C程序文件作为程序的输入; 2. 通过键盘输入待查找的模式串,求取并显示next数组; 3. 判断该程序代码中是否包含该模式串,如果包含,输出左右该模式串在程序代码中文件中的位置(包括行数和该行的第几个字符); 4. 用KMP算法进行实现。 三、问题分析 3.1 KMP算法综述 KMP算法是一个非常优秀的模式匹配算法,其对于任何模式和目标序列,都可以在线性时间内完成匹配查找,而不会发生退化其时间复杂度为ext数组是实现KMP算法的关键,它决定了在匹配过程中出现字符不等时,模式串应该向右滑动的距离。next数组定义如下: 求得next数组后,匹配按照如下方式进行:假设指针i和j分别指示主串和模式串中正待比较的字符,令i初值为pos,j的初值为1,若在匹配过程中对应位置字符相等,则i和j增1;如果出现不相等的情况,则j退到next[j]的位置继续进行比较。 3.3 一行多次匹配的实现 由于原始的KMP算法在完成一次模式匹配后会推出算法,想要实现一行多个的模式匹配,需要设计结构存储每一行模式匹配中,模式串出现的位置。因此定义数组linepos[20]来存储模式串在每一行出现的位置。 具体实现方法是:在进行模式匹配是,如果在主串中出现与模式相匹配的连续串,则把该串在主串中出现的位置记录到linpos数组中,此后i不归零而是继续进行匹配,知道主串中的每个字符都与模式串比较过。这样逐行重复上述算法就可以实现每一行的多次匹配。 3.4 C程序文件的读入 算法要求能对C程序代码文件进行模式匹配,在解决单行模式匹配问题后,需要解决的就是C程序文件的读入。在读入程序文件时有两种方式,一是整体读入文件后分行存储,另一个是分行读取,为了节省内存空间优化算法,本算法采用分行读取分行匹配的方式。 文件的读取需要借助C语言文件打开函数fopen,在读取文件文件后以’’作为行与行之间的分隔符,借助fgetstypedef struct seqstring{ char string[MAX_LINE]; int length; }seqstring 4.2 串的基本操作 串的基本操作函数包含在标准函数库string.h中包括求串长Strlen串赋值StrAssignConcat、串比较StrCompare、求字串SubString等,已经能够满足本算法需求,不需要重新定义新的操作函数。 五、算法设计 为了实现算法功能,并满足结果动态演示的需求,该算法的基本部分应该包括以下几个模块: (1)串的结构体定义 (2)求next数组的函数getnext 主要是借助next 设计循环借助if语句对每个j值对应的next[j]进行逐一判断,如果是第一种和第三种情况,直接将0或者1存入next数组,当遇到第二种情况时,保持i,j不变变换k是否成立成立的最大的void getnext(seqstring p,int next[]){ int i,j; next[0]=-1; //next[0]放上-1 i=0; //指向字符串每个字符的指针 j=-1; while(ip.length){ //没有到达结尾的话 if(j==-1||p.string[i]==p.string[j]){ //如果是第一个字符或遇到相同的字符 i++;j++;next[i]=j; } else j=next[j]; } printf(\n j的值:); for(i=0;ip.length;i++)printf(%4d,i+1); //输出j]值 printf(\nnext数组:); for(i=0;ip.length;i++)printf(%4d,next[i]+1); //输出next[]值

文档评论(0)

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

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

1亿VIP精品文档

相关文档