BF,KMP,BM算法以及完整代码

串匹配——bfkmpbm算法 问题描述:给定一个文本,在该文本中查找并定位任意给定字符串:给定两个串和,在主串S中查找子串T的过程,T为模式。 1、bf算法 蛮力法 对主串与模式串一个一个进行比较,若不匹配,则模式串从第一个字符开始,主串往后一个字符,再进行下一趟比较;若匹配,则模式串与主串字符往后进行比较。 直到主串s所剩字符长度小于模式串t长度或模式串所有字符比较完毕。 #include<stdio.h&... 阅读详情

BF,KMP,BM算法详解

1.实验题目

给定一个文本,在该文本中查找并定位任意给定字符串。

2.实验目的

1.深刻理解并掌握蛮力法思想。

2.提高蛮力法设计算法的技能。

3.理解这样一个观点:用蛮力法设计的算法,一般来说,经过适度的努力后,都可以对算法的第一个版本进行一定程度的改良,改进其时间性能。

3.实验要求

实现BF、KMP算法,实现BM算法

4.算法思想与核心代码

(1)BF算法

BF算法其实思路相对简单,总的来说,就是模式串与主串“一对一”匹配,如果匹配失败,子串回溯到头部,并且从模式串的下一个元素开始与子串头匹配。时间复杂度较高,为O(m*n),m为模式串长度,n为主串长度,以下都是。

BF代码
//BF
int BF(const char s[],const char t[])
{
   
   
    int index=0;
    int i=0,j=0;
    while(s[i]!='\0'&&t[j]!='\0')
    {
   
   
        if(s[i]==t[j])
        {
   
      i++;
            j++;}
        else
        {
   
   index++,i=index,j=0;}
    }
    if(t[j]=='\0')
        return index+1;//不是下标
    else
        return index;
}

(2)KMP算法

KMP算法是相对于BF算法的改进,改进点主要是在主串的遍历上,主串只需遍历一遍,算法的精髓在于求最长相等的前后缀。

首先,需要理解几个概念:

通过举例说明:

字符串 abcdab
前缀的集合:{a,ab,abc,abcd,abcda}
后缀的集合:{b,ab,dab,cdab,bcdab}
最长相等的前后缀:ab

abcabfabcab中最长相等前后缀:abcab

KMP算法就是将已经匹配的串中,找到相等的前缀和后缀,然后将前缀移动到后缀的位置上,如下图:请添加图片描述

匹配,发现e和c不相等,比较“abcab”中的前后缀,发现有最长相等的前后缀“ab“,直接移动到如下图所示位置:

请添加图片描述

那么我们怎么求最长相等前后缀呢?

用一个next数组来求,next[i]表示前i个元素中最长相等前后缀的长度,若值为-1,则表示不可能出现最长相等前后缀。

例:我们用“ababc"这个字符串来求这个next数组:

当i=0时,因为前0个里面甚至连元素都没有,所以next[0]=-1;

当i=1时,前一个元素无最长相等前后缀,所以next[1]=0;

当i=2时,前两个元素为ab,无最长相等前后缀,next[2]=0;

当i=3时,前三个元素为aba,发现有最长相等前后缀,为“a”,且为一个,则next[3]=1;

当i=4时,前四个元素为abab,发现有最长相等前后嘴,为“ab”,且为两个,则next[4]=2;
注意,最后一个元素不计入next数组的计算范围内。

此时,next数组求解完毕。

