数据结构19: BF算法(普通模式匹配算法)
判断两个串之间是否存在主串与子串的关系,这个过程称为串的模式匹配。
普通的模式匹配(“BF”算法)
判断两个串是否存在子串与主串的关系,最直接的算法就是拿着模式串,去和主串从头到尾一一比对,这就是“BF”算法的实现思想。
将提供的模式串(例如 “abcac” )从主串的第一个字符开始,依次判断相同位置的字符是否相等,如果全部相等,则匹配成功;反之,将子串向后移动一个字符的位置,继续与主串中对应的字符匹配。
算法运行过程:(图中,i 和 j 表示匹配字符在数组中的位置下标)

如图所示,第一次匹配,模式串和主串匹配到第三个字符时,匹配失败;模式串向右移动一个字符的位置,还是从第一个字符 ‘a’ 和主串的第二个字符 ‘b’ 相匹配,匹配失败;模式串继续后移一个字符的位置,继续匹配。
实现代码:
- #include <stdio.h>
- #include <string.h>
- int sel(char *S, char *T)
{- int i = , j = ;
- while (i<strlen(S) && j<strlen(T))
{- if (S[i] == T[j])
{- i++;
- j++;
- }
else
{- i = i-j+;
- j = ;
- }
- }
- //跳出循环有两种可能,i=strlen(S)说明已经遍历完主串;j=strlen(T),说明模式串遍历完成,在主串中成功匹配
- if (j == strlen(T))
{- return i-strlen(T)+;
- }
- //运行到此,为i==strlen(S)的情况
- return ;
- }
- int main()
{- int add = sel("ababcabcacbab", "abcac");
- printf("%d", add);
- return ;
- }
- 运行结果:
“BF”算法的时间复杂度
“BF” 算法在最理想的情况下的时间复杂度为O(m)
( m 是模式串的长度,也就是第一次匹配就成功的情况)。
一般情况下,"BF"算法的时间复杂度为O(n+m)
(n是主串的长度,m是模式串的长度)。
最坏的情况下的时间复杂度为O(n*m)
(例如主串 S 为“000000000001”,模式串 T ”001”,每次匹配时,直到匹配最后一个元素,才得知匹配失败,运行了 n*m 次)。
总结
“BF”算法在进行模式匹配时,从主串的第一个字符开始,每次失败,模式串向后移动一个字符的位置,继续匹配,无脑式操作。但是整个算法受测试数据的影响非常大,在解决实际问题时,由于数据量庞大,时间复杂度往往会很高。
所以,对在“BF”算法的基础上,对其做了改进,就是下一节要讲的“KMP”算法。
数据结构19: BF算法(普通模式匹配算法)的更多相关文章
- 数据结构之BF算法,kmp算法,三元组,十字链表总结
在这一章中,老师教了我们四种数据结构:BF算法,kmp算法,三元组和十字链表:还给我们讲了2019年团体天体赛中T1-8的AI题 1.对于BF和kmp算法,老师除了在课堂上讲解算法的主要核心思想外,还 ...
- 数据结构:BF算法
贴上源代码: #include<iostream> using namespace std; int BF(char S[],char T[]) { int i,j; i = j = 0; ...
- 数据结构4_java---顺序串,字符串匹配算法(BF算法,KMP算法)
1.顺序串 实现的操作有: 构造串 判断空串 返回串的长度 返回位序号为i的字符 将串的长度扩充为newCapacity 返回从begin到end-1的子串 在第i个字符之前插入字串str 删除子串 ...
- 数据结构20:KMP算法(快速模式匹配算法)详解
通过上一节的介绍,学习了串的普通模式匹配算法,大体思路是:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个过程称为“指针回溯”),同时 ...
- BF算法(串模式匹配算法)
主串和子串 主串与子串:如果串 A(如 "shujujiegou")中包含有串 B(如 "ju"),则称串 A 为主串,串 B 为子串.主串与子串之间的关系可简 ...
- 字符串与模式匹配算法(一):BF算法
一.BF算法的基本思想 BF(Brute Force)算法是模式匹配中最简单.最直观的算法.该算法最基本的思想是从主串的第 start 个字符起和模式P(要检索的子串)的第1个字符比较,如果相等,则逐 ...
- 串、串的模式匹配算法(子串查找)BF算法、KMP算法
串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3…….an ' n ...
- 数据结构(三)串---BF算法(朴素模式匹配)
(一)BF算法了解 BF算法,即暴风(Brute Force)算法,是普通的模式匹配算法.BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T ...
- 数据结构和算法(Golang实现)(19)排序算法-冒泡排序
冒泡排序 冒泡排序是大多数人学的第一种排序算法,在面试中,也是问的最多的一种,有时候还要求手写排序代码,因为比较简单. 冒泡排序属于交换类的排序算法. 一.算法介绍 现在有一堆乱序的数,比如:5 9 ...
随机推荐
- HDLM命令dlnkmgr详解之三__view
view命令主要用于显示program information, path information, LU information, HBA port information, CHA port in ...
- 10-19C#基础--第四部分类型(2)重点
类型: 一.数字:Math类型 1)Math.Ceiling() ( 表示进位.));//只要小数点后有值,就向前进一位,取上限. string s = Console.ReadLine(); dou ...
- iOS 给Main.storyboard 添加button 事件《转》
XCODE中使用Main.Storyboard拉入控件并实现事件(Swift语言) 如何在XCODE中的Main.Storyboard内拉入控件并实现一个简单的效果呢?本人由于刚接触Swift语言 ...
- django的render的说明
return render(request,"homesite.html",locals()) homesite.html页面中的所有内容都可以被渲染,不论是标签还是js代码,包括 ...
- Java Swing 如何让窗体居中显示
如题,其他不多说,直接上代码! package com.himarking.tool; import java.awt.Toolkit; import javax.swing.JFrame; @Sup ...
- java判断姓是否合格 百家姓
package util; import java.lang.reflect.Array; public class FirstName { public static boolean ClearNa ...
- pthon之函数式编程
函数式编程是一种抽象计算的编程范式. 不同语言的抽象层次不同:计算机硬件->汇编语言->C语言->Python语言 指令 -> ->函数 ...
- day35-hibernate映射 04-Hibernate的一级缓存:一级缓存的存在
数据源:文件和数据库.从内存中获取,不用去数据库发送SQL语句查询了.缓存技术是hibernate的一个优化的手段.Session结束了,一级缓存就没了,就销毁了.SeesionFactory没了,二 ...
- 初阶html学习总结(一)(转)
一:颜色代码 如果你想使用某种颜色,取得它的颜色值即可.比如,您想改变某些文字的颜色,您可以使用下面的代码:<font color=#ffc060 size=2>改变#符号后的代码即可改变 ...
- SQl Server Tsql基本编程 ,循环语句 ,存储过程
一些比较重要但是不一定经常用的 句子 Tsql定义变量 declare @a int : 定义的变量前面必须用@,数据类型是SQL里的数据类型,执行的时候要把需要的有关联的代码一起执行,单独执行一条 ...