已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
串的模式匹配字符串模式匹配算法,通俗点说,就是一种在一个字符串中定位另一个串的高效算法。KMP(Knuth-Morris-Pratt)算法是一种基于前缀搜索的方法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法在搜索阶段的最坏时间复杂度和平均时间复杂度都是O(n),在预处理阶段的时间复杂度是O(m),所以它的时间复杂度为O(m+n)。 一.简单匹配算法先来看一个简单匹配算法的函数:int Index_BF ( char S , char T , int pos )/* 若串 S 中从第pos(S 的下标0pos S0 != S1,S1 != S2,所以S1 != T0,S2 != T0. 还是从理论上间接比较了。有人疑问又来了,你分析的是不是特殊轻况。假设S不变,在S中搜索T=“abaabd”呢?答:这种情况,当比较到S2和T2时,发现不等,就去看next2的值,next2=-1,意思是S2已经和T0 间接比较过了,不相等,接下来去比较S3和T0吧。假设S不变,在S中搜索T=“abbabd”呢?答:这种情况当比较到S2和T2时,发现不等,就去看next2的值,next2=0,意思是S2已经和T2比较过了,不相等,接下来去比较S2和T0。假设S=”abaabcabdabba”在S中搜索T=“abaabd”呢?答:这种情况当比较到S5和T5时,发现不等,就去看next5的值,next5=2,意思是前面的比较过了,其中,S5的前面有两个字符和T的开始两个相等,接下来去比较S5和T2吧。总之,有了串的next值,一切搞定。那么,怎么求串的模式函数值nextn呢?(本文中next值、模式函数值、模式值是一个意思。) 三. 怎么求串的模式值nextn定义:(1)next0= -1 意义:任何串的第一个字符的模式值规定为-1。(2)nextj= -1 意义:模式串T中下标为j的字符,如果与首字符相同,且j的前面的1k个字符与开头的1k个字符不等(或者相等但Tk=Tj)(1kj)。如:T=”abCabCad” 则 next6=-1,因T3=T6(3)nextj=k 意义:模式串T中下标为j的字符,如果j的前面k个字符与开头的k个字符相等,且Tj != Tk (1kj)。 即T0T1T2。Tk-1=Tj-kTj-k+1Tj-k+2Tj-1 ,且Tj != Tk.(1kj);(4) nextj=0 意义:除(1)(2)(3)的其他情况。 举例:01)求T=“abcac”的模式函数的值。 next0= -1 根据(1) next1=0 根据 (4) 因(3)有1=kj;不能说,j=1,Tj-1=T0 next2=0 根据 (4) 因(3)有1=k0 但kn, 表示,Sm的前k个字符与T中的开始k个字符已经间接比较相等了,下一次比较Sm和Tk相等吗?4. 其他值,不可能。 四. 求串T的模式值nextn的函数下面是这个函数: void get_nextval(const char *T, int next) / 求模式串T的next函数值并存入数组 next。 int j = 0, k = -1; next0 = -1; while ( Tj != 0 ) if (k = -1 | Tj = Tk) +j; +k; if (Tj!=Tk) nextj = k; else nextj = nextk; / if else k = nextk; / while /显示部分 / for(int i=0;ij;i+) / / coutnexti; / /coutendl;/ get_nextval另一种写法,也差不多。void getNext(const char* pattern,int next) 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; /显示部分 / for(int i=0;ij;i+) / / coutnexti; / /coutendl;下面是KMP模式匹配程序,加入上面的函数#include #include #includevoid get_nextval(const char *T, int next) / 求模式串T的next函数值并存入数组 next。 int j = 0, k = -1; next0 = -1; while ( Tj/*+1*/ != 0 ) if (k = -1 | Tj = Tk) +j; +k; if (Tj!=Tk) nextj = k; else nextj = nextk; / if else k = nextk; / while /这里是显示部分 / for(int i=0;ij;i+) / / coutnexti; / /coutendl;/ get_nextvalvoid KMP(const char *Text,const char* Pattern,int pos) /const 表示函数内部不会改变这个参数的值。 if( !Text|!Pattern| Pattern0=0 | Text0=0 ) cout错误;/空指针或空串,错误。 int len=0; const char * c=Pattern; while(*c+!=0)/移动指针比移动下标快。 +len;/字符串长度。 int *next=new intlen+1; get_nextval(Pattern,next);/求Pattern的next函数值 int i=pos,j=0; while(Texti!=0 & Patternj!=0 ) if(Texti= Patternj) +i;/ 继续比较后继字符 +j; else if(nextj!=-1) j=nextj;/ 模式串向右移动 else j=0; +i; /while delete next; if(Patternj=0) cout匹配成功endl;/ 匹配成功 else cout匹配不成功endl; int main()system(color e4); char tex
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO/IEC 15420:2025 EN Information technology - Automatic identification and data capture techniques - EAN/UPC bar code symbology specification
- led经营合同范本
- 个人委托入股协议书
- 公司职工保险协议书
- 个人土地售卖协议书
- 昆明市西山区昆政职业培训学校2025年下半年招考易考易错模拟试题(共500题)试卷后附参考答案
- 校车捐赠协议书模板
- 儿童健康安全协议书
- 期中阶段评估卷-2025-2026学年人教版七年级上册数学测试卷
- 广东金融学院学科带头人教学科研骨干招考易考易错模拟试题(共500题)试卷后附参考答案
- 2025全国医疗应急能力培训系列课程参考答案
- 全面质量管理考试复习题库(第四版)
- 建筑竣工测绘方案
- 保安服务项目投标方案(技术标)
- 中日钓鱼岛问题
- GB/T 15843.4-2024信息技术安全技术实体鉴别第4部分:采用密码校验函数的机制
- OLP-网管系统用户手册(武汉光迅)
- 敦煌的艺术智慧树知到答案章节测试2023年
- 病人心理与心理护理课件
- 传输专业常用仪表
- 自然地理学-第五章-地貌精课件
评论
0/150
提交评论