BF算法暴力破解法——串模式匹配算法

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)
发布了12 篇原创文章 · 获赞 58 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/diviner_s/article/details/104167086