【BF算法】

简介: BF 算法BF 算法精讲在学习到字符串的匹配问题时,了解到了BF算法和KMP算法。对比这两个算法,先了解BF算法;字符串匹配问题,比如说:有一个主串 “abbbcdef” , 子串 “bbc”,该问题就是在主串中查找子串。肉眼可见,主串中的确存在子串bbc,返回值是子串在主串中第一次出现的首位置下标,也就是返回2.BF

BF 算法

在学习到字符串的匹配问题时,了解到了BF算法和KMP算法

对比这两个算法,先了解BF算法;

字符串匹配问题,比如说:有一个主串 “abbbcdef” , 子串 “bbc”,该问题就是在主串中查找子串。

肉眼可见,主串中的确存在子串bbc,返回值是子串在主串中第一次出现的首位置下标,也就是返回2.

BF

首先来看一下下图

4eef76f19ab4445ebff466f89f3af6b7.png

以上面的例子为例:

i指向位置和j所指向位置不相等,那么i就往后移一位

如下图:

05f8946f5de04880888e796df408776b.png

此时i 和 j 所指位置相等,相等,i 和 j 都后移一位。再比较,相等,继续后移,此时到了下图的位置:

594f2eab45b6457d9eea890c819a1c31.png

在这个地方不再相等了,所以 j 应该回退到初始位置,那么 i 应该回退到哪里呢 ? 其实很简单, i 和 j 是一起移动的, j 移动了多少位,i 就移动多少位 ,所以 i 回退的位置应该是 i - j +1

即 i = i - j +1 ,i - j 是 i 和 j 一起移动的长度,再 +1,就是i 从 开始的位置往后移了一位。

如下图:

dbf50b7d43be4879af92a37997c8f879.png

从该位置再继续开始匹配, 第一次相同,第二次也相同,第三次也相同,这个过程就是

if (str[i] == sub[j]) str是主串,sub是子串
{
  i++;
  j++;
}

当j移动到 '\0’的位置时,表明已经匹配成功,

如下图:

image.gif

匹配成功,则返回 子串在主串中第一次出现的起始位置

也就是 return i - j;

到了这里 , BF 算法的核心就结束了

BF算法其实就是一个个地往下匹配,不相等时主串的 i 走到下一位,子串回到初始位置,也就是朴素的匹配算法。

下面看代码:

int BF(const char* str, const char* sub)
{
  assert(str && sub);
  int i = 0;//记录主串
  int j = 0;//记录子串
  size_t len_dest = strlen(str);//strlen 返回值是size_t
  size_t len_src = strlen(sub);
  if (len_src == 0)
  {
    return 0;//子串为空,返回主串起始位置
  }
  while (i<len_dest)
  {
    while (str[i] == sub[j])
    {     
      i++;
      j++;
    }
    if (j >= len_src )// 子串到了'\0'位置了
    {
      return i - j;//找到了
    }
    //不相等就往下继续匹配
    i = i - j + 1;
    j = 0;
  }
  //退出该循环,说明找完主串都找不到,不存在该子串
  return -1;
}
int main()
{
  printf("%d\n", BF("abbbcdef", "bbc"));
  printf("%d\n", BF("abbbcdef", "bcd"));
  printf("%d\n", BF("abcdef", ""));
  return 0;
}

核心部分已做注释:

结果如下:

9f8c5f9eede24029bd0ded7420707727.png

相关文章
|
7月前
|
算法 测试技术
库函数strstr的两种算法模拟实现(BF算法和kmp算法)
库函数strstr的两种算法模拟实现(BF算法和kmp算法)
|
6天前
|
算法 Java
【数据结构】字符串匹配|BF算法|KMP算法|next数组的优化
【数据结构】字符串匹配|BF算法|KMP算法|next数组的优化
39 0
|
6天前
|
存储 算法 安全
【408数据结构与算法】—串和BF算法(二十四)
【408数据结构与算法】—串和BF算法(二十四)
|
7月前
|
算法
串的模式匹配相关问题(BF算法、KMP算法)
串的模式匹配相关问题(BF算法、KMP算法)
81 0
|
8月前
|
算法
上网行为管理软件的效率提升:BF算法的巨大优势
BF算法(布隆过滤器算法)在上网行为管理软件中的应用场景包括……
180 0
|
8月前
|
算法 Java
【Java】BF算法(串模式匹配算法)
【Java】BF算法(串模式匹配算法)
93 1
|
9月前
|
监控 算法
转:BF算法对于文档管理软件的运用优势
BF算法(布隆过滤器算法)在文档管理软件中的应用场景包括: 1. 窗口列表查询:文档管理软件可以通过BF算法来查询当前所有的窗口列表,并根据需要对窗口进行筛选、排序、过滤等操作。 2. 窗口状态监测:文档管理软件可以利用BF算法对每个窗口进行哈希计算,将哈希值存入布隆过滤器中,从而能够快速判断窗口是否处于激活状态或者是否发生了变化。 3. 窗口内容监控:文档管理软件可以使用BF算法对窗口的内容进行哈希计算,并将哈希值存入布隆过滤器中,从而能够快速判断窗口内容是否发生了变化。
64 0
|
10月前
|
算法
转:文档管理软件运用BF算法后更加高效
BF算法(布隆过滤器算法)在文档管理软件中的应用场景包括: 文档查重:文档管理软件可以使用BF算法对文档进行哈希计算,将哈希值存入布隆过滤器中,从而能够快速判断文档是否已经存在或者是否与已有文档相似。 文档搜索:文档管理软件可以利用BF算法对文档进行哈希计算,将哈希值存入布隆过滤器中,从而能够快速判断某个关键词是否存在于文档中。 文档分类:文档管理软件可以使用BF算法对文档进行哈希计算,将哈希值存入布隆过滤器中,从而能够快速判断文档应该属于哪个分类。
62 0
|
11月前
|
算法 测试技术
【JavaOJ 题集】字符串匹配问题-BF算法 and KMP算法
JavaOJ 题集 & 字符串匹配问题 & BF算法 & KMP算法
70 0
|
12月前
|
算法
基于matlab的LDPC译码算法误码率对比仿真,对比BP和BF译码
基于matlab的LDPC译码算法误码率对比仿真,对比BP和BF译码
188 0