全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
KMP算法和朴素算法(后面赋有能直接运行的C语言代码)现在讨论一般情况。 假设 主串: s: s(1) s(2) s(3) s(n) ; 模式串 :p: p(1) p(2) p(3).p(m) 把课本上的这一段看完后,继续 现在我们假设 主串第i个字符与模式串的第j(j=m)个字符失配后,主串第i个字符与模式串的第k(kk 满足下列关系式:(kj), p(1) p(2) p(3).p(k-1) = s(i-k+1)s(i-k+2)s(i-1) 即: 主串: s(1)s(i-k +1) s(i-k +2) s(i-1) s(i) . | (相配) | | ?(有待比较) 匹配串: p(1) p(2) . p(k-1) p(k) 现在我们把前面总结的关系综合一下 有: s(1)s(i-j +1) s(i-k +1) s(i-k +2) s(i-1) s(i) | (相配) | | | (失配) p(1) p(j-k+1) p(j-k+2) . p(j-1) p(j) | (相配) | | ?(有待比较) p(1) p(2) . p(k-1) p(k) 由上,我们得到关系: p(1) p(2) p(3).p(k-1) = p(j-k+1)p(j-k+2)p(j-1) 接下来看“反之,若模式串中存在满足式(4-4)。”这一段。看完这一段,如果下面的看不懂就不要看了。直接去看那个next函数的源程序。(伪代码) K 是和next有关系的,不过在最初看的时候,你不要太追究k到底是多少,至于next值是怎么求出来的,我教你怎么学会。 课本83页不是有个例子吗?就是 图4.6 你照着源程序,看着那个例子慢慢的推出它来。看看你做的是不是和课本上正确的next值一样。 在理解上面代码的基础上,建议自己寻找一些KMP算法的练习,也可以自己写两个较为简单的字符串进行人脑模拟这种方法的练习,以加深对算法的理解。 KMP算法的优化KMP算法是可以被进一步优化的。 我们以一个例子来说明。譬如我们给的P字符串是“abcdaabcab”,经过KMP算法,应当得到“特征向量”如下表所示: 下标i0123456789p(i)abcdaabcabnexti-1000011231但是,如果此时发现p(i) = p(k),那么应当将相应的nexti的值更改为nextk的值。经过优化后可以得到下面的表格: 下标i0123456789p(i)abcdaabcabnexti-1000112312优化的nexti-1000-110030附:(以下为本人已调试通过的进行两种模式匹配的算法,直接复制即可运行。)#include#include#define MAXSIZE 100int Index_BF ( char S , char T , int pos );int KMP(char *Text,char* Pattern,int pos);void main()int k,pos,n;char s11MAXSIZE;char s22MAXSIZE;doprintf(*主菜单*);printf(n1.输入待匹配的两个字符串);printf(n2.模式匹配的朴素算法进行匹配);printf(n3.模式匹配的KMP算法进行匹配);printf(n4.结束程序);printf(n请输入您的选择(以输入10表结束:);scanf(%d,&k);switch(k)case 1:printf(please input the MAINLY string :);scanf(%s,s11);printf(please input the MODE string :);scanf(%s,s22);printf(please enter the position you want to start:);scanf(%d,&pos);break; case 2:n=Index_BF(s11,s22,pos);if(n!=-1) printf(normal mode:have found ,at the position:%d.,n);else printf(normal mode:have NOT found!);break; case 3:n=KMP(s11,s22,pos);if(n!=-1) printf(KMP:have found ,at the position:%d.,n);else printf(KMP:have NOT found!);break; case 4:printf(感谢使用,GOODBYE!n);break;printf(n*nnn);while(k!=4);int Index_BF ( char S , char T , int pos ) /模式匹配的朴素算法 int i=pos,j=0;while (Si+j!=0&Tj!=0) if(Si+j=Tj) j +; / 继续比较后一字符else i+; j=0; if ( Tj = 0) return i; / 匹配成功 返回下标else return -1; void getNext(const char* pattern,int next) /用于求nextj的值 next0=-1; int k=-1,j=0; while(patternj != 0) if(k!= -1 & patternk!= patternj ) k=nextk; +j;+k; if(patternk= patternj) nextj=nextk; else nextj=k; int KMP(char *Text,char* Pattern,int pos) /模式匹配的KMP算法 if( !Text|!Pattern| Pattern0=0 | Text0=0 ) return -1;/空指针或空串,返回-1。 int len=0; char * c=Pattern; while(*c+!=0) +len;int *next=new intlen+1; getNext(Pattern,next); int index=0,i=pos-1,j=0; while(Texti!=0 & Patternj!=0 ) if(Texti= Patternj) +i;/ 继续比较后继字符
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年党旗飘扬主题党日活动实施方案
- 2026年植树节活动设计与实施方案
- 2026年线上教学与提质增效
- 2026年中班活动区目标以及指导
- 智能化数据挖掘与煤炭资源评估-洞察与解读
- 基因编辑技术在福瑞达生物科技合作中的临床应用前景研究-洞察与解读
- 生物兼容性陶瓷材料开发-洞察与解读
- 社交媒体影响下的用户行为分析与忠诚度提升-洞察与解读
- 2026年施工定额测试题及答案
- 2026年放弃数量关系测试题及答案
- 2026年浙江省群众文化专业、图书资料专业、艺术系列高级专业技术职务任职考试(图书资料)复习题及答案
- 2026陕西榆林能源集团有限公司社会招聘应往届高校毕业生225人备考题库附答案详解
- 请结合马克思主义基本原理中有关科学社会主义的重要阐述理论联系实际谈一谈你对科学社会主义基本原则的认识(二)
- 2026年中考考前预测卷数学(云南)(含答案)
- 2026年医院编制考试公共基础知识综合冲刺真题题库(含答案)
- 2026年去2026年重庆中考试卷及答案
- 2025年安徽省初二学业水平地生会考真题试卷(+答案)
- 江苏省兴化市顾庄学区2026届中考数学五模试卷含解析
- 2026年中国临床肿瘤学会结直肠癌诊疗指南版
- 2025-2030中国民宿行业经营现状分析与未来投资价值评估研究报告
- 2025年湖南省技术产权交易所有限责任公司专业岗位招聘4人笔试参考题库附带答案详解
评论
0/150
提交评论