一. 前言
BF全称为Brute-Force,是一种简单匹配算法,采用穷举法的思路。即从主串S的每一字符开始依次与子串T的字符进行匹配。其中的子串T称为模式串,如果主串中包含一个连续子串字符序列与模式串相等,则返回这个子串第一个字符在主串中的序号,否则匹配失败,就返回0。
二. BF算法的完整代码
因为BF算法是在串的基础上实现的,所以首先需要创建一个串的结构类型定义如下所示:
#define MAXSIZE 255
typedef struct{
char ch[MAXSIZE+1]; //实际数组比最大长度多一,因为一般序号为0的位置不存放数据
int length;
}SString;
在定义好串的结构类型之后,我们来看下BF算法的一个完整代码:
int Index_BF(SString S,SString T){
int i=1,j=1;
while(i<=S.length&&j<=T.length){
if(S.ch[i]==T.ch[j]){ //如果第一个位置匹配成功,则继续下一个位置的匹配
++i;
++j;
}
else{ //匹配失败,进行i的回溯,j重新赋值为1.
i=i-j+2;
j=1;
}
}
if(j>T.length) return i-T.length; //全部匹配成功,返回在主串中出现的序号
else return 0; //模式匹配失败,返回0
}
这段代码是从主串的第一个位置开始进行查找匹配的,我们也可以从主串的任意位置开始匹配。如下所示:
int Index_BF(SString S,SString T,int pos){
int i=pos,j=1; //从主串的pos位置开始进行查找
while(i<=S.length&&j<=T.length){
if(S.ch[i]==T.ch[j]){
++i;
++j;
}
else{
i=i-j+2;
j=1;
}
}
if(j>T.length) return i-T.length;
else return 0;
}
三. BF算法的时间复杂度
假设n为主串的长度,m为模式串的长度,BF算法最好的情况就是从第一个位置就一直匹配成功,所以时间复杂度也就为模式串的长度即m。
下面我们看下BF算法的最坏时间复杂度:
最坏时间复杂度就为n*m。从中我们可以看出,BF算法的效率并不是很高,因此这就会引出我们的KMP算法。