最详BF算法和KMP算法

这篇具有很好参考价值的文章主要介绍了最详BF算法和KMP算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  作者简介:大家好我是小唐同学(๑>؂<๑),为梦想而奋斗的小唐,让我们一起加油!!!

最详BF算法和KMP算法

个人主页:小唐同学(๑>؂<๑)的博客主页

博友们如果也是新手入门数据结构我希望大家可以多加练习 数据结构题库在牛客网就有已经给大家附上链接,可以直接点击跳转:刷题点这里

牛客网支持ACM模式哦,刷算法题也很推荐哦!!!

下面上文章------》

最详BF算法和KMP算法

 

BF算法和KMP算法可以说是串中重要的算法,也是数据结构必学算法,我以前是不太理解KMP算法的,但是现在说来可以写出程序 理解思想了 也能懂了next数组,若有错误清在评论区指出,一起探讨。

目录

一、BF算法

1.理解阶段

2.代码阶段

 二、KMP算法

1.理解阶段

1.next数组的获得代码

 2.KMP算法代码如下:

三.BF算法与KMP算法的区别与优缺点


一、BF算法

1.理解阶段

算法中最紧要的是理解一个算法的思想,就像是人一样,没有思想与行尸走肉无异,算法是一样的。BF算法的时间复杂度最理想为O(n)    ------n为子串的长度

 最不理想为O(n*m)            ------------------m为主串长度

BF算法又称为简单模式匹配算法     其思想简单  容易理解 但是效率较低(需要回溯)

最详BF算法和KMP算法

第一次进行模式匹配   匹配到第3个字符  匹配错误。

最详BF算法和KMP算法

进行第2次模式匹配,本次匹配会把子串回溯到起点  主串会回溯到上次进行匹配的起点的下一个位置   可以看到到子串的第2个字符匹配失败 重新回溯

最详BF算法和KMP算法

 第3次进行模式匹配 同上回溯方法   到第5个字符匹配失败 重新回溯

最详BF算法和KMP算法

第4次进行模式匹配   匹配成功

2.代码阶段

如果说理解重要,但是只处于理解阶段对于一个程序员是远远不够的,还要有代码能力。

先给出BF算法部分代码     

我定义返回型为int型   返回第一次出现的位置

int creatBF(char *a,char *b)
 { 
 //a主串    b子串 
 int i=0,j=0,x=0;
 while(i<strlen(a)&&j<strlen(b)) //子串主串都没有到达最后   到达最后说明匹配不成功 
 {
 	if(a[i]==b[j])
	 {
	 	i++;
	 	j++;
	  } 
 	else
 	{
 		i=x+1; //x存储上一次开始的起点 
		 j=0;    //回溯 
		 x=i;     //记录本次开始的起点 
	 }
 }
 	//跳出循环  则到达a的长度或到达b的长度
	 //到达a    则说明匹配成功
	 //到达b    则说明 匹配不成功 
 	if(j==strlen(b))
 	{
 		return x;
	 }
	 return 0;
 }

测试结果如下:

最详BF算法和KMP算法

 二、KMP算法

1.理解阶段

KMP算法是BF算法的升级版   相对来说是  理解难度上升 但是效率得到了提高

KMP算法相对与BF算法  是主串不需要回溯   子串是回溯到特定的位置  可以有效减少比较次数

较少运行时间  提高效率

子串回溯   主要看next数组    ,我的理解是next数组是next数组的值-1表示最长前缀的下标

最详BF算法和KMP算法

 最详BF算法和KMP算法

当子串主串发生失配时   主串不发生回溯,子串会回溯到最长相等前后缀数值的位置

而记录最长相等前后缀的就时next数组 next[j]=k  表示子串中前j-1个字符的最长相等前后缀长度为k-1

下面给出获得next数组的代码

1.next数组的获得代码

void GetNext(char *a,int next [])
{
	//a主串    b子串 
	int j=0; //便利子串 
	int k=-1;  //k时子串中每个字符的next值     
	next[0]=-1;  
	while(j<strlen(a)) 
	{
		
	if(k==-1||a[j]==a[k])	
		{
			j++;
			k++;
			next[j]=k;
		}
		else
		k=next[k];
	}
	
}

测试结果如图:

最详BF算法和KMP算法

 2.KMP算法代码如下:

KMP算法的核心在于求next数组     剩下的就是进行比较

int creatKMP(char *a,char *b,int next[])
{ 
//a  主串   b子串 
	int i=0,j=0;
	while(i<strlen(a)&&j<strlen(b))
	{
		if(j==-1||a[i]==b[j])
		{
			i++;
			j++;
		}
		else
		j=next[j];
	}
	if(j>=strlen(b))
{
return (i-strlen(b));//i表示  查找结束在主串中的位置减去子串长度  为首位置 
}
else 
return -1;	
 } 

测试结果如图:

最详BF算法和KMP算法

 下面我会给出完整的程序,包括BF和KMP算法 如下:

