1 / 4
文档名称:

KMP模式匹配算法.docx

格式:docx   大小:21KB   页数:4页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

KMP模式匹配算法.docx

上传人:wz_198613 2019/5/29 文件大小:21 KB

下载得到文件列表

KMP模式匹配算法.docx

相关文档

文档介绍

文档介绍:KMP算法是一种线性时间复杂度的字符串匹配算法,它是对BF算法(Brute-Force,最基本的字符串匹配算法)的改进。对于给定的原始字符串string和模式字符串p,需要从字符串s中找出p(首次)出现的位置索引:BF算法的时间复杂度为O(strlen(s)*strlen(p)),空间复杂度为O(1);KMP算法的时间复杂度为O(strlen(s)+strlen(p)),空间复杂度为O(strlen(p));两种算法的主要区别是失配时的处理:假设串s匹配到i位置,串p匹配到j位置:BF算法中,如果当前字符匹配成功,即s[i+j]==p[j],则令j++,继续匹配下一个字符;如果匹配失败,即s[i+j]!=p[j],则让i++并且j=0,即每次失配时,原串匹配位置向右移动一位(从i+j回溯到i+1),而j重置为0。而KMP算法则是在发生失配时,根据模式中字符和失配在模式中出现的位置,来确定继续进行搜索(j)的位置,而i的位置不会向后回溯。例如:假定p=’abcabcacab’,令字符串s=s0s1…sm-1,且假设现在要判断是否存在从si开始的匹配。如果si≠a,那么显然可以进行si+1与a的比较;类似地,如果si=a且si+1≠b,那么进行si+1与a的比较;如果sisi+1=ab且si+2≠c,则出现如下情况: s=-ab???…?p=’abcabcacab’符号?表示不知道s中此处字符是什么,在s中第一个?代表si+2且si+2≠c,因此,搜索的下一步应该是对p的首字符和si+2进行比较。这里无需比较p的首字符和si+1,因为已经知道si+1与p的第二个字符相同为b,即si+1≠a;以此类推,假定出现了p前4个字母的匹配,然后失配,即si+4≠b。则出现如下情况:s=-abca???…?p=’abcabcacab’通过观察可以看到,匹配搜索可以继续把si+4与第二个字符b进行比较。这是在把模式p向右滑动时,发生部分匹配的第一处。因此,通过模式中的字符和失配在模式中出现的位置,就可以确定在模式中继续进行匹配搜索的位置,而不必在s中进行回溯。为了形式化说明,定义一个模式失配函数: 令p=p0p1…pn-1是一个模式,则其失配函数f定义为:fj=i为满足i<j且使得p0p1…pi=pj-ipj-i+1…pj的最大整数,如果i≥0-1,否则例如:对于模式p=’abcabcacab’,有: j0123456789 pabcabcacab f-1-1-10123-101根据失配函数的定义,得到如下模式匹配规则:如果出现了形如si-j…si-1=p0p1…pj-1且si≠pj的部分匹配,,若j≠0,则下一趟模式匹配时,从失配字符si和模式串字符pfj-1+1处重新开始比较;若j=0,则继续比较si+1和p0。按上述匹配规则实现的匹配函数为:intstr_pmatch(char*s,char*p,char*failure){ if(NULL==s||NULL==p||NULL==failure) { return-1; } intlens=strlen(s); intlenp=strlen(p); inti=0,j=0; while(i<lens&&j<lenp) { if(s[i]==p[j]