首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Boyer-Moore算法中,为什么“if (bmGs[j] == m)”是必要的?

在Boyer-Moore算法中,"if (bmGsj == m)"是必要的,因为它用于检查坏字符规则中的好后缀是否存在于模式字符串中。

Boyer-Moore算法是一种高效的字符串匹配算法,用于在文本中查找模式字符串的出现。它通过利用两个规则来跳过尽可能多的比较操作,从而提高匹配效率。这两个规则分别是坏字符规则和好后缀规则。

在坏字符规则中,当发现不匹配的字符时,算法会根据模式字符串中的字符在模式字符串中最后一次出现的位置,将模式字符串向右滑动一定的距离。这个距离由坏字符的位置决定。

而在好后缀规则中,当发现不匹配的字符时,算法会根据模式字符串中的好后缀的位置,将模式字符串向右滑动一定的距离。好后缀是指模式字符串中与文本中已匹配的后缀相匹配的子串。

在实现Boyer-Moore算法时,我们需要预先计算好后缀规则中的数组bmGs。这个数组存储了每个后缀在模式字符串中最右出现的位置。当发生不匹配时,我们根据bmGs数组中的值来确定滑动的距离。

在这个过程中,如果bmGsj等于m(模式字符串的长度),说明好后缀存在于模式字符串中,可以直接将模式字符串滑动到好后缀的位置。这样可以进一步减少比较操作,提高匹配效率。

总之,"if (bmGsj == m)"的判断是必要的,它用于检查好后缀是否存在于模式字符串中,以确定滑动的距离,从而提高Boyer-Moore算法的匹配效率。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

内存字符串暴力搜索定位代码

