引言

BF算法 的实现过程很 “无脑”,不包含任何技巧,在对数据量大的串进行模式匹配时,算法的效率很低。

暴⼒算法(BF算法)

暴力(BruteForce)算法:是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法

暴力求解法

暴力求解法 : 又名直接带入法(Directly Calculating)它是已知最古老的算法之一,与"直观目测法","心灵感应法"并称世界三大不可思议数学计算法则, 其可追溯至3200年前,古老的埃及人便开始使用象形文字进行复杂的数学演算。

模式匹配算法

模式匹配算法:是数据结构中字符串的⼀种基本运算,给定⼀个⼦串,要求在某个字符串中找出与该⼦串相同的所有⼦串,这就是模式匹配。
⽤途:搜索引擎、拼写检查、语⾔翻译、数据压缩等。

算法思想

普通模式匹配算法,其实现过程没有任何技巧,就是简单粗暴地拿一个串同另一个串中的字符一一比对,得到最终结果。

代码复杂度

该算法最理想的时间复杂度 O(n),n 表示串 A 的长度,即第一次匹配就成功。 BF 算法最坏情况的时间复杂度为 O(n *m),n 为串 A 的长度,m 为串 B 的长度。例如,串 B 为 “0000000001”,而串 A 为 “01”,这种情况下,两个串每次匹配,都必须匹配至串 A 的最末尾才能判断匹配失败,因此运行了 n *m 次。
时间复杂度太高,往往不推荐

例如,使用普通模式匹配算法判断串 A(“abcac”)是否为串 B(“ababcabacabab”)子串的判断过程如下:
首先,将串 A 与串 B 的首字符对齐,然后逐个判断相对的字符是否相等,如图 1 所示:


图 1 中,由于串 A 与串 B 的第 3 个字符匹配失败,因此需要将串 A 后移一个字符的位置,继续同串 B
匹配,如图 2 所示:


图 1 中,由于串 A 与串 B 的第 3 个字符匹配失败,因此需要将串 A 后移一个字符的位置,继续同串 B 匹配,如图 2 所示:


图 3 中,两串的模式匹配失败,串 A 继续移动,一直移动至图 4 的位置才匹配成功:


由此,串 A 与串 B 以供经历了 6 次匹配的过程才成功,通过整个模式匹配的过程,证明了串 A 是串 B 的子串(串 B 是串 A 的主串)。

BF算法实现(JAVA 语言版)


public static void main(String[] args) {String strA ="ababcabcacabacabab";String strB ="abcac";int lastInde1=strA.lastIndexOf("abcac");//字符串第一个字符最后出现的下标if(lastInde1==-1) {System.out.println("不存在字符串 "+strB);}else {System.out.println("字符串"+strB+"最后一次出现的位置:"+lastInde1);}
}

String 中 lastIndexOf 源码分析

