BM算法--串匹配】的更多相关文章

BM(Boyer-Moore)算法,后缀匹配,是指模式串的比较从右到左,模式串的移动也是从左到右的匹配过程,一般情况比KMP算法要快.时间复杂度O(m/n) C++描述(教师版) int BM(char S[],char T[], int n, int m) { //主串长度为n,模式串长度为m,主串和模式串的数组下标从1开始 int i=m; int j; while(i<=n){ j=m; while(j>0&&S[i]==T[j]){ j--; i--; } if(j==…
基础数据结构——字符串2 病毒IITime Limit: 1000 MS Memory Limit: 10240 KTotal Submit: 284(138 users) Total Accepted: 177(135 users) Rating: Special Judge: NoDescription自从计算机病毒的概念被提出之后,病毒的种类可以说是层出不穷.现在,单纯的病毒是逃不过杀毒软件的.因此现在的病毒往往隐藏一些字符之中来达到蒙混过关的目的.已知连续的字符串"bkpstor&quo…
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…
前言 Boyer-Moore算法是一种基于后缀匹配的模式串匹配算法(简称BM算法),后缀匹配就是模式串从右到左開始比較,但模式串的移动依旧是从左到右的.在实践中.BM算法效率高于前面介绍的<KMP算法>,算法分为两个阶段:预处理阶段和搜索阶段:预处理阶段时间和空间复杂度都是是O(m+sigma),sigma是字符集大小.一般为256.在最坏的情况下算法时间复杂度是O(m*n):在最好的情况下达到O(n/m). BM算法实现 BM算法预处理过程 BM算法有两个规则分别为坏字符规则(Bad Cha…
参考资料: http://blog.csdn.net/eric491179912/article/details/6210009   http://blog.163.com/pengfeicui@yeah/blog/static/106403250201092681158650/     这里,我们仅仅用了坏字符规则 定义一个滑动距离函数: dist(C)=  1)  m – j                          j =  max{j| tj = c && 1<= j…
目录 BM算法 一. 字符串比较的分析 二.BM算法的思想 三.算法实现 BM算法 @ 一. 字符串比较的分析 如果要判定长度为\(n\)两个字符串相等,比较中要进行\(n\)比较,但是如果要判定两个字符串不相等,只需要找出一个不相等的位置,因此可以得到如下结论: 结论1:判定字符串相等和判定字符串不相等的代价不同,判定不相等的代价更小 在KMP算法中,每发生一次失配时,算法总是尝试根据已经获得的匹配成功的信息来确定一个新的对齐位置,也即KMP算法是在尝试判断两个字符串相等,根据结论1,这种做法…
BM算法,全称是Boyer-Moore算法,1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了一种新的字符串匹配算法. BM算法定义了两个规则: 1.坏字符规则:当文本串中的某个字符跟模式串的某个字符不匹配时,我们称文本串中的这个失配字符为坏字符,此时模式串需要向右移动,移动的位数 = 坏字符在模式串中的位置 - 坏字符在模式串中最右出现的位置.此外,如果"坏字符"不包含在模式串之中,则最右出现位置为-1.2.好后缀规则:当字符失配…
//字符串匹配 public class StringCmp { //约定:A主串长 n ,B模式串 长m.要求:在A串中找到B串匹配的下标 //BM算法:从B串和A串尾部开始比较,希望一次将B串向后滑动尽量多的位数, // 以跳过不匹配的情况,理想情况的时间复杂度是 O(n/m) // // A A----------*==--------- // B B---*== *为在A中的坏字符,*在B中的相同位置 // *右边的部分,2个=号表示匹配到的好后缀 // B向右滑动 B---*== 向右…
BM算法根据两个判据来进行字符串匹配,分别是“坏字符规则”和‘好后缀规则",其中好后缀规则可以单独使用,算法的图解可以参照下面这篇博文: https://www.cnblogs.com/wxgblogs/p/5701101.html 采用Python语言对BM算法进行实现,实现过程分为3个函数,主循环函数和两个判据的数组生成函数. def my_BM(t,p): '''bm算法的自我实现,在t串中匹配p串,从模式串的尾部开始匹配''' '''需要坏字符数组badchar[]和好后缀数组goods…
我们在字符串匹配算法(一)学习了BF算法和RK算法,那有没更加高效的字符串匹配算法呢.我们今天就来聊一聊BM算法. BM算法 我们把模式串和主串的匹配过程,可以看做是固定主串,然后模式串不断在往后滑动的过程.当遇到不匹配的字符时,BF算和RK算法的做法是,把模式串向后滑动一位,然后从模式串的第一位开始重新匹配.如下图所示. 由于BF算法和RK算法,在遇到不匹配的字符时,模式串只是向后滑动一位,这样的话时间复杂度比较高,那有没有什么算法可以一下子多滑动几位呢?比如遇到主串A中的字符d,由于d不在模…
Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:http://www.searchtb.com/2011/07/%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8C%B9%E9%85%8D%E9%82%A3%E4%BA%9B%E4%BA%8B%EF%BC%88%E4%B8%80%EF%BC%89.html C语言代码实现转自: htt…
http://www-igm.univ-mlv.fr/~lecroq/string/node14.html http://www.cs.utexas.edu/users/moore/publications/fstrpos.pdf BM算法 后缀匹配,是指模式串的比较从右到左,模式串的移动也是从左到右的匹配过程,经典的BM算法其实是对后缀蛮力匹配算法的改进.为了实现更快移动模式串,BM算法定义了两个规则,好后缀规则和坏字符规则,如下图可以清晰的看出他们的含义.利用好后缀和坏字符可以大大加快模式串…
原文链接www.cnblogs.com/zhouzhendong/p/Berlekamp-Massey.html 前言 BM算法用于求解常系数线性递推式. 它可以在 $O(n^2)$ 的时间复杂度内解决问题. 由于许多问题会涉及线性递推,所以 BM 算法将会有不错的应用. 问题模型 给定一个有 $n$ 个元素的数列 $a$,其中第 $i$ 个元素是 $a_i$ . 求一个 较短/最短 的数列 $b$,假设 $b$ 有 $m$ 个元素,那么要求满足 $$\forall m<i\leq n, \ \…
BM算法 用来求解一个数列的递推式. 即给定\(\{x_i\}\)求解一个\(\{a_i\}\),满足\(|a|=m,x_n=\sum_{i=1}^ma_i*x_{n-i}\). 考虑增量法构造. 假设当前有一个长度为\(m\)的\(\{a\}\)满足条件,并且对于\(x_{1..n-1}\)都满足递推关系. 定义\(delta=\sum_{i=1}^m a_i*x_{n-i}-x_i\).如果\(delta\)显然满足递推关系,不用管. 否则不满足,那么我们就要\(fix\)一下锅.那么我们就…
BM算法是比KMP算法更快的字符串模式匹配算法.BM算法最好情况下的时间复杂度是O(n),KMP算法最好情况下的时间复杂度是O(n+m),两者最坏情况下的时间复杂度均是O(m*n).其中,n指目标串长度,m指模式串长度. KMP算法从左向右比较,通过失配时已匹配的字符信息来确定下一次匹配时模式串的起始位置.BM算法从右向左比较,运用了两种启发式规则:坏字符规则和好后缀规则,取这两种规则的跳跃距离大者作为P向右跳跃的距离. BM算法的基本流程:设目标串T,模式串为P.首先将T与P进行左对齐,然后进…
因项目需要使用字符串查询算法,在网上搜搜了半天,没有找到C#版的. 索性根据BM机制,用C#实现了一遍.现在贴出了,以备忘记. /// <summary> /// BM算法 /// </summary> /// <param name="source"></param> /// <param name="subString"></param> /// <returns></re…
BM递推杜教版是在整数取模的情况下的, 这个可以求解实数系数,但是可能有精度误差. 若一个问题的结论是通过推线性递推式来解,考虑到实际的情况,可以用BM算法的模板,先输入项数再依次输入项,项越多越准确(按道理,前k项的递推,只需要2*k 个初始项就能确定) #include <bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=int(a);i<int(b);++i) #define mem(a,p) mems…
[模板]线性递推+BM算法 给出一个数列 \(P\) 从 \(0\) 开始的前 \(n\) 项,求序列 \(P\) 在\(\bmod~998244353\) 下的最短线性递推式,并在 \(\bmod~ 998244353\) 下输出 \(P_m\). \(m\leq 10^9,1\leq n\leq 10000\) 保证递推式最长不超过 \(5000\). Berlekamp-Massey 算法 Berlekamp-Massey 算法,常简称为 BM 算法,是用来求解一个数列的最短线性递推式的算…
BM算法: 希望大家别见怪,当前博客只用于个人记录所用. [例题]Poor God Water 题意: 有肉,鱼,巧克力三种食物,有几种禁忌,对于连续的三个食物, 1.这三个食物不能都相同: 2.若三种食物都有的情况,巧克力不能在中间: 3.如果两边是巧克力,中间不能是肉或鱼. 求方案数 要求任意连续三个小时不能出现aaa,bbb,ccc,abc,cba,bab,bcb (假设b为巧克力) 然后进行推导,其实可以用矩阵快速幂 或者 BM算法. 复制粘贴一下CJY学长的代码: #include <…
参考于: https://www.luogu.org/problemnew/solution/P4723 shadowice1984 (太难) https://www.cnblogs.com/zhgyki/p/9671855.html (玄学) 居然还有解释: https://www.cnblogs.com/zhouzhendong/p/Berlekamp-Massey.html 线性递推BM算法,把前面的8-10项push进去? 下面是板子,求第n项调用参数是n-1. #include<bit…
一.BM算法介绍 BM算法(Boyer-Moore算法)是罗伯特·波义尔(Robert Boyer)和杰·摩尔(J·Moore)在1977年共同提出的.与KMP算法不同的是,BM算法是模式串P由左向右移动,而字符的比较时由右向左进行.当文本字符与模式不匹配时,则根据预先定义好的"坏字符串偏移函数"和"好后缀偏移函数"计算出偏移量.它的简化版本BMH或整个算法通常在文本编辑器中用于"搜索"和"替代"命令.该算法从最右边的字符开始…
前面介绍在BF,KMP这些算法的时候老是提到BM这个东西,究竟这什么东西,有啥高深的,这些问题我们如今不去考虑.不知道,认真读前几篇文章的读者有没有发现前面的算法都是从模式串的前面開始匹配的,那我们就想能不能从模式串的后面開始匹配了? 答案肯定是能够的.所以这就有了我们今天的这篇文章Horspool算法,这个算法是基于字符串后缀的匹配算法. 在上一篇文章中,我们学习了一个概念叫好字符(又叫好后缀),大家都知道有好必有坏吧,所以我们今天再来学习一个概念-----坏字符. 一.坏字符与模式串滑动 坏…
各种文本编辑器的"查找"功能(Ctrl+F),大多采用Boyer-Moore算法. Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解.1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了这种算法. 下面,我根据Moore教授自己的例子来解释这种算法. 1. 假定字符串为"HERE IS A SIMPLE EXAMPLE",搜索词为"EXAMPLE". 2. 首先,"字符串&…
一种nb算法,可以求出数列的递推式. 具体过程是这样的. 我们先假设它有一个递推式,然后按位去算他的值. ;j<now.size();++j)(delta[i]+=1ll*now[j]*f[i-j-]%mod)%=mod; 这是我们算出了f[i]应当是多少,但是f[i]有可能不是我们算出的值,所以我们记录一个delta,为我们算出的值减去f[i]的结果. 然后查看一下之前有没有出过锅. 如果出过,那么就补一个0,然后塞过去.. if(!cnt){now.resize(i);cnt++;conti…
之前网上看的若干算法,无非两个原则:坏字符原则.好后缀原则.按照算法所述实现了一个版本,但发现其效率还不如本文所述的实现方式.个人分析效率较低的原因可能是因为不断地向前找坏字符或者好后缀来确定跳跃距离导致的,不断的比对操作应该是影响效率的根源. 下面贴一段实现较简单的方法,感谢之前的领导磊哥,实现参照了他的代码. PS:大概看了下ClamAV的BM实现,感觉很复杂. #define BM_TAB_LEN (256) uint64_t *InitBMTab(const uint8_t *In_ui…
存一个链接,讲得好啊! 点击这里打开     字符串KMP 点击这里打开     字符串匹配的Boyer-Moore算法…
最近算法中学到了Horspool,KMP,BM三种算法.接下来给大家做个分享. Horspool算法: 算法思路: 1.分为匹配串,原串 2.从右往左依次匹配: 一旦遇到不匹配的,原串相对于匹配串 移动table[i]个字符               3.table[]由原串每个字符索引到原串每个字符相对于匹配串最右边一位的距离 移动规律: t(c) = {模式的长度m (如果c不包括在模式的前m-1个字符中) 模式前m-1个字符中最右边的c到模式最后一个字符的距离 (其他情况)…
主串 s:A B D A B C A B C 子串 t:  A B C A B 问题:在主串 s 中是否存在一段 t 的子串呢? 形如上述问题,就是串匹配类问题.[串匹配--百度百科] 串匹配问题是一项有着非常多应用的重要技术,KMP匹配算法就是其中一种高效的字符串匹配算法. 在KMP算法之前先介绍一下BF算法,BF算法又名暴力匹配算法,该算法在匹配的时候把子串依次从主串的起始位置开始匹配,若匹配失败再从主串的下一个位置开始,子串重新从头开始匹配-- BF算法 int BF(char *str,…
(1) n是指要找该数列的第n项. (2) 往vec中放入该数列前几项的值,越多越精确. #include<set> #include<cmath> #include<vector> #include<string> #include<cstdio> #include<cassert> #include<cstring> #include<algorithm> using namespace std; #def…
下面是代码:BM是什么参考阮一峰老师的讲解  点击打开链接 #include<iostream> #include<algorithm> #include<string.h> #include<string> #include<stdio.h> #include<stdlib.h> #include<math.h> #include<vector> #include <time.h> #includ…