跳转至

BF 算法

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

一、原理

所谓的暴力匹配,就是:

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

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

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

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

   匹配失败
      |
      v
ababababca
abababca

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

匹配失败
 |
 v
ababababca
 abababca

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

      匹配成功
         |
         v
ababababca
  abababca

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

二、分析

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

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

n - m + 1

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

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

三、应用

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

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

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

参考

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

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

附录

/**
 * 暴力搜索法
 *
 * @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;
    }

}