数据结构(三)串---BF算法(朴素模式匹配)
(一)BF算法了解
BF算法,即暴风(Brute Force)算法,是普通的模式匹配算法。
BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;
若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。
(二)算法模拟
开始匹配:
第一次匹配:H和L不相等,串S向下移一个,串T回到原位置
第二次匹配:L和O不相等,串S移向下一个位置,串T回到原位
第三次匹配:L和L匹配上了,将此位置记为A,串S移向下一个位置,串T也移向下一个位置,继续匹配
第四次匹配:L和E不匹配,将串S移动到标记为A的下一个位置重新进行匹配,将串T回到原位
第五次匹配:L和L匹配上了,将此位置记为B,串S移向下一个位置,串T也移向下一个位置,继续匹配
第六次匹配:E和E匹配上了,串S移向下一个位置,串T也移向下一个位置,继续匹配
第七次匹配:W和W匹配上了,串T全部匹配成功,一次匹配成功。
(三)代码实现:前面我们实现顺序存储串的时候使用的就是BF算法
int Index(String S, String T, int pos) //返回子串T在主串S中第pos个字符之后的位置,若不存在,返回0
{
int i, j;
i = pos; //用于主串S中当前位置下标,若pos不为1时,则从pos位置开始匹配
j = ; //用于子串T多种当前位置下标值
while (i<=S[]-T[]+&&j<=T[]) //若i的长度小于可匹配长度,且j小于T的长度时循环
{
if (S[i]==T[j]) //两字符相等时继续匹配
{
j++;
i++;
}
else //指针后退重新匹配
{
i = i - j + ; //注意这个索引的加2,i退回到上次匹配首位的下一个位置
j = ; //j退回子串T的首位
}
}
if (j > T[])
return i - T[];
return ;
}
BF算法也是回溯法
(四)性能分析
S=
T=
最坏的时间复杂度为O((n-m+)*m)
在实际运用中,对于计算机来说,处理的都是二进制位的0和1的串,一个字符可以看做8位0/1串,汉字和图片更多,所以当我们使用BF匹配效率就会特别低
数据结构(三)串---BF算法(朴素模式匹配)的更多相关文章
- BF算法(模式匹配)
BF算法 (Brute-Force算法) 一种简单的模式匹配算法,目的是寻找模式串p是否在目标串s中有出现. 思想:先从第一个字符开始匹配,如果p[j]==s[i],那么继续向下比较,一旦不相等,即回 ...
- python机器学习(三)分类算法-朴素贝叶斯
一.概率基础 概率定义:概率定义为一件事情发生的可能性,例如,随机抛硬币,正面朝上的概率. 联合概率:包含多个条件,且所有条件同时成立的概率,记作:
- 串的两种模式匹配方式(BF/KMP算法)
前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最重要的操作之一,而不同的算法实现有着不同的 ...
- 数据结构与算法JavaScript (四) 串(BF)
串是由零个或多个字符组成的有限序列,又叫做字符串 串的逻辑结构和线性表很相似的,不同的是串针对是是字符集,所以在操作上与线性表还是有很大区别的.线性表更关注的是单个元素的操作CURD,串则是关注查找子 ...
- (原创)数据结构之利用KMP算法解决串的模式匹配问题
给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串S中出现的位置. 输入格式: 输入有两行 ...
- 数据结构4_java---顺序串,字符串匹配算法(BF算法,KMP算法)
1.顺序串 实现的操作有: 构造串 判断空串 返回串的长度 返回位序号为i的字符 将串的长度扩充为newCapacity 返回从begin到end-1的子串 在第i个字符之前插入字串str 删除子串 ...
- 串、串的模式匹配算法(子串查找)BF算法、KMP算法
串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3…….an ' n ...
- 第4章学习小结_串(BF&KMP算法)、数组(三元组)
这一章学习之后,我想对串这个部分写一下我的总结体会. 串也有顺序和链式两种存储结构,但大多采用顺序存储结构比较方便.字符串定义可以用字符数组比如:char c[10];也可以用C++中定义一个字符串s ...
- 数据结构之BF算法,kmp算法,三元组,十字链表总结
在这一章中,老师教了我们四种数据结构:BF算法,kmp算法,三元组和十字链表:还给我们讲了2019年团体天体赛中T1-8的AI题 1.对于BF和kmp算法,老师除了在课堂上讲解算法的主要核心思想外,还 ...
随机推荐
- 7、Docker监控方案(cAdvisor+InfluxDB+Grafana)
一.组件介绍 我们采用现在比较流行的cAdvisor+InfluxDB+Grafana组合进行Docker监控. 1.cAdvisor(数据采集) 开源软件cAdvisor(Container Adv ...
- 【Android UI设计与开发】第04期:引导界面(四)仿人人网V5.9.2最新版引导界面
这一篇我将会以人人网的引导界面为实例来展开详细的讲解,人人网的引导界面比较的新颖,不同于其他应用程序千篇一律的靠滑动来引导用户,而是以一个一个比较生动形象的动画效果展示在用户们的面前,有一种给人眼前一 ...
- HTML5 标签实例
html 5 学习1.<p></p> #段落元素定义2.<h1></h1> #标题 h1代表大号的字体.依此变小3.<br /> #实例 代 ...
- Unity利用SMSSDK实现短信验证码(附代码)
最近一直在研究如何给app更多实用性的功能,在app进行登录或者注册时,为了方便用户更加快捷的完成登录功能,所以就决定采用短信验证码的方式进行验证登录.在学习的过程中,先使用了Mob的短信服务进行短信 ...
- 智能合约bug以及修改方案
截取两篇文章:第一遍文章说的是智能合约能不能修改的问题: ETC转到ETH地址以及转币进ETH智能合约账户能不能转出来? 第0章 引言 如果ETC充值到了ETH地址上,能找回来吗?答案是不一定. ET ...
- win2003无线网卡驱动无法安装解决方法
Windows 2003 Server对无线网卡的pci资源分配出了问题,而笔记本bios中屏蔽了pci配置项,无法修改. 打开资源管理器菜单,工具-文件夹选项-显示,去掉“隐藏受保护的操作系统文件” ...
- Notes of Daily Scrum Meeting(12.20)
今天是周六,大家空余的时间还是挺多的,也都主动完成了当天工作,最后由于我的失误,在晚上12点 之前没有把进度签入进TFS里面,所以周六的燃尽图是错误的,我把进度加进周日,总的进度会在周日的燃尽 图里面 ...
- [2017BUAA软工助教]个人得分总表(beta阶段)
一.表 学号 b团队 b团队得分 b贡献分 阅读作业 提问回顾 总分 14011100 hotcode5 228 60 6 7.5 301.5 14061213 PM="PokeMon&qu ...
- Python网络数据采集
一.正则表达式 * 表匹配0次或者多次 a*b* + 表至少一次 [ ] 匹配任意一个 ( ) 辨识一个编组 {m,n} m或者n 次 [^] 匹配任意不在中括号里的字符 | ...
- C与C++的编程风格区别
c和c++都是在实践中发展起来的语言.实用性极强.c是与UNIX/Linux的发展相辅相成的.而C++是B.S为了摆脱c与硬件以及底层过于紧密的苦恼,而开发的语言.C++可以说就是c语言的超集.任何c ...