/*** @param   ch   ⼀个字符* @return   返回指定字符的最后⼀次出现的字符串中的索引*/public int lastIndexOf(int ch) {return lastIndexOf(ch, value.length - 1);}/*** * @param   ch   ⼀个字符* @param   fromIndex 开始搜索的索引* @return   从fromIndex索引开始最后⼀次出现ch字符的索引*/public int lastIndexOf(int ch, int fromIndex) {//⼀般ch都是从0到0xFFFFif (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {final char[] value = this.value;//⽐较fromIndex和字符串最后⼀个字符的索引//取较⼩值//防⽌fromIndex越界int i = Math.min(fromIndex, value.length - 1);//从最后⼀个索引位置开始向前查找for (; i >= 0; i--) {//逐⼀判断相等即返回当前索引if (value[i] == ch) {return i;}}//找不到即返回-1return -1;} else {//⽬前不做深究return lastIndexOfSupplementary(ch, fromIndex);}}/ * @param   source       源字符串的数组.* @param   sourceOffset  源字符串的偏移量.* @param   sourceCount   源字符串的长度.* @param   target       ⼦串的数组.* @param   targetOffset ⼦串偏移量.* @param   targetCount  ⼦串的长度* @param   fromIndex    开始索引的位置* @return 返回指定⼦字符串最后⼀次出现的字符串中的索引。*/static int lastIndexOf(char[] source, int sourceOffset, int sourceCount,char[] target, int targetOffset, int targetCount,int fromIndex) {//因为sourceOffset和targetOffset 都为0 //查看源码调⽤此⽅法时的参数都为0//所以最右侧索引位为元字符长度-字串长度int rightIndex = sourceCount - targetCount;int rightIndex = sourceCount - targetCount;//开始索引位置⼩于0则说明找不到//因为这是从后⾯往前找的if (fromIndex < 0) {return -1;}//因为索引位置⼤于rightIndex肯定找不到//所以开始索引位置⼤于rightIndex就从rightIndex查找if (fromIndex > rightIndex) {fromIndex = rightIndex;}//⼦串长度为0,则返回源字符串最后⼀个字符位置的索引if (targetCount == 0) {return fromIndex;}//⼦串最后⼀个字符索引位int strLastIndex = targetOffset + targetCount - 1;//获取⼦串最后⼀个字符char strLastChar = target[strLastIndex];//因为⼦串和源字符串⽐较是从⼦串的最后⼀个位置向前⽐较//min为源字符串source最后⼀个字符的最⼩索引位置int min = sourceOffset + targetCount - 1;//因为有fromIndex ,所以源字符串source的最⼩索引为min+fromIndexint i = min + fromIndex;//此时i为源字符串source的最后⼀个位置最⼤索引位置startSearchForLastChar:while (true) {//循环找到最后⼀个字符相等的位置while (i >= min && source[i] != strLastChar) {i--;}//如果i<min说明找不到返回-1if (i < min) {return -1;}//最后⼀个字符相等的索引找到后//获取源字符串source倒第⼆个字符索引位置int j = i - 1;//⾸先明⽩是倒着⽐较的//start为计算源字符串source个字符索引位置的最后⼀个位置的前⼀个索引位置int start = j - (targetCount - 1);//k为字串倒第⼆个字符索引位置int k = strLastIndex - 1;while (j > start) {//依次向前⽐较所有字符if (source[j--] != target[k--]) {//如果不想等则向前继续查找倒数第⼀个字符相等的索引i--;continue startSearchForLastChar;}}//找到了返回//为什么+1//引⽂start为计算源字符串source个字符索引位置的最后⼀个位置的前⼀个索引位置return start - sourceOffset + 1;}}

附属文章(String源码解析)

[ 点击查看String源码解析 ]

关联算法文章:

这里有一些相关的文章,可以参考一下

1、斐波那契数列的迭代算法和递归算法
2、埃氏筛法(埃氏算法)
3、BF算法(暴⼒算法)-- 模式匹配算法
4、数据结构:八大数据结构分类
5、JAVA中 常用七大排序算法
6、Linked 链表反转 - 迭代 与 递归

BF算法(暴⼒算法)-- 模式匹配算法相关推荐

  1. 数据结构:KMP算法 串的模式匹配算法(全网最详细)

    目录 KMP模式匹配算法 简述 KMP模式匹配算法原理 如果人眼来优化的话,怎样处理         接下来我们自己来发现j的移动规律: 这一段公式证明了我们为什么可以直接将j移动到k而无须再比较前面 ...

  2. [数据结构]模式匹配算法--KMP算法详解

    目录 一. 模式匹配 二. 模式匹配算法 1. 朴素模式匹配算法 2. KMP算法 1). KMP算法的优势 2). KMP算法的原理 3). next数组的构造 4). 利用next数组匹配的过程 ...

  3. Problem C: 算法4-6:KMP字符串模式匹配算法实现

    Problem Description KMP算法是字符串模式匹配算法中较为高效的算法之一,其在某次子串匹配母串失败时并未回溯母串的指针而是将子串的指针移动到相应的位置.严蔚敏老师的书中详细描述了KM ...

  4. BF与KMP算法详解

    日升时奋斗,日落时自省 目录 一.BF暴力算法 二.KMP算法 1.next数组 2.next数组优化(nextval) 一.BF暴力算法 暴力算法是普通的模式匹配算法 针对一个主串和一个子串,子串是 ...

  5. 也许,你可以像我这样来理解KMP模式匹配算法

    本文已在本人微信公众号"码农小阿飞"上发布,打开微信搜索"码农小阿飞",或者扫描文章结尾的二维码,进入公众号并关注,就可以在第一时间收到我的推文! 前言 不管是 ...

  6. 解析BF(普通串模式匹配算法)算法

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  7. 【数据结构】字符串 模式匹配算法的理解与实现 Brute Force算法(BF算法)与KMP算法 (C与C++分别实现)

    #笔记整理 若不了解串的定义,可至: 串(string)的定义与表示 查看 串的模式匹配算法 求子串位置的定位函数 Index(S, P, pos) 求子串的定位操作通常称作串的模式匹配(其中子串P称 ...

  8. BF算法(暴力算法)--模式匹配算法

    模式匹配算法:是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配.用途:搜索引擎.拼写检查.语言翻译.数据压缩等. BF算法:         ...

  9. 字符串匹配算法(BF算法KMP算法)

    字符串匹配算法 暴力匹配(BF)算法 KMP算法 next数组 求next数组的练习 next数组的优化(nextval数组) 练习 暴力匹配(BF)算法 BF算法,即暴力(Brute Force)算 ...

  10. 字符串的模式匹配 (朴素模式匹配算法 ,KMP算法)

    字符串的模式匹配 寻找字符串p在字符串t中首次出现的起始位置 字符串的顺序存储 typedef struct {char str[MAXSIZE];int length; }seqstring; 朴素 ...