# include <stdio.h>
#include <string.h>
void GetNext(char *a,int next [])
{
	//a主串    b子串 
	int j=0; //便利子串 
	int k=-1;  //k时子串中每个字符的next值     
	next[0]=-1;  
	while(j<strlen(a)) 
	{
		
	if(k==-1||a[j]==a[k])	//表示判断加入后缀 j后是否与会 使最长前后缀增加 a[k] 表示最长前缀的后一个 
		{
			j++;    
			k++;        
			next[j]=k;    
		}
		else
		k=next[k]; 
	}
	
}
int creatKMP(char *a,char *b,int next[])
{ 
//a  主串   b子串 
	int i=0,j=0;
	while(i<strlen(a)&&j<strlen(b))
	{
		if(j==-1||a[i]==b[j])
		{
			i++;
			j++;
		}
		else
		j=next[j];
	}
	if(j>=strlen(b))
{
return (i-strlen(b));//i表示  查找结束在主串中的位置减去子串长度  为首位置 
}
else 
return -1;	
 } 
 int creatBF(char *a,char *b)
 { 
 //a主串    b子串 
 int i=0,j=0,x=0;
 while(i<strlen(a)&&j<strlen(b)) //子串主串都没有到达最后   到达最后说明匹配不成功 
 {
 	if(a[i]==b[j])
	 {
	 	i++;
	 	j++;
	  } 
 	else
 	{
 		i=x+1; //x存储上一次开始的起点 
		 j=0;    //回溯 
		 x=i;     //记录本次开始的起点 
	 }
 }
 	//跳出循环  则到达a的长度或到达b的长度
	 //到达a    则说明匹配成功
	 //到达b    则说明 匹配不成功 
 	if(j==strlen(b))
 	{
 		return x;
	 }
	 return 0;
 }
int main()
{
	char a[13];
	char b[5];
	scanf("%s%s",a,b);
int t=creatBF(a,b);
	 	printf("%d\n",t);
int next[5];
GetNext(b,next);
//for(int i=0;i<5;i++)
//{
//		printf("%d ",next[i]);
//}
int y=creatKMP(a,b,next);
printf("%d",y); 
}

三.BF算法与KMP算法的区别与优缺点

BF算法是子串主串都需要进行回溯比较浪费时间,效率比较低。

KMP算法是主串不需要回溯,子串只需要根据next数组进行回溯到特定位置文章来源地址https://www.toymoban.com/news/detail-406650.html

到了这里,关于最详BF算法和KMP算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《数据结构》实验报告四:串的模式匹配(BF算法、KMP算法)

    1、了解 串 的基本概念。 2、掌握 串的模式匹配算法 的实现 。 说明以下概念 1、模式匹配:          串的模式匹配就是 子串的定位运算 。          设有两个字符串 S 和 T ,S为 主串(正文串) ,T为 子串(模式串) 。在主串S中查找与模式串T相匹配的子串,若匹配成功,确定

    2024年02月01日
    浏览(43)
  • 【数据结构】字符串匹配|BF算法|KMP算法|next数组的优化

    字符串匹配算法是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目,本文主要介绍BF算法(最好想到的算法,也最好实现)和KMP算法(最经典的) BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标S的第一个字符与模式串T的第一

    2024年02月04日
    浏览(42)
  • 【Java】BF算法(串模式匹配算法)

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

    2024年02月11日
    浏览(22)
  • 匹配模式BF算法

    题目:疫情暴发,专家发现了一种新型环状病毒,这种病毒的DNA序列是环状的,而人类的DNA序列是线性的。专家把人类和病毒的DNA表示为字母组成的字符串序列,如果在某个患者的DNA中发现这种环状病毒,说明该患者已被感染病毒,否则没有感染。例如:病毒的DNA为“aabb”,

    2024年02月11日
    浏览(25)
  • BF算法详解(C语言实现)

    本文主要介绍了BF算法的主要思想、具体流程、C语言代码实现以及自己对该算法的一些感悟 ps:第一次写博客,如有不妥之地,还望各位大佬指正。 BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法。 其主要思想为将目标串S(以下简称S)和模式串T(以下简称T)里的

    2023年04月19日
    浏览(34)
  • 数据结构:串:第1关:基于BF算法的病毒感染监测

    任务描述 医学研究者最近发现了某些新病毒,通过对这些病毒的分析,得知它们的DNA序列都是环状的。现在研究者收集了大量的病毒DNA和人的DNA数据,想快速检测出这些人是否感染了相应的病毒。为方便研究,研究者将人的DNA和病毒的DNA均表示成由一些小写字母组成的字符串

    2024年02月05日
    浏览(31)
  • edcoder数据结构第1关:基于BF算法的病毒感染监测

    来源BJFUOJ 任务描述 医学研究者最近发现了某些新病毒,通过对这些病毒的分析,得知它们的DNA序列都是环状的。现在研究者收集了大量的病毒DNA和人的DNA数据,想快速检测出这些人是否感染了相应的病毒。为方便研究,研究者将人的DNA和病毒的DNA均表示成由一些小写字母组

    2024年02月08日
    浏览(34)
  • BFU数据结构头歌实验:基于BF算法的病毒感染检测

    这道题当初我想着直接抄课本上的BF代码,结果发现书中的代码都是默认模式串和主串的下标从零开始,因此需要将书中的代码进行修改。如下图所示,需要将变量i,j的初值都设为0。然后将书中出现的i,j全部加1即可。然后这个函数中的第三个参数,pos的值我没有使用,这个

    2024年02月06日
    浏览(44)
  • 图解KMP算法,带你彻底吃透KMP

    KMP算法 一直是一个比较难以理解的算法,本篇文章主要根据《大话数据结构》中关于KMP算法的讲解,结合自己的思考,对于KMP算法进行一个比较详细的解释。 由于博主本人水平有限,难免会出现一些错误。如果发现文章中存在错误敬请批评指正,感谢您的阅读。 字符串模式

    2024年02月08日
    浏览(42)
  • 【算法思维】-- KMP算法

    OJ须知: 一般而言,OJ在1s内能接受的算法时间复杂度:10e8 ~ 10e9之间(中值5*10e8)。在竞赛中, 一般认为计算机1秒能执行 5*10e8 次计算 。 时间复杂度 取值范围 o(log2n) 大的离谱 O(n) 10e8 O(nlog(n)) 10e6 O(nsqrt(n))) 10e5 O(n^2) 5000 O(n^3) 300 O(2^n) 25 O(3^n) 15 O(n!) 11 时间复杂度排序: o(1)

    2024年02月06日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包