求解next数组的代码
//next
void GetNext(int next[],const char t[])//t为模式串
{
   
   
    int i,j,len;
    next[0]=-1;
    for(j=1;t[j]!='\0';j++)
    {
   
   
        for(len=j-
字符串匹配(BF,BM,Sunday,KMP算法解析) 字符串匹配一直是计算机领域热门的研究问题之一,多种算法层出不穷。字符串匹配算法有着很强的实用价值,应用于信息搜索,拼写检查,生物信息学等多个领域。 今天介绍几种比较有名的算法: 1. BF 2. BM 3. Sunday 4. KMP—,BF算法 BF(Brute Force)算法又称为暴力匹配算法,是普通模式匹配算法。其算法思想很简单,从主串S的第pos个字符开 阅读详情

相关推荐

字符串匹配算法综述:BF、RK、KMPBM、Sunday

字符串匹配算法综述:BF、RK、KMPBM、Sunday

石沉溪洞 5657

BM算法完整实现C代码

大字符串查找时,效率会比线性查找好些; zip 解压后, 添加至console工程即可

比较BFKMPBM算法的性能(纯C语言实现,而且……VC6.0编译的程序跑得比codeblocks 17.12编译的快)

首先声明:BFKMP算法是刁肥宅自己实现的,BM算法源自此处,刁肥宅未曾妄加改动,只是作测试用。操作系统及硬件配置信息如图6所示,刁肥宅所用编译环境为:Code::Blocks 17.12、VC6.0(完整绿色版)。所用源代码与测试数据都已上传到百度云盘(提取密码:dhu0)与CSDN“我的资源-下载”上,各位看官可以免费下载亲测。 话不多说,先贴出三个算法的C语言...

u25th_engineer的博客 3785

BM(Boyer-Moore) 算法详解

BM算法(Boyer-Moore) 算法详细解读以及代码实现。 BM算法也叫做精确字符集算法,它是一种从右往左比较(后往前),同时也应用到了两种规则坏字符、好后缀规则去计算我们移动的偏移量的算法

weixin_45616285的博客 9106

深入理解BM算法(附上C++代码

BM算法 BM算法的一个特点是当不匹配的时候一次性可以跳过不止一个字符。即它不需要被搜索的字符串中的字符进行逐一比较,而会跳过其中的某些部分。通常搜索的关键字越长,算法速度越快。它的效率来源:对每一次失败的匹配尝试,算法都能够使用这些信息来排除尽可能多的无法匹配位置。它充分的利用待搜索字符串的一些特征,加快了搜索的步骤。 基于以下两个规则让模式每次向右移动的尽可能大的距离: 坏字符规则:当文本字符串中的某个字符跟模式串的某个字符不匹配时,我们称文本串中的这个失配字符为坏字符,此时模式串需要向右移动,移动的位

qq_52269550的博客 3127

BM算法的C/C++代码实现

目录关键完整代码 关键   BM算法是高效的字符串匹配算法,比KMP算法效率还高,全称为Boyer-Moore算法算法的基本原理可以看:阮一峰的博客:字符串匹配的Boyer-Moore算法,里面讲解得很详细。 使用代码实现该算法有两个关键点: 坏字符规则:模式串(短串)从后往前匹配到的第一个不符的字符称为坏字符。这时候只要找到当前坏字符在模式串上一次出现位置,就可:后移位数 = 坏字符的位置 - 搜索词中的上一次出现位置。得到匹配串(长串)的移动位数。 好后缀规则:从后往前匹配的相等子串即为好后缀。同

aruewds的博客 3057

字符串匹配常见算法BF,RK,KMPBM,Sunday)

  今日了解了一下字符串匹配的各种方法。   并对sundaysearch算法实现并且单元。 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目。此算法通常输入为原字符串(string)和子串(pattern),要求返回子串在原字符串中首次出现的位置。比如原字符串为“ABCDEFG”,子串为“DEF”,则算法返回3。常见的算法包括:BF(Brute Force,暴力检...

weixin_30572613的博客 273

java实现匹配字符串(附带源码)

java实现匹配字符串(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1225

数据结构算法(一)四种常见的字符串匹配算法BFKMPBM、Sunday)

四种常见的字符串匹配算法BFKMPBM、Sunday) 四种常见的字符串匹配算法BF算法,即暴力(Brute Force)算法 KMP算法 BM算法(Boyer-Moore字符串搜索算法) Sunday算法 现在有两个字符串,要从主串中匹配模式串首次出现位置 BF算法 BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符

yangwen-bo的博客 2064

漫画:什么是KMP算法

作者 | 小灰来源 |程序员小灰(ID:chengxuyuanxiaohui)————— 第二天 —————————————————前情回顾在字符串匹配算法的前两讲,我们分别介绍了...

CSDN资讯 1万+

串匹配问题-BF算法KMP算法BM算法

BF算法int BF(char A[], char B[]){ int i = 0, j = 0; while(A[i] != '\0' &amp;&amp; B[j] != '\0'){ if(A[i] == B[j]){ i++; j++; }else{ i = i - j...

壑壑哒的博客 1600

字符串匹配算法之暴力匹配、KMP算法BM算法

字符串匹配问题的关键是如何在最短的时间内找到模式字符串在文本中的出现位置。不同的匹配算法有不同的时间复杂度和适用场景。最直观的思路是通过逐字符比较来查找匹配,但这可能导致效率低下。因此,许多优化过的字符串匹配算法应运而生。我们将在本文中介绍三种经典的字符串匹配算法BF算法BM算法KMP算法。字符串匹配是计算机科学中一个基础且重要的问题,解决该问题的算法多种多样。本文介绍了三种经典的字符串匹配算法——BF算法BM算法KMP算法BF算法:简单直观,适合小规模匹配。BM算法

软件开发工程师 1279

探索数据结构:BFKMP的灵活应用

本文聚焦字符串匹配算法,重点阐述 BF 算法KMP 算法。介绍其概念、应用领域,详细剖析两种算法特点。深入探究,助您掌握关键知识,提升编程能力,快来一探究竟!

Bettysweetyaaa的博客 3146

字符串得模式匹配算法BFKMPBM以及Sunday算法

字符串得模式匹配操作:BFKMPBM以及Sunday算法 文章目录字符串得模式匹配操作:BFKMPBM以及Sunday算法介绍模式匹配BF算法KMP算法BM算法SunDay算法 介绍 模式匹配 模式串(字符串),要在另一个主串中查找是否存在与模式串相等的子串(主串中任意连续字符组成的子序列) BF算法 最简单最暴力 KMP算法 值得深入研究得算法。其中next数组的求值是理解kmp算法的关键。 public class KMP { /** * * @param

ITxiaofeixiang的博客 586

字符精确匹配算法bfkmpbm、sunday、rk

字符精确匹配算法bfkmpbm、sunday、rk bf算法又称暴力匹配算法bf算法的详解及代码 kmp算法的详解及代码 bm算法的详解及代码 sunday算法的详解及代码 rk算法的详解及代码

C_Q_H_come的博客 631

字符串搜索算法效率对比:BF\RK\BM\KMP\Sunday

字符串搜索算法效率对比:BF\RK\BM\KMP\Sunday。 统计了以上字符串搜索算法的耗时结果,并含有python版本的具体代码以供查阅。

weixin_45616285的博客 3105

字符串匹配算法大全JAVA版(BF、RK、BM以及KMP代码理解)

如果对这几个算法的原理尚有疑问,推荐文章 字符串匹配算法原理 BF算法(暴力算法) private static int bfSearch(String desString, String subString) { if (desString == null || subString == null) { return -1; } // 1、主串长度 int m = desString.length();

木易三水良 1417
下一篇: 词法分析程序(python)完整代码
暗黑小料理
博客等级 码龄5年 10粉丝 3原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值