最新文章

  1. 我来阅读lodash源码——Math(一)
  2. flex 关键词过滤 2.5.35
  3. plsql连接oracle11g怎么配置,怎么使用plsql怎么连接64位Oracle11g数据库?
  4. C# Excel处理工具
  5. Java Web项目漏洞:检测到目标URL存在http host头攻击漏洞解决办法
  6. 使用Rust库bindgen之Hello World(附代码)
  7. win2008服务器系统玩红警,win8系统电脑下不能兼容红警2游戏的解决方法【图文】...
  8. 分辨率、像素、像素尺寸、GSD、图片文件大小
  9. [转]移动App测试中的最佳做法
  10. Java程序打包成jar文件
  11. 发布版,浏览器端隐藏代码
  12. Intel Distiller工具包-量化实现3
  13. Python 利用opencv给白底照片换色,全网唯一
  14. BeautifulSoup详解
  15. 全网最快的M1 MacBook Air详细测评
  16. HTTP的几种认证方式之BASIC 认证(基本认证)
  17. js设置input不可编辑
  18. 直觉是五感之外的一种感觉?不知道如何抉择时就靠直觉吧!
  19. java符合规律的随机数_云风的 BLOG
  20. IEEE 802简介

热门文章

  1. 杨幂晒七月孕肚揭怀孕只胖baby不胖身材的女星
  2. 诛仙服务器状态查询,《诛仙3》部分服务器数据互通公告
  3. 史上最详细清样/校样(Proof)处理流程Hindawi
  4. 一元三次方程求解c语言
  5. Android 实现沉浸式体验
  6. 一图看懂80年“AI革命”简史
  7. 如何看待第三方百度云 Pandownload 作者被捕?
  8. python numpy 计算标准差
  9. 揭开神秘的莫比乌斯环异形创意LED显示屏的柔性显示之美。
  10. ClickHouse 之 FORMAT 应用