范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

字符串匹配算法单模式匹配BM算法

  一、BM算法
  BF 算法性能会退化的比较严重,而 RK 算法需要用到哈希算法,而设计一个可以应对各种类型字符的哈 希算法并不简单。
  BM(Boyer-Moore)算法。它是一种非常高效的字符串匹配算法,滑动算法
  在这个例子里,主串中的 c,在模式串中是不存在的,所以,模式串向后滑动的时候,只要 c 与模式串 有重合,肯定无法匹配。所以,我们可以一次性把模式串往后多滑动几位,把模式串移动到 c 的后面。
  BM 算法,本质上其实就是在寻找这种规律。借助这种规律,在模式串与主串匹配的过程中,当模式串 和主串某个字符不匹配的时候,能够跳过一些肯定不会匹配的情况,将模式串往后多滑动几位。二、算法原理
  BM 算法包含两部分,分别是坏字符规则(bad character rule)和好后缀规则(good suffix shift)。
  1、坏字符规则
  BM 算法的匹配顺序比较特别,它是按照模式串下标从大到小的顺序,倒着匹配的。
  我们从模式串的末尾往前倒着匹配,当我们发现某个字符没法匹配的时候。我们把这个没有匹配的 字符叫作坏字符(主串中的字符)。
  字符 c 与模式串中的任何字符都不可能匹配。这个时候,我们可以将模式串直接往后滑动三位,将模式 串滑动到 c 后面的位置,再从模式串的末尾字符开始比较。
  当发生不匹配的时候,我们把坏字符对应的模式串中的字符下标记作 si。如果坏字符在模式串中存在, 我们把这个坏字符在模式串中的下标记作 xi。如果不存在,我们把 xi 记作 -1。那模式串往后移动的位 数就等于 si - xi。(下标,都是字符在模式串的下标)
  第一次移动3位
  c在模式串中不存在xi = -1,所以 ,移动位数 n = 2- (-1) = 3
  第一次移动2位
  a在模式串中存在xi = 0,所以 ,移动位数 n = 2 - 0 = 2
  2、好后缀规则
  我们把已经匹配的 我们拿它在模式串中查找,如果找到了另一个跟{u}相匹配的子串{u},那我们就 将模式串滑动到子串{u}与主串中{u}对齐的位置。
  如果在模式串中找不到另一个等于{u}的子串,我们就直接将模式串,滑动到主串中{u}的后面,因 为之前的任何一次往后滑动,都没有匹配主串中{u}的情况。
  过度滑动情况:
  当模式串滑动到前缀与主串中{u}的后缀有部分重合的时候,并且重合的部分相等的时候,就有可能会 存在完全匹配的情况。
  所以,针对这种情况,我们不仅要看好后缀在模式串中,是否有另一个匹配的子串,我们还要考察好后 缀的后缀子串(c),是否存在跟模式串的前缀子串(c)匹配的。
  3、如何选择坏字符和好后缀
  我们可以分别计算好后缀和坏字符往后滑动的位数,然后取两个数中最大的,作为模式串往后滑动的位 数。三、算法实现
  坏字符:
  如果我们拿坏字符,在模式串中顺序遍历查找,这样就会比较低效。
  可以采用散列表,我们可以用一个256数组,来记录每个字符在模式串中的位置,数组下标可以直接对应字符的ASCII码值,数组的值为字符在模式串中的位置,没有的记为-1。
  bc[97]=a
  bc[98]=b
  bc[100]=d
  有重复的字母以后面的位置为准。package graph;  /**  * * 滑动匹配算法--坏字符  */ public class BMalth {     private static final int SIZE = 256; // 全局变量或成员变量      /**      * @param b      * @param m      * @param dc      */     private static void generateBC(char[] b, int m, int[] dc) {         for (int i = 0; i < SIZE; ++i) {             dc[i] = -1; // 初始化 bc 模式串中没有的字符值都是-1         }         //将模式串中的字符希写入到字典中         for (int i = 0; i < m; ++i) {             int ascii = (int) b[i]; // 计算 b[i] 的 ASCII 值             dc[ascii] = i;         }     }      /**      * 坏字符      *      * @param a 主串      * @param b 模式串      * @return      */     public static int bad(char[] a, char[] b) {         //主串长度         int n = a.length;         //模式串长度         int m = b.length;         //创建字典         int[] bc = new int[SIZE];         // 构建坏字符哈希表,记录模式串中每个字符最后出现的位置         generateBC(b, m, bc);         // i表示主串与模式串对齐的第一个字符         int i = 0;         while (i <= n - m) {             int j;             for (j = m - 1; j >= 0; --j) { // 模式串从后往前匹配             //i+j : 不匹配的位置                 if (a[i + j] != b[j]) break; // 坏字符对应模式串中的下标是j             }             if (j < 0) {                 return i; // 匹配成功,返回主串与模式串第一个匹配的字符的位置             }             // 这里等同于将模式串往后滑动j-bc[(int)a[i+j]]位             // j:si bc[(int)a[i+j]]:xi             i = i + (j - bc[(int) a[i + j]]);         }         return -1;     }      public static void main(String[] args) {         String s1 = "abcabcabc";         String s2 = "cab";         System.out.println(bad(s1.toCharArray(), s2.toCharArray()));     } }四、时间复杂度
  BM算法的时间复杂度是O(N/M)
  n:主串长度 m:模式串长度五、应用
  BM算法比较高效,在实际开发中,特别是一些文本编辑器中,用于实现查找字符串功能。

感恩的特里,永远的蓝军之魂在今天,在这个时候特里能够发文感谢阿布,肯定阿布对于球队对于自己的贡献,这格局不是一般的大了,顶住了英国社会的压力,不站政治正确的边。是真男人。真汉子,懂得感恩,恩怨分明。当年为了红色记忆中的姚麦,恨不逢其时,日日与君好2004夏天,场均28分拿下得分王的麦蒂以一场62分的得分秀为当赛季只有21胜的奥兰多留下最后一道绚丽的痕迹。那之后,麦蒂远赴休斯顿,联手的是沙克东游后坐稳全明星西部首发中锋的姚明3年仅3次出场!越南球员在亚洲联赛失败而归,和武磊同时期留洋北京时间8月14日,越南媒体的消息,前大阪樱花的越南归化球员邓文林已经回到了越南,目前的他正在与土豪球队平定谈判,未来有可能回归越南联赛。2019年,有俄罗斯血统的邓文林去往了泰超我以为这辈子都不会看到但曼联还是熟悉的配方,还是熟悉的味道开篇我想借用我国范大将军名言曼联现在脸都不要了!再下去要输利物浦了,布莱顿输完输布伦特福德,再输利物浦,接下来没人输了。现在的曼联没有最惨,只有更惨。在客场0比4输给布伦特福德后。现役球员五大数据王杜兰特场均27。2分登顶,保罗两度上榜NBA有许许多多复杂的技术统计,一般基础数据分为5项得分篮板助攻抢断盖帽。今天就一起来看看现役所有球员中,场均五项基础数据最多的5人吧!其中杜兰特以场均27。2分排在得分榜第一位,足球比赛除了在球场看在客厅看,还可以这样看笑着看欧洲杯的时候,有个段子流传得很广。老公是个足球爱好者,每场比赛都不落地熬夜看直播。妻子睡觉前问丈夫你看的什么比赛?丈夫喝了一口啤酒,扭头告诉老婆欧洲杯。老婆进卧室睡觉了,一觉醒来,凌晨转会梅西无缘金球候选而C罗上榜巴萨完成球员注册一夜4官宣大家周末快乐!评论区持续更新,请留言交流2022金球奖30人候选名单公布,英超占据半壁江山,皇马6人,亚洲1人,C罗连续第18年入选,梅西近16年来首次无缘名单。队报解释称梅西在国追随远古时期的三叶虫在5。6亿年前的寒武纪世界中,有种节肢动物。因为它们的身体被两条垂直线分成三部分。三叶虫是最具代表性的古代动物。直到2。5亿年前的二叠纪末期才完全灭绝。他们在地球上生活了超过3。1温室效应将让地球变得更热,保护地球刻不容缓众所周知全球正在持续变暖中,很明显现在的冬天没有以前那么冷,全球的气温在不断地上升中,那么你能想象几十年亦或者是几百年后地球温室将变得多热吗?科学家对于地球变暖的程度不能确定,但根梦天实验舱何时发射?印度拦下远望5号,会影响发射吗?半个世纪前,人类开启了太空探索计划,而要更好地探索神秘的星空,空间站是一个必不可少的工具。一直以来,人们说起空间站都会想到由美国主导建造的国际空间站,它是由全世界16个国家合作共同不到千元的客厅影音神器,零刻EQ59迷你电脑主机写在开头这年头买台电视,开机广告和各种弹窗广告视频广告让人头疼,为了不看广告水母买了台三星电视,泰泽系统是没有了广告,但是使用体验确实不怎么好,软件过于陈旧,视频资源也不够丰富,于
铜价在毫无征兆的情况下继续大涨周五的高位横盘让市场回收商的看涨情绪稍有回落,报价也在周四高价位的基础上回落两毛,从65。2元公斤调到65元公斤。昨天(也就是周六)内外盘只有一次外盘报价,伦铜只比周五最高点涨了几中国的国库在哪里?为什么中国的外汇储备不能在国内花?原创镇长助理公众号大树镇巡抚今天请到的是来自财政口的一位老朋友,他曾多次为大树镇撰稿。希望他的回答,能一解你心中类似的困惑。树叔你好,一直有个问题困扰着我。我有几个留学生朋友,总是为何我国大街小巷都是药店?靠什么赚钱?行内人说出了实情相信大家都有这样的感觉,近几年实体的生意越来越难做,不少餐饮门店外面都挂着出租和出售的字样。据权威机构发布的数据,近几年全国实体餐饮门店的总数,从905。6万家下降到760。1万家有人说不怕炎热潮湿和蚊虫叮咬,你就去海南。是这样吗?海南,因为地处我国的最南端,又四面环海,所以,炎热和湿润就成为此地的一大特色。同时炎热和潮湿又带来了草木青翠,蚊虫繁多。因此很多人都说这里的气候和环境让人难以忍受。果真如此吗?我不今年政府工作报告释放了哪些重磅信号?撰文余辉3月5日,第十三届全国人民代表大会第五次会议举行第一次全体会议,听取国务院总理李克强关于政府工作的报告。列举大量数据预期目标为5。5左右政府工作报告中列举了大量数据。今年发藏在深山中的三线厂,主要生产火箭弹引信,如今被当成居住房藏在深山中的三线厂,主要生产火箭弹引信,如今被当成居住房有很多朋友非常喜欢美丽的大自然的景色,在旅行的时候也会选择秀丽的自然景区,其实并不是自然景区当中才有秀丽的山水风光,在我们身尘埃落定,中国篮坛重磅手笔,名宿加入杜锋团队,中国男篮再起航对于篮坛的改革,其实,无论姚明上不上台都存在,近期,中国篮协再次大刀阔斧,表态将建立人才库,这就表明,以后但凡进入国家队的球员教练员,都要事先加入人才库,至于在教练团队这方面,新一56!颜丙涛再获好消息世界第14逆转失败,无缘会师特鲁姆普北京时间2022年3月6日,斯诺克威尔士公开赛结束半决赛争夺。特鲁姆普在3比5落后的情况下连赢3局,以6比5淘汰侯赛因瓦菲,本赛季首次跻身排名赛决赛。特鲁姆普的好朋友利索夫斯基也面好消息英国回国5月份低价稳飞的回国航班它又回来了好消息!以往从英国回国都要提前起码2个月抢,而5月份是回国淡季,所以到现在还能买到现票哦!并且也是稳飞路线哦!下面是航班信息1。SK5025月1630日伦敦希思罗哥本哈根09551骂完郭士强,喷杨鸣下课,这是套路,他们是辽篮球迷吗?辽宁球迷,听我一句劝,有些别有用心的人,试图用舆论击垮我们,稳住,都别骂杨鸣了,他也非常自责。欢迎来到大壮聊球,今天我们聊聊,为什么都别骂杨鸣了,希望我们辽宁球迷能给大壮一个免费的听说广西人不是在过节,就是在过节的路上?2的尾巴了,过完了春节,普通人的节日,就要等到清明和元旦了,但是广西人,在3月份还有节日!别人的节日元旦春节清明五一。广西人的假期二月二三月三四月八(苗族的节日)六月六(壮族六郎节