BF算法
BF算法,即暴风(Brute-Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。
Brute-Force简称为BF算法,亦称为简单匹配法。采用穷举的思路。
- 算法目的:确定主串中所含子串(模式串)第一次出现的位置(定位)
- 算法应用:搜索引擎、拼写检查、语言翻译、数据压缩
算法的思路是从S(主串)的每一个字符开始依次与T(子串)的字符进行匹配
-
算法步骤
1.分别利用计数指针 i 和 j 指示主串 S 和模式 T 中当前正待比较的字符位置,i 初值为pos, j 初值为1。
2.如果两个串均未比较到串尾,即 i 和 j 分别小于等于 S 和 T 的长度时,则循环执行以下操作:- S.ch[i] 和 T.ch[j] 比较,若相等,则 i 和 j 均分别指示串中下个位置,继续比较后续字符
- 若不等,指针后退重新开始匹配,从主串的下一个字符(i = i - j + 2(回溯))起再重新和模式的第一个字符(j=1)比较
3.如果j >T.length,说明模式 T 中的每个字符依次和主串 S 的一个连续的字符序列相等,则匹配成功,返回和模式 T 中第一个字符相等的字符在主串 S 中的序号(i-T.length);否则称匹配不成功,返回0。
-
算法描述
//返回模式T在主串S中第pos个字符开始第一次出现的位置。若不存在,则返回值为0
//其中,T非空,1 ≤pos≤ S.length
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为字串长度,最坏情况是:- 主串钱前面n-m个位置部分匹配到子串的最后一位,即这n-m位各比较了m次
- 最后m位也各比较了1次
总次数为:(n - m) * m + m = (n - m + 1) * m
若m << n,则算法复杂度:O (n * m)