数据结构——BF算法 - 指南

news/2025/11/22 21:08:37/文章来源:https://www.cnblogs.com/ljbguanli/p/19258605

数据结构——BF算法 - 指南

BF算法

在字符串模式匹配中,BF算法是最直观的实现方式,也被称为朴素模式匹配算法。它的核心逻辑是“暴力遍历、逐个比较”,虽然效率不是最优,但因逻辑简单、易于理解,是字符串匹配的基础方法。

1. BF算法的根本思想

:就是BF算法的核心思路从主串的每一个可能的起始位置开始,依次与模式串的每个字符逐一比较。具体来说,假设主串为SSS(长度为nnn),模式串为TTT(长度为mmm),我们需从主串的第0个字符开始,尝试将SSS的子串S[i..i+m−1]S[i..i+m-1]S[i..i+m1]TTT进行匹配(iii从0到n−mn-mnm);若某一次子串与TTT完全匹配,则返回起始位置iii;若遍历完所有可能的iii后仍未匹配,则返回-1表示失败。

2. BF算法的匹配过程

为了更清晰地理解匹配逻辑,我们通过“指针移动”来拆解过程:

  • 定义两个指针iii(主串指针,初始为0)和jjj(模式串指针,初始为0);
  • 比较S[i]S[i]S[i]T[j]T[j]T[j]
    • 若相等:iiijjj同时加1,继续比较下一个字符;
    • 若不相等:iii回溯到“上一次起始位置的下一个位置”(即i=i−j+1i = i - j + 1i=ij+1),jjj重置为0,重新开始匹配;
  • 重复上述步骤,直到j=mj = mj=m(模式串完全匹配,返回i−mi - mim作为起始位置)或i>n−mi > n - mi>nm(主串遍历完,匹配失败)。

以“主串S=S =S=‘ababcabcacbab’,模式串T=T =T=‘abcac’”为例,匹配过程如下:

  • 初始i=0,j=0i=0, j=0i=0,j=0S[0]=′a′S[0] = 'a'S[0]=aT[0]=′a′T[0] = 'a'T[0]=a相等,i=1,j=1i=1, j=1i=1,j=1
  • S[1]=′b′S[1] = 'b'S[1]=bT[1]=′b′T[1] = 'b'T[1]=b相等,i=2,j=2i=2, j=2i=2,j=2
  • S[2]=′a′S[2] = 'a'S[2]=aT[2]=′c′T[2] = 'c'T[2]=c不相等,i=0−2+1=−1+1=0i = 0 - 2 + 1 = -1 + 1 = 0i=02+1=1+1=0? 这里纠正,实际iii初始是0,第一次不相等时,i=0−2+1=−1i = 0 - 2 + 1 = -1i=02+1=1? 不对,应该是iii初始从0开始,第一次比较到i=2,j=2i=2, j=2i=2,j=2不相等,此时iii回溯到0+1=10 + 1 = 10+1=1(由于上一次起始位置是0,回溯后起始位置是1),j=0j=0j=0
  • 重新比较S[1]=′b′S[1] = 'b'S[1]=bT[0]=′a′T[0] = 'a'T[0]=a不相等,iii回溯到2,j=0j=0j=0
  • 以此类推,直到找到匹配位置或遍历结束。
3. BF算法的代码实现

以下是BF算法的C语言实现,函数返回模式串在主串中首次出现的起始位置,失败则返回-1:

// BF算法:s为主串,t为模式串,n为主串长度,m为模式串长度
int BF(char s[], char t[], int n, int m) {
int i = 0, j = 0;
while (i < n && j < m) {
if (s[i] == t[j]) { // 字符相等,继续比较下一个
i++;
j++;
} else { // 字符不相等,主串指针回溯,模式串指针重置
i = i - j + 1;
j = 0;
}
}
if (j == m) return i - m; // 匹配成功,返回起始位置
else return -1; // 匹配失败
}

代码说明:

  • 循环条件i < n && j < m:确保主串和模式串都未遍历完;
  • 字符相等时,ij同时后移;不相等时,i回到“上一次起始位置的下一个位置”,j重置为0,重新开始匹配;
  • j == m,说明模式串已完全匹配,返回起始位置i - m;否则返回-1表示失败。
4. BF算法的性能分析

BF算法的时间复杂度与主串、模式串的匹配情况密切相关:

  • 最好情况:模式串的第一个字符就与主串的当前起始字符不匹配。例如,主串是“abcdef”,模式串是“xyz”,每次只需比较1个字符就能确定不匹配,时间复杂度为O(n+m)O(n + m)O(n+m)nnn为主串长度,mmm为模式串长度)。
  • 最坏情况:每次比较都到模式串的最后一个字符才不匹配,且主串有大量重复字符。例如,主串是“aaaaaab”,模式串是“aaab”:
    • 第一次匹配:i=0,j=0i=0, j=0i=0,j=0j=3j=3j=3时不匹配,iii回溯到1,j=0j=0j=0
    • 第二次匹配:i=1,j=0i=1, j=0i=1,j=0j=3j=3j=3时不匹配,iii回溯到2,j=0j=0j=0
    • 以此类推,直到找到匹配或遍历完主串。此时时间复杂度为O(n×m)O(n \times m)O(n×m),当nnnmmm较大时,效率极低。

综上,BF算法的优势是逻辑方便、易于实现,适合模式串较短或匹配概率较低的场景;但在最坏情况下效率较差,这也为后续更高效的KMP算法提供了优化的动力。理解BF算法的“暴力回溯”逻辑,是掌握字符串模式匹配进阶算法的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/973421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

