BF 算法

BF 算法

BF 算法,即 Brute Force,暴力匹配算法,也叫朴素匹配算法。

一、原理

所谓的暴力匹配,就是:

  • 检查主串的所有子串,看是否与模式串匹配

比如,主串是 ababababca,模式串是 abababca

  • 从前往后,依次检查主串的每一个子串是否跟模式串匹配

第 1 轮(比较第 1 个子串):

1
2
3
4
5
   匹配失败
|
v
ababababca
abababca

第 2 轮(比较第 2 个子串):

1
2
3
4
5
匹配失败
|
v
ababababca
abababca

第 3 轮(比较第 3 个子串):

1
2
3
4
5
      匹配成功
|
v
ababababca
abababca

BF 算法就是通过匹配全部子串的方式,来实现字符串匹配。

二、分析

假设主串长度是 n,模式串长度是 m。

那么匹配次数(即主串中长度为 m 的子串个数)是:

1
n - m + 1

每次匹配的时间复杂度是 O(m),所以总的时间复杂度是:

1
O((n - m + 1) * m), 即 O(n * m)

三、应用

虽然 BF 算法的时间复杂度比较高,但是它在实际应用中还是会经常用到:

  • 很多场景下,主串和模式串的长度都不会太长,所以时间复杂度也不会太高
  • BF 算法思想简单,实现起来也比较简单,代码不容易出错,调试起来也简单

所以,大部分的简单场景下,BF 算法是可以满足需求的。

参考

https://time.geekbang.org/column/article/71187

https://www.zhihu.com/question/21923021

附录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* 暴力搜索法
*
* @author weijiaduo
* @since 2023/3/28
*/
public class BruteForceSearch implements Search {

@Override
public int search(String pat, String txt) {
int n = txt.length();
int m = pat.length();
for (int i = 0; i <= n - m; i++) {
int j = 0;
for (; j < m; j++) {
if (txt.charAt(i + j) != pat.charAt(j)) {
break;
}
}
// 匹配成功
if (j == m) {
return i;
}
}
return -1;
}

}
作者

jiaduo

发布于

2023-03-28

更新于

2023-09-28

许可协议