Blog.3 | string:BMP、BF

int Index_BF(sstring s, sstring t, int pos)
{
 //其中,t非空,1≤pos≤StrLength(s)
 int i,j;
    i = pos-1; //下标
 j = 0; //下标
    while(i<s.length && j<t.length){
       if(s.ch[i]==t.ch[j]){++i; ++j;} //继续比较后继字符
       else{i=i-j+1; j=0;} //指针后退重新开始匹配
   }  
   if(j==t.length) return i-t.length+1; //模式串全部读完,表示匹配,返回开始匹配位置的下标
   else return 0;  
}  

以上为BF算法的实现代码:BF算法比较“简单粗暴”,主串每次匹配失败之后都要往右移动一个单位,字串重新计数,因此其时间复杂度为O(m*n)。

BF算法需要注意的是:

1、容易混淆下标与位置

2、对于数据容量过大的串难以进行匹配。

因此引入了KMP算法:

优点:在字串存在有相同的前后缀时,主串不回溯,模式向右滑动1个或多个位置。

如下表:

 

Blog.3 | string:BMP、BF

Blog.3 | string:BMP、BF

                                         

Blog.3 | string:BMP、BF

 

(图片来自http://www.cnblogs.com/yahong/archive/2013/11/13/3420565.html 以及晓梅老师上传的KMP讲解文件)

因此KMP需要添加k( k = “t1..tj-1”前后缀相等字符个数+1):当字串的第j个字符与主串的第i个字符不相等时,i不回溯,j回溯到k,即下一步对si与tk进行比较。

而next数组存放每一个j对应的k。

KMP算法分析:

若无相等前后缀:k=1,移动t1至si。

若第一个字符就不匹配,移动t1至si+1。

上一篇:Mesh 无线自组网系统


下一篇:BF-9500警用(PDT)数字集群通信系统