首页 > 编程知识 正文

两个条件匹配数据,模式匹配kmp算法

时间:2023-05-03 06:47:52 阅读:112166 作者:3597

处理多行文本搜索子串时,搜索方法称为模式匹配。 接下来介绍两种模式匹配算法。

1 .朴素模式匹配算法:

kxdwt,朴素的模式匹配算法是按照匹配串的字符顺序逐圈自增加来匹配模式串。

int simple _ string matching (string match、string target、int pos ) { //match为模式列,target为目标列,pos为开始匹配的位置int i=pos wile(Itarget.size(-match.size ) ) j=0; wile (target [ I ]==match [ j ] jmatch.size ) ) I; j; (if ) j==match.size ) ) {return i-j; (}else i=i-j; }返回- 1; ) } 2.KMP算法:朴素的模式匹配算法写作简单,但效率不高。 最坏的情况下,需要匹配n-m 1次。 每次匹配比较m次,最差的时间复杂度为m(n-m1 ),时间复杂度为o ) Mn )。

现在,让我们来看看一个例子:

目标字符串aaaaaaaaaaaaaaaaaaabaab在这个例子中完成了上述最坏的情况,但实际上可能不需要再匹配

目标字符串: ymddr

模式列: a a ab

a a ab

a a ab

........

AAA

当模式列首次匹配时,发现第四个不同,就像前三个字符一样。 此时,没有必要进行第二次和第三次一致。 因为第4个字符是b,所以与字符a不同,一定会匹配失败。

有了这个想法,让我们详细分析一下可行性。

目标字符串为S=“”,模式字符串为P=“”。

假设目前t 1次匹配成立,但是这次匹配失败了。 如果遵循朴素的模式匹配算法,下次就会比较是否相等。 根据第一次匹配结果,第二次匹配不一定相等。 同样,第三次也不相等。 这样的话,可以直接从t j-k 1那里进行比较。 因为是已知的,所以根据第t 1次匹配时的s的失配字符来考察是否成立即可。

失败函数f(j )如下所示

在此,如果决定f(0)=-1,则以递归的想法得到失败函数

voidfail(strings,int* f ) {int i,j,m=s.size; f[0]=-1; j=-1; for(I=1; im; I ) while(j=0s[j1]!=s[I](j=f[j]; if(s[j1]==s[I] ) j; f[i]=j; }如果有失败函数,就可以写KMP算法

intkmp(strings,string p ) { int i=0,j=0; int n=s.size (,m=p.size ); while(inJM ) if ) p[j]==s[I]|j==-1 ) ) I; j}elseif(J0 ) j=f[j-1] 1; else j=-1; } return j==m? i-j:-1; ) KMP算法分析:由于预处理得到的失败函数: o(m ),KMP算法: o ) n ),整体时间复杂度为o ) mn )

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。