首页 > 编程知识 正文

kmp算法较bf算法有哪些改进,字符串模式匹配算法

时间:2023-05-05 11:27:47 阅读:140041 作者:1672

暴力匹配(BF )算法是一种常见的模式匹配算法,BF算法的思想是将目标序列s的第一个字符与模式序列t的第一个字符进行匹配,如果相等,则继续比较s的第二个字符与t的第二个字符; 如果不相等,则比较s的第二个字符和t的第一个字符,然后依次比较,直到得到最后的匹配结果。

BF算法的部分缺陷:

1 .如果第一个字符不同,j也会继续进行后方比较。 例如,如果“a”和“d”不同,则示例中的“abcdefg”和“def”很明显,即使后面的两个字符立即相等,也不是同一子列。

2.j下标每次回0号下标。 如果主列和字符串匹配失败,主列回溯会影响效率。 回溯后,不需要比较主列和字符串的一部分。

3 .这种简单丢弃前匹配信息的算法带来了很大的浪费和下匹配效率

KMP算法通过对每个模式列事先计算出模式列的内部匹配信息,在匹配失败时将模式列移动到最大以减少匹配次数,很好地解决了BF算法的缺点

例如,匹配失败时,希望能够将模式字符串尽可能地向右偏移,与主字符串匹配。 向右偏移的距离用KMP算法这样计算。

关于BF算法和KMP算法的比较次数的代码如下所示。

# include iostream # include algorithm # include cstring # includestringusingnamespacestd; char nex[100]; char s[100]; char t[100]; void next () {int j=0; int i=1; nex[1]=0; intlen2=Strlen(t1; wile(Ilen2) if(j==0||t[I]==t[j] ) I; j; nex[i]=j; } else {j=nex[j]; }}}int kmp () {int i=1; int j=1; intlen1=Strlen(s1; intlen2=Strlen(t1; int count=0; int count1=0; while(I=len1j=len2) {count; if(j==0|||s[I]==t[j] ) I; j; } else {j=nex[j]; count1; }}cout 'kmp比较次数:“count endl; cout 'kmp模式列j向next值的变换移动次数:“count1 endl; if(jlen2)返回I-len 2; elsereturn -1; (}int bf ) ) intI=1; int j=1; int count=0; intlen1=Strlen(s1; intlen2=Strlen(t1; while(I=len1j=len2) {count; if(s(I )==t (j ) ) I; j; } else {i=i - j 2; j=1; }}cout 'bf比较次数:“count endl; if(jlen2)返回I-len 2; 返回- 1; (}int main ) ) while ) CINs1t1 ) ) {next ); cout 'kmp值:' kmp () endl; cout 'bf值:' bf () endl; }运行结果如下。

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