版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
字符串模式匹配KMP算法第一页,共十一页,2022年,8月28日简单匹配算法第二页,共十一页,2022年,8月28日简单匹配算法
intIndex_BF(charS[],charT[],intpos){/*若串S中从第pos(S的下标0≤pos<StrLength(S))个字符起存在和串T相同的子串,则称匹配成功,返回第一个这样的子串在串S中的下标,否则返回-1
*/inti=pos,j=0;while(S[i+j]!='\0'&&T[j]!='\0')if(S[i+j]==T[j])j++;//继续比较后一字符else{i++;j=0;//重新开始新的一轮匹配}if(T[j]=='\0')returni;//匹配成功
返回下标elsereturn-1;//串S中(第pos个字符起)不存在和串T相同的子串}
第三页,共十一页,2022年,8月28日还是相同的例子,在S=”abcabcabdabba”中查找T=”abcabd”,当第一次搜索到S[5]和T[5]不等后,S下标不是回溯到1,T下标也不是回溯到开始,而是根据T中T[5]==’d’的模式函数值(next[5]=2,为什么?后面讲),直接比较S[5]和T[2]是否相等,因为相等,S和T的下标同时增加;因为又相等,S和T的下标又同时增加。。。最终在S中找到了T。如图:
第四页,共十一页,2022年,8月28日
为什么T[5]==’d’的模式函数值等于2(next[5]=2),其实这个2表示T[5]==’d’的前面有2个字符和开始的两个字符相同,且T[5]==’d’不等于开始的两个字符之后的第三个字符(T[2]=’c’).如图:也就是说,如果开始的两个字符之后的第三个字符也为’d’,那么,尽管T[5]==’d’的前面有2个字符和开始的两个字符相同,T[5]==’d’的模式函数值也不为2,而是为0。
第五页,共十一页,2022年,8月28日
前面我说:在S=”abcabcabdabba”中查找T=”abcabd”,如果使用KMP匹配算法,当第一次搜索到S[5]和T[5]不等后,S下标不是回溯到1,T下标也不是回溯到开始,而是根据T中T[5]==’d’的模式函数值,直接比较S[5]和T[2]是否相等。。。为什么可以这样?刚才我又说:“(next[5]=2),其实这个2表示T[5]==’d’的前面有2个字符和开始的两个字符相同”。请看图:因为,S[4]==T[4],S[3]==T[3],根据next[5]=2,有T[3]==T[0],T[4]==T[1],所以S[3]==T[0],S[4]==T[1](两对相当于间接比较过了),因此,接下来比较S[5]和T[2]是否相等。。。那S[1]和T[0],S[2]和T[0]之间又是怎么跳过,可以不比较呢?因为S[0]=T[0],S[1]=T[1],S[2]=T[2],而T[0]!=T[1],T[1]!=T[2],==>S[0]!=S[1],S[1]!=S[2],所以S[1]!=T[0],S[2]!=T[0].还是从理论上间接比较了。
第六页,共十一页,2022年,8月28日
S假设S不变,在S中搜索T=“abaabd”。这种情况,当比较到S[2]和T[2]时,发现不等,就去看next[2]的值,next[2]=-1,意思是S[2]已经和T[0]间接比较过了,不相等,接下来去比较S[3]和T[0]吧。
假设S不变,在S中搜索T=“abbabd”。这种情况当比较到S[2]和T[2]时,发现不等,就去看next[2]的值,next[2]=0,意思是S[2]已经和T[2]比较过了,不相等,接下来去比较S[2]和T[0]吧。假设S=”abaabcabdabba”在S中搜索T=“abaabd”。这种情况当比较到S[5]和T[5]时,发现不等,就去看next[5]的值,next[5]=2,意思是前面的比较过了,其中,S[5]的前面有两个字符和T的开始两个相等,接下来去比较S[5]和T[2]吧。第七页,共十一页,2022年,8月28日三.怎么求串的模式值next[n]定义:(1)next[0]=-1
意义:任何串的第一个字符的模式值规定为-1。(2)next[j]=-1
意义:模式串T中下标为j的字符,如果与首字符相同,且j的前面的1—k个字符与开头的1—k个字符不等(或者相等但T[k]==T[j])(1≤k<j)。如:T=”abCabCad”则next[6]=-1,因T[3]=T[6](3)next[j]=k
意义:模式串T中下标为j的字符,如果j的前面k个字符与开头的k个字符相等,且T[j]!=T[k](1≤k<j)。即T[0]T[1]T[2]。。。T[k-1]==T[j-k]T[j-k+1]T[j-k+2]…T[j-1]且T[j]!=T[k].(1≤k<j);(4)next[j]=0
意义:除(1)(2)(3)的其他情况。第八页,共十一页,2022年,8月28日01)求T=“abcac”的模式函数的值。
next[0]=-1
根据(1)
next[1]=0
根据(4)
因(3)有1<=k<j;不能说,j=1,T[j-1]==T[0]
next[2]=0
根据(4)
因(3)有1<=k<j;(T[0]=a)!=(T[1]=b)
next[3]=-1
根据(2)next[4]=1
根据(3)
T[0]=T[3]且T[1]=T[4]
即
下标01234Tabcacnext-100-11第九页,共十一页,2022年,8月28日02)来个复杂点的,求T=”ababcaabc”的模式函数的值。next[0]=-1
根据(1)next[1]=0
根据(4)next[2]=-1
根据(2)next[3]=0
根据(3)虽T[0]=T[2]但T[1]=T[3]被划入(4)next[4]=2
根据(3)T[0]T[1]=T[2]T[3]且T[2]!=T[4]next[5]=-1
根据(2)
next[6]=1
根据(3)T[0]=T[5]且T[1]!=T[6]next[7]=0
根据(3)虽T[0]=T[6]但T[1]=T[7]被划入(4)next[8]=2
根据(3)T[0]T[1]=T[6]T[7]且T[2]!=T[8]
即下标012345678Tababcaabcnext-10-102-1102第十页,共十一页,2022年,8月28日四.串T的模式值next[n]的函数
voidget_nextval(constchar*T,intnext[]){
//求模式串T的next函数值并存入数组next。
intj=0,k=-1;
next[0]=-1;
while(T[j]!='\0')
{
if(k==-1||T[j]==T[k])
{
++j;++k;
if(T[j]!=T[k])
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 点线格本(A4打印)
- 期末练习(16)小学4年级上册-人教版数学
- 部编版二年级语文上册第5课《玲玲的画》精美课件
- 【鲁教54】期中模拟卷01【一~三章】
- 关于生命的课件
- 如何使用制作课件
- 小学三年级语文课件
- 新教材同步系列2024春高中化学第五章合成高分子本章总结课件新人教版选择性必修3
- 医用钾盐市场环境与对策分析
- 双向无线对讲机项目评价分析报告
- 律师事务所转让协议书样本
- 腰椎穿刺术操作与护理课件
- 微观经济学(第九版)课件:投入要素市场
- 新生儿出血的课件
- 贵阳汽车公园规划方案
- 金铲铲之战游戏介绍
- 我的家乡-四川课件
- VDA6.3 2023过程审核教材
- 网约车司机培训课件
- 妊娠期糖尿病的护理
- 政务新闻摄影技巧培训课件
评论
0/150
提交评论