字符串查找与匹配之BM算法

一、字符串查找:
1、在Word、 IntelliJ IDEA、Codeblocks等编辑器中都有字符串查找功能。
2、字符串查找算法是一种搜索算法,目的是在一个长的字符串中找出是否包含某个子字符串。

二、字符串匹配:
1、一个字符串是一个定义在有限字母表上的字符序列。
例如,ATCTAGAGA是字母表 E ={A,C,G,T}上的一个字符串。
2、字符串匹配算法就是在一个大的字符串T中搜索某个字符串P的所有出现位置。
其中,T称为文本,P称为模式,T和P都定义在同一个字母表E上。
3、字符串匹配的应用包括信息检索、拼写检查、语言翻译、数据压缩、网络入侵检测。

三、字符串查找与匹配算法:
1、朴素查找算法(Naive string search algorithm)
2、KMP算法(Knuth-Morris- -Pratt algorithm)
3、BM算法(Boyer-Moore string search algorithm)

问题:
给定一个文本T字符串和一个模式P字符串, 查找P在T中的位置。
记号:
m、n:分别表示T和P的长度。
E:T和P的字符都定义在同一个字母集E上。
Ti、Pj: T的第i个字符和P的第j个字符(以0起始)。其中0≤i<m,0≤j<n

(三)BM算法:

原文地址:https://www.cnblogs.com/ZengBlogs/p/12195606.html

时间: 2024-08-06 10:26:49

字符串查找与匹配之BM算法的相关文章

字符串查找以及KMP算法

字符串查找和匹配是一个很常用的功能,比如在爬虫,邮件过滤,文本检索和处理方面经常用到.相对与C,python在字符串的查找方面有很多内置的库可以供我们使用,省去了很多代码工作量.但是我们还是需要了解一些常用的字符串查找算法的实现原理. 首先来看python内置的查找方法.查找方法有find,index,rindex,rfind方法.这里只介绍下find方法.find方法返回的是子串出现的首位置.比如下面的这个,返回的是abc在str中的首位置也就是3.如果没找到将会返回-1 str = "dkj

字符串查找程序

/* 这是一个字符串查找程序 改编自<算法:c语言实现>P64 增加了一个对连续字符的检测的判别 例如查找aaa 但是你输入的是aaaa,其实只有一个aaa */ #include "stdio.h" #include "stdlib.h" #include "time.h" #define N 10000 int main(int argc, char *argv[]) { int i,j,t,temp[N],*ti=temp; c

Boyer-Moore(BM)算法,文本查找,字符串匹配问题

KMP算法的时间复杂度是O(m + n),而Boyer-Moore算法的时间复杂度是O(n/m).文本查找中“ctrl + f”一般就是采用的BM算法. Boyer-Moore算法的关键点: 从右遍历,如果有txt里面的i+j元素和pat里面的j元素不一致,调整.根据right[]调整,right[]类似与KMP算法里面的nextval.skip = j - right[txt.charat(i+j)]; if(skip < 1) skip = 1;  i+=skip; 即找txt里面的第i+j

字符串匹配算法 - BM算法

BM算法原理分析 BM 算法包含两部分,分别是 坏字符规则(bad character rule)和 好后缀规则(good suffix shift) 1.坏字符规则 我们从模式串的末尾往前倒着匹配,当我们发现某个字符没法匹配的时候.我们把这个没有匹配的字符叫做** 坏字符 **(主串中的字符) 当发生不匹配的时候,我们把坏字符对应的模式串中的字符下标记做si.如果坏字符在模式串中存在,我们把这个坏字符在模式串中的下标记做xi.如果不存在,我们把xi记做-1.那模式串往后移动的位数就等于si-x

Rabin-Karp指纹字符串查找算法

首先计算模式字符串的散列函数, 如果找到一个和模式字符串散列值相同的子字符串, 那么继续验证两者是否匹配. 这个过程等价于将模式保存在一个散列表中, 然后在文本中的所有子字符串查找. 但不需要为散列表预留任何空间, 因为它只有一个元素. 基本思想 长度为M的字符串对应着一个R进制的M位数, 为了用一张大小为Q的散列表来保存这种类型的键, 需要一个能够将R进制的M位数转化为一个0到Q-1之间的int值散列函数, 这里可以用除留取余法. 举个例子, 需要在文本 3 1 4 1 5 9 2 6 5 3

Rabin-Karp字符串查找算法

1.简介 暴力字符串匹配(brute force string matching)是子串匹配算法中最基本的一种,它确实有自己的优点,比如它并不需要对文本(text)或模式串(pattern)进行预处理.然而它最大的问题就是运行速度太慢,所以在很多场合下暴力字符串匹配算法并不是那么有用.我们需要一些更快的方法来完成模式匹配的工作,然而在此之前,我们还是回过头来再看一遍暴力法匹配,以便更好地理解其他子串匹配算法. 如下图所示,在暴力字符串匹配里,我们将文本中的每一个字符和模式串的第一个字符进行比对.

C++ string 字符串查找匹配

在写C++程序中,总会遇到要从一个字符串中查找一小段子字符串的情况,对于在C中,我们经常用到strstr()或者strchr()这两种方法.而对于C++的string,我们往往会用到find(). C++:#inlcude<string>C: #include<string.h> find():在一个字符串中查找一个指定的单个字符或字符数组.如果找到,就返回首次匹配的开始位置:如果没有查找到匹配的内容,就返回string::npos.find_first_of():在一个目标串中进

c数据结构的字符串查找的Brute-Force算法

#include<stdio.h> #include<malloc.h> #include<string.h> //定义字符串的结构体 typedef struct { char *str;//字符串 int maxLength;//最大可以存放字符的长度 int length;//目前的字符长度 }DString; //1.初始化操作 //初始化操作用来建立和存储串的动态数组空间以及给相关的数据域赋值 void Initiate(DString *s,int max,

一步一步写算法(之字符串查找 上篇)

原文:一步一步写算法(之字符串查找 上篇) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 字符串运算是我们开发软件的基本功,其中比较常用的功能有字符串长度的求解.字符串的比较.字符串的拷贝.字符串的upper等等.另外一个经常使用但是却被我们忽视的功能就是字符串的查找.word里面有字符串查找.notepad里面有字符串查找.winxp里面也有系统自带的字符串的查找,所以编写属于自己的字符串查找一方面可以提高自己的自信心,另外一方面在某