: Boyer-Moore字符匹配算法 Param: @text 要搜索缓冲区开始 @n 要搜索缓冲区大小 @pattern 需要匹配字符串 @m 需要匹配字符串长度 */ int BinarySearch...256; i++) {//一个字符占八位,共256个字符,把所有字符都覆盖到,这里初始化将所有字符失配时移动距离都赋值为m bmBc[i] = m; } for (i = 0; i < m...- 1; i++) {//针对模式串pattern存在每一个字符,计算出它们最靠右(非最后一个字符)地方距离串末尾距离,即它们失配时该移动距离,这一操作更新了初始化中一些字符移动距离...字符匹配算法 Param: @text 文本内容 @n 文本内容长度 @pattern 需要匹配字符串 @m 需要匹配字符串长度 */ int BinarySearch(unsigned char...bmGs[i]); } } return -1; } 1.1 Boyer-Moore实现 上面的代码有注释,也是这个相同实现 void preBmBc(char *x, int m, int

56610

从入门到精通之Boyer-Moore字符串搜索算法详解

①由来介绍 在用于查找子字符串算法当中,BM(Boyer-Moore算法目前被认为最高效字符串搜索算法,它由Bob Boyer和J Strother Moore设计于1977年。...字符集大小,一般为256; 搜索阶段时间复杂度O(mn); 当模式串是非周期性最坏情况下算法需要进行3n次字符比较操作; 算法最好情况下达到O(n / m),比如在文本串bn搜索模式串...(3)移动规则 BM算法移动规则是: 将3算法基本框架j += BM(),换成j += MAX(shift(好后缀),shift(坏字符)),即 BM算法每次向右移动模式串距离,按照好后缀算法和坏字符算法计算得到最大值...图中vtext坏字符(对应位置i+j),pattern对应不匹配位置为i,那么pattern实际要右移距离就是:bmBc[‘v’] – m + 1 + i。 ?...(2)计算好后缀数组bmGs[] 这里bmGs[]下标数字而不是字符了,表示字符pattern位置。 如前所述,bmGs数组计算分三种情况,与前一一对应。

1.5K80
  • 进击算法:字符串匹配 BM 算法

    进击算法:字符串匹配 BM 算法 BM 算法介绍 各种文本编辑器 "查找" 功能(Ctrl+F),大多采用 Boyer-Moore 算法。 ?...Boyer-Moore 算法不仅效率高,而且构思巧妙,容易理解。1977 年,德克萨斯大学 Robert S. Boyer 教授和 J Strother Moore 教授发明了这种算法。...总结下上面两种情况: u可以完整再次出现在x u后缀x前缀 坏字符 ? 我们找到 y[i+j]=b x中最右出现位置,如果没找到直接左对齐y[i+j+1]: ?...上面图中第一个说明尾部不匹配时候,我们查找字符apattern位置,假设i,则Pattern shift距离 n-i 第二说如果失配发生在patternj个位置,此时字符apattern...我们定义 l'(i) P[i..n]最长后缀同时也是P[1..n]前缀,如果不存在这样子前缀,则l'[i] = 0,此时含义说,此时shift=n,为什么移动最大呢?

    1.7K30

    为什么Jetson Orin上使用DLA必要

    关于DLA基本知识:一篇文章回答你关于NVIDIA DLA所有疑问 NVIDIADLA硬件专门用于深度学习操作固定功能加速器引擎。...NVIDIAJetson Orin SoC最多支持2个第二代DLA(第二代DLA功耗效率方面表现最佳),而Xavier SoC最多支持2个第一代DLA。...为什么Orin上使用DLA必要? DLA峰值性能对Orin总深度学习(DL)性能贡献38%至74%之间(取决于电源模式,详见下表)。...DLA平均比GPU功耗效率高3倍至5倍(取决于电源模式和工作负载),下表显示了JetPack 5.1.1下,根据不同电源模式,基于Jetson AGX Orin 64GBDLA相对于GPU性能与功耗比率...注意: Jetson AGX Orin 64GB30W和50W功率模式下DLA TOPs与用于汽车领域DRIVE Orin平台最大时钟频率相当。

    89330

    KMP、BM、Sunday等字符串匹配算法及实现

    利用已经匹配长度减去部分匹配值就可以得到模式串移动位数。其实大白话就是现在主串匹配子串模式串是否还存在,计算NEXT值时则是利用已经匹配模式串前缀和后缀,求前缀和后缀最大长度。...表示在当前模式串到T[j]遇到失配情况,模式串重新和主串匹配位置 public static int[] get_Next(String str){ //对str求出各个字符位置部分匹配值...//另一个则是依照好后缀规则得到应该移位数 //map存放模式串各个字符,以及字符模式串倒叙索引 private static void preBmBc(String pattern...length位置字符是否pattern存在,如果存在,则返回,找不到 //则返回-1; int i=pattern.length()-1; while(i>=0&&pattern.charAt...,设置一个标识符有时候还是蛮必要

    63420

    字符串匹配Boyer-Moore算法:文本编辑器查找功能如何实现

    至于选择哪一种字符串匹配算法不同场景有不同选择。 我们平时文档里字符查找里 ? 采用就是 Boyer-Moore 匹配算法了,简称BM算法。...接下来我们要在字符串查找有没有和模式串匹配字串,步骤如下: 坏字符 1、 ? 和其他匹配算法不同,BM 匹配算法从模式串尾部开始匹配,所以我们把字符串和模式串尾部对齐。...(2)坏字符模式串下标,我们上面那个例子,坏字符模式串下标为 4,我们用变量 t2 来代表这个下标,如图 ?...我们把这些能够成功匹配子串,称之为好后缀,所以呢,e,le,elp,mple 都是好后缀 因为 e, le, elp之前步骤,也是能够成功匹配。不过 mple 最长好后缀。...总结 这篇文章我采用直接举例子方式来讲,我觉得这样反而容易懂,并且过程,可能没有讲那么全,这是因为我不想说太全,因为把所有情况都罗列处理的话,相信你容易晕。

    1.8K30

    为什么StringJava不可变

    String Java 不可变。 不可变类只是一个无法修改其实例类。 创建实例时,将初始化实例所有信息,并且无法修改信息。 不可变类有许多优点。...本文总结了为什么 String 设计为不可变。 这篇文章从内存,同步和数据结构角度说明了不变性概念。 1. 字符串池 字符串池(String intern pool)方法区域中特殊存储区域。...如果字符串可变,则使用一个引用更改字符串将导致其他引用错误。 2. 缓存哈希码 字符串哈希码经常在 Java 中使用。 例如, HashMap 或 HashSet 。...(new String("b")); set.add(new String("c")); for(String a: set) a.value = "a"; 在此示例,如果 String 可变...字符串不是不可变,连接或文件将被更改,这可能会导致严重安全威胁。 该方法认为它连接到一台机器,但事实并非如此。 可变字符串也可能在 Reflection 引起安全问题,因为参数字符串。

    1.3K20

    Python 字符串匹配算法

    然而,Python 字符串匹配算法并不是一成不变,它会根据不同情况而使用不同算法。因此,了解 Python 字符串匹配算法非常有必要。...KMP算法基本思想比较两个字符串时,利用已经匹配子串信息来减少比较次数。KMP算法优点效率较高,时间复杂度为 O(m+n),其中 m 和 n 分别是字符串长度。...Boyer-Moore算法Boyer-Moore算法另一种改进字符串匹配算法Boyer-Moore算法基本思想比较两个字符串时,从字符串末尾开始,逐个字符地比较两个字符串。...Boyer-Moore算法优点效率较高,时间复杂度为 O(m+n),其中 m 和 n 分别是字符串长度。...以下一个使用Boyer-Moore算法 Python 实现字符串匹配函数:def boyer_moore_string_matching(text, pattern): """ Boyer-Moore

    7810

    为什么边缘计算在数据驱动世界创新必要条件?

    大量数据可能会定期从远程位置和全球任何地方工作环境实时运行传感器和物联网设备获取,而人们如今已经淹没在信息海洋。 边缘计算过程是什么? 边缘计算完全取决于位置。...传统企业计算,数据客户端创建,其中包括用户计算机。该数据通过广域网(WAN)(例如Web)发送到企业LAN,在那里由企业应用程序存储和处理,其处理结果随后被发送回客户端。...隐私与安全 从安全角度来看,边缘计算设施存储和处理数据可能存在风险,尤其当它由各种不如集中式或基于云计算解决方案安全设备进行处理时。...许多运营商正在将边缘计算技术纳入其5G实施,以提供更快实时处理,特别是对于便携式设备、智能汽车和自动驾驶汽车,而不是简单地提供更高速度并让企业继续云端处理数据。...Verizon公司目标让边缘节点虚拟地驻留在客户附近,通过5G网络切片功能划分出一些频谱,以实现即时、无需安装连接。

    48550

    通用高效字符串匹配--Sunday算法

    Sunday算法由Daniel M.Sunday1990年提出,它思想跟BM算法很相似, 其效率匹配随机字符串时不仅比其它匹配算法更快,而且 Sunday 算法 实现比 KMP、BM 实现容易很多...只不过Sunday算法从前往后匹配,匹配失败时关注主串参加匹配最末位字符下一位字符。...因此想办法减少不必要匹配,就能提高效率咯。很多高效字符串匹配算法,它们核心思想都是一样样,想办法利用部分匹配信息,减少不必要尝试。...Sunday算法利用发生失配时查找串下一个位置字母。还是用图来说明: ?...Sunday算法实际上Boyer-Moore算法优化,并且它更简单易实现。其论文中提出了三种不同算法策略,结果都优于Boyer-Moore算法。 Reference: 1] [D.M.

    1.4K20

    如何用Java实现字符串匹配和替换高效算法

    Brute Force(暴力法): 这是最简单字符串匹配算法,也是最低效。它思想逐个比较目标字符串字符与要匹配子字符串字符是否相等。...时间复杂度为O(mn),其中m目标字符串长度,n子字符串长度。...KMP算法: KMP(Knuth-Morris-Pratt)算法通过利用已经匹配过信息来减少不必要字符比较次数,进而提高效率。时间复杂度为O(m+n)。...Boyer-Moore算法Boyer-Moore算法通过预处理模式串,跳过尽可能多字符,从而实现快速字符串匹配。时间复杂度为O(mn)。...无论字符串匹配还是替换,选择合适算法和方法取决于具体需求。实际应用,可以根据字符串长度和匹配/替换频率来评估不同算法性能,从而选择最合适算法

    24110

    Python数据结构与算法-M个数找K个最小

    题目:输入M个数,从中找到K个最小数 比如输入10,-9,0,100,90,1,4,-9;找到最小3个数为:-9,-9,0 1这道题最坏办法M个数进行排序,排序算法最好时间复杂度o(mlogm...) 2 第二种办法,对其中K个数进行排序,时间复杂度o(m*k*logk),这要对比m和k*logk大小,看哪个办法更优 3 对于第二种方法一个优化,不需要对K个数进行排序,只需要要到这K个数中最大数...A,然后下一个数跟A对比,比A大则不要,比A小则入选,如此循环;时间复杂度o(m*k) 4 最后一种对方法3一个优化,找数组K个数中最大数时,最好时间复杂度用大根堆方式,时间复杂度logk...,整体时间复杂度o(m*logk)。...这样最后堆里内容就是要输出内容 下面第四种方式代码: ''' 查找最小k个元素 题目:输入n个整数,输出其中最小k个。

    1.4K10

    字符串匹配算法_多字符串匹配

    大家好,又见面了,我你们朋友全栈君。 文章目录 1. BM(Boyer-Moore算法 1.1 坏字符规则 1.2 好后缀规则 1.3 两种规则如何选择 2....BM(Boyer-Moore算法 思想:有模式串不存在字符,那么肯定不匹配,往后多移动几位,提高效率 BM原理:坏字符规则,好后缀规则 1.1 坏字符规则 利用坏字符规则,BM算法最好情况下时间复杂度非常低...BM算法代码实现 2.1 坏字符 找到坏字符模式串位置(有重复,则是靠后那个) 采用哈希,而不是遍历。...”证明了最坏情况下,BM算法比较次数上限5n。...---- BM算法核心思想,利用模式串本身特点,模式串某个字符与主串不能匹配时候,将模式串往后多滑动几位,以此来减少不必要字符比较,提高匹配效率。

    1.8K20

    子字符串查找----Boyer-Moore算法(从右向左匹配)

    Boyer-Moore算法一种从右向左扫描模式字符串并将它与文本匹配算法。 举例说明Boyer-Moore算法: 有文本FINDINAHAYSTACKNEEDLE和模式字符串NEEDLE....因为从右向左扫描,所以会先比较模式中最后一位E和文本中下标为5N。不匹配,因为模式字符串也出现了N,则右移模式字符串使得模式中最右边N(这里位置0N)与文本相应N对齐。...要实现之,需要一个数组right[]保存字母表每个字母模式字符串中出现最靠右下标(如果不存在则为-1)。这个值揭示了如果发生不匹配,应该右跳跃多远。...right[]数组计算后,算法实现起来就非常容易了。用一个索引i文本从左向右移动,用索引j模式字符串从右向左移动。...内循环检查检查正文和模式字符串在位置i是否相等,如果从M-1到0所有j,txt.charAt(i+j)都和pat.charAt(j)相等,就是找到了匹配。

    1.2K00

    字符串——28. 实现 strStr()

    给你两个字符串 haystack 和 needle ,请你 haystack 字符串找出 needle 字符串出现第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。...说明: 当 needle 空字符串时,我们应当返回什么值呢?这是一个面试很好问题。 对于本题而言,当 needle 空字符串时我们应当返回 0 。...,因此可以使用字符串匹配算法解决,常见字符串匹配算法包括暴力匹配、Knuth-Morris-Pratt算法Boyer-Moore算法、Sunday 算法等,本文将讲解Knuth-Morris-Pratt...为了减少不必要匹配,我们每次匹配失败即立刻停止当前子串匹配,对下一个子串继续匹配。如果当前子串匹配成功,我们返回当前子串开始位置即可。如果所有子串都匹配失败,则返回—1。...复杂度分析 时间复杂度:o(n x m),其中n字符串hagystack长度,m字符串needle长度。

    30530

    为什么深度学习,AlphaGo Zero一个巨大飞跃?

    AlphaGo ZeroDeepMind自动操作系统最新化身。有人可能会认为,围棋击败人类世界冠军很难。...然而,在这里,每一个训练集都是全新,而且越来越具有挑战性。它也类似于课程学习,然而课程算法中固有的。训练集自生成,目标函数计算是由蒙特卡罗树搜索(MCTS)结果推导而来。...AlphaGo所展示东西闻所未闻,也就是说,它需要资源少得多,设计也不那么复杂,同时还能明确地击败所有以前算法。...在这两种情况下,你都有两个训练互相馈送网络。 每个人都应该想到一个重要问题:“AlphaGo Zero算法有多普遍?”DeepMind曾公开表示,他们将把这项技术应用于药物研发领域。...它可以有效地做到这一点,因为所有其他不确定因素都是已知。也就是说,一系列行为结果没有不确定性,行为效果可以预测。简而言之,博弈行为可以预测

    93980

    字符串匹配算法_字符串模式匹配算法

    查找,dfa[str[i][j]比较了str[i]和pat[j]之后应该和str[i+1]比较模式字符位置。匹配成功时会继续比较下一个字符,因此dfa[pat[j]][j]总是j+1。...因为计算DFAj个状态时只需要知道DFA如何处理前j-1个字符,所以总能从尚不完整DFA得到所需信息。...Boyer-Moore算法 当可以文本字符串回退时,如果从右向左扫描模式字符串并将它和文本串匹配,那么就能得到一种非常快字符串查找算法——Boyer-Moore算法。...虽然最坏情况下RK算法运行时间仍然O(NM),但在实际使用过程,Rabin-Karp复杂度通常被认为O(N+M)。...,能够保证最坏情况下也是线性级别的性能,且不需要回退文本串指针;Boyer-Moore算法性能在一般情况下都是亚线性级别(可能线性级别的M倍),且对于越长模式串其速度可能会越快;Rabin-Karp

    2.9K20

    字符串匹配算法(BM)

    BM(Boyer-Moore算法 思想:有模式串不存在字符,那么肯定不匹配,往后多移动几位,提高效率 ? BM原理:坏字符规则,好后缀规则 1.1 坏字符规则 ?...利用坏字符规则,BM算法最好情况下时间复杂度非常低,O(n/m)。比如,主串aaabaaabaaabaaab,模式串aaaa。...BM算法代码实现 2.1 坏字符 找到坏字符模式串位置(有重复,则是靠后那个) 采用哈希,而不是遍历。 ?..."证明了最坏情况下,BM算法比较次数上限5n。...---- BM算法核心思想,利用模式串本身特点,模式串某个字符与主串不能匹配时候,将模式串往后多滑动几位,以此来减少不必要字符比较,提高匹配效率。

    1.3K20

    SpringBoot+Neo4j社交电商,讲述你怎么被绑定为下线

    上两篇文章我们主要讲解了Neo4j基本知识以及Neo4j基本使用,这篇文章我们就以实例来深入理解一下,我们以社交电商绑定关系为例,使用SpringBoot+Neo4j来实现。...Neo4j文章回顾: 不懂Neo4j?没关系,一起学 图文并茂教你学会操作图数据库Neo4j 一、分析 社交电商,现在做比较出色就应该属于花生日记,以及最近比较火芬香。...3.添加Neo4j 节点类 这里添加一个MemberInvit节点,有点注解类似于Mysqltable 映射对象类,mysql叫做ORM,neo4j叫做OGM。...这里要使用到 @NodeEntity 注解和 @Id注解。 @NodeEntity声明该类为Neo4j节点类 @Id Neo4j主键。...增加完后,我们有两种方法查看,一Neo4j控制台查看,另一个代码查看。这里我们先在Neo4j控制台查询下: ? 说明官方用户已经增加成功了。

    69510

    为什么说监控软件应用弗洛伊德算法更加有效

    弗洛伊德算法(Floyd算法一种用于寻找加权图中最短路径算法监控软件,可以使用弗洛伊德算法来帮助优化路线规划或者监控摄像头布局。...然后,使用弗洛伊德算法来计算每个小区域之间最短路径,并将这些路径用于确定最佳摄像头布局方案。弗洛伊德算法监控软件一个例子通过使用该算法来帮助优化监控摄像头布局和路径规划。...例如,大型建筑物内布置监控摄像头,可以使用弗洛伊德算法来确定最佳摄像头布局方案。...该算法可以计算出从一个小区域到另一个小区域最短路径,并将这些路径用于确定最佳摄像头摆放位置,从而提高监控系统效率和可靠性。弗洛伊德算法优势之一可以解决多源点、多汇点最短路径问题。...因此,实际应用,需要根据具体场景和需求,综合考虑算法优缺点,选择适合算法或者采取合适优化措施来提高计算效率和准确性。

    31630
    领券