01背包不可达状态 二维的

include <bits/stdc++.h> using namespace std; int j[1005]; int f[1005]; int dp[1005][1005]; int main() { int m, n; while (cin >> m >> n) { if (m == -1 && n == -1) break;memset(…

实用指南:阮一峰《TypeScript 教程》学习笔记——类型断言

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Unable to add window -- token null is not valid; is your activity running?

在Android中连续弹出两个Dialog就会出现下面的错误:android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?at android.view.ViewRootImpl.set…

PySpark -

PySpark -Spark installed on WSL. Java installed on WSL. Jupyter ran on WSL:jupyter-lab --no-browser Code ran in Windows browser:spark = (SparkSession.builder.master(spark://ZZHPC.localdomain:7077).app…

打造你的超级学习流:Chrome + ChatGPT Sidebar + Anki 全流程整合

📘 Chrome + ChatGPT + Anki 快速集成方案(Markdown 版)#️⃣ 1. 解决了什么问题 你希望实现:在 Chrome 浏览器中使用 ChatGPT Sidebar 随时提问 选中文本/ChatGPT 输出内容后 右键 / 快捷键 一键加入 Anki(自动…

html空间怎样设置边距

在HTML中,设置元素的外边距通常使用CSS(层叠样式表)。以下是如何为HTML元素设置外边距的几种方法:内联样式:在HTML元素的标签内使用style属性。<div style="margin: 20px;">这个div有20像素的外边…

单步电梯调度系统总结

前言: 完成三次电梯大作业之后,我将对题目重新进行设计与分析,对知识点、题型难度、题量等进行总结,以及提出踩坑心得和改进建议。 一、知识点 1.基础知识点 (1)基本语法 标识符与关键字:使用static final定义常量…

html空间怎样实现浮动

在HTML中,要实现浮动效果,通常使用CSS样式。浮动元素会脱离文档流,可以向左或向右浮动,直到它的外边缘碰到包含框或另一个浮动元素的边缘为止。以下是如何使用CSS实现浮动的示例:创建一个HTML文件,例如float_exa…

扩散模型变天?何恺明发布JiT架构,揭示高维空间预测的真相

何凯明新作JIT:告别VAE与潜空间,拥抱像素级生成。在生成式AI掀起的百模大战中,一套固化的技术共识已悄然形成:高质量图像生成必须锚定潜空间(Latent Space)框架,高分辨率任务离不开变分自编码器(VAE)的压缩赋…

完整教程:LLama 3分组查询注意力与KV缓存机制

完整教程:LLama 3分组查询注意力与KV缓存机制pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…

#关于对[淄博市实验中学]高一31班某同学实施严重校园欺凌及校方处置不力问题的举报信

尊敬的山东省教育厅领导: 您好! 我们系[淄博市实验中学]高一31班部分学生及家长,现就本班长期存在的严重校园欺凌行为以及学校在事件处理过程中的明显失职与不当作为,向贵单位匿名反映情况,恳请上级主管部门依法介…

使用routers自动生成路由的路由器设计原则,类视图设计原则,序列化器类的设计原则

urls.py文件内容# from django.urls import path, re_path, include # from . import views # # urlpatterns = [ # path(projects/<int:pk>/, views.ProjectDetailView.as_view()), # path(projects/, …

团队作业3:需求改进与系统设计

团队作业3:需求改进与系统设计一.需求&原型改进 1.1针对老师问题的修改 问题1​:老师提出“软件只用于PC端,软件是否也可以设置为移动端”。 ​修改1​:调整开发规划,将软件从仅支持PC端扩展为支持多端适配​…

软件工程团队作业3

软件工程团队作业3 系统设计&项目计划这个作业属于哪个课程 计科23级12班这个作业要求在哪里 团队作业3--需求改进&系统设计 - 作业 - 计科23级12班 - 班级博客 - 博客园这个作业的目标 完善系统设计,制定Alp…

[洛谷-P1364] 医院设置

普通的floyd就不讲了,如果数据量到了1e5以上,这就是一道树的重心的变式,求带权的重心。或者说用树型dp或dfs来优化最小值的查找。最终时间复杂度 \(O(n)\) 。以下代码是第一篇题解的风格变化+注释。 #include <b…

实现五折交叉验证进行模型训练 -

实现五折交叉验证进行模型训练1、实验目的 熟悉Python 的基本操作,掌握对数据集的读写实现、对模型性能的评估实现的能力; 加深对训练集、测试集、N折交叉验证、模型评估标准的理解。 2、实验内容 (1)利用pandas库…

KingbaseES:为银行核心系统迁移开启新航道 - 详解

KingbaseES:为银行核心系统迁移开启新航道 - 详解2025-11-22 20:38 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displ…

用 ffmpeg 命令去除视频的重复帧、剪视频、修改视频尺寸 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

20232422 2025-2026-1 《网络与系统攻防技术》实验六实验报告

20232422 2025-2026-1 《网络与系统攻防技术》实验六实验报告 1.实验内容 本次实验是Metasploit工具的实战应用,先通过主机发现、端口扫描完成前期信息搜集,再针对Metasploitable2靶机的4个已知漏洞(Vsftpd后门漏洞…

毕业论文写作全流程:从选题到答辩的完整指南

毕业论文写作挑战重重,本文提供从选题到答辩的完整指南。选题与开题准备部分介绍选题原则方法、开题报告撰写及文献检索整理技巧;论文写作核心流程涵盖大纲搭建、摘要引言结论撰写、正文论证及参考文献规范;修改、降…