1. KMP算法是前缀匹配算法,一次从前往后匹配的过程中,根据已经部分匹配的信息,在文本中,移动尽可能远的距离。而不是按照朴素模式匹配方法,每次都只移动一个位置。

比如这个示例,在文本串中从4(从0开始编号)开始逐个字符匹配,直到某个不匹配的字符(空格和D),然后朴素模式匹配算法是从下一个字符继续开始。而KMP算法,就是根据已经匹配的部分信息"ABCDAB"和模式串,直接从第二个AB开始下一轮的匹配!

"部分匹配"的实质是,有时候,字符串头部和尾部会有重复。比如,"ABCDAB"之中有两个"AB",那么它的"部分匹配值"就是2("AB"的长度)。搜索词移动的时候,第一个"AB"向后移动4位(字符串长度-部分匹配值),就可以来到第二个"AB"的位置。

2. BM算法是后缀匹配算法,从后往前开始匹配。而每次当遇到不匹配的字符时,则根据已经匹配的后缀信息,从尽可能远的位置开始匹配!

此时I是坏字符,且I不在模式串"EXAMPLE"中,假如根据坏字符规则:那么模式串开始跟I的下一个字符M对齐,然后开始下一轮匹配。

但是这里没有充分利用已经匹配的后缀,由于后缀"MPLE" 已经匹配,模式串的第一个字符时E,肯定跟坏字符I的下一个字符M不等,所以这里应该利用好后缀,把模式串移动尽可能远的距离,开始下一轮的匹配。

这里模式串的第一个字符为E,所以直接从好后缀中,第一次出现E的位置开始下一轮的匹配!

注意这里:为什么要从好后缀中第一个出现模式串开始字符E的地方开始匹配呢?因为BM算法是后缀匹配算法,从后往前匹配,所以在一轮匹配匹配过程中,已经扫描过了模式串和文本串直到第一次坏字符的位置,但是模式串之前的字符是什么不知道,所以从好后缀中第一个出现模式串开始字符E的地方开始匹配。

所以,在每一轮匹配过程中,不匹配时,BM算法就是根据坏字符规则和好后缀,把模式串移动尽可能远的距离,开始下一轮的匹配!

总结:KMP算法和BM算法的思想,都是充分部分匹配和文本串当前字符、模式串字符不匹配时所隐含的信息,把模式串移动尽可能远的距离,开始下一轮的匹配!

参考资料:

http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html

http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

http://www.cnblogs.com/gaochundong/p/boyer_moore_string_matching_algorithm.html

http://www.cnblogs.com/gaochundong/p/string_matching.html

字符串匹配:KMP算法, Boyer-Moore算法理解与总结的更多相关文章

  1. 字符串匹配KMP算法详解

    1. 引言 以前看过很多次KMP算法,一直觉得很有用,但都没有搞明白,一方面是网上很少有比较详细的通俗易懂的讲解,另一方面也怪自己没有沉下心来研究.最近在leetcode上又遇见字符串匹配的题目,以此 ...

  2. 字符串匹配-KMP

    节选自 https://www.cnblogs.com/zhangtianq/p/5839909.html 字符串匹配 KMP O(m+n) O原来的暴力算法 当不匹配的时候 尽管之前文本串和模式串已 ...

  3. Boyer Moore算法(字符串匹配)

    上一篇文章,我介绍了KMP算法. 但是,它并不是效率最高的算法,实际采用并不多.各种文本编辑器的"查找"功能(Ctrl+F),大多采用Boyer-Moore算法. Boyer-Mo ...

  4. 字符串匹配KMP算法

    1. 字符串匹配的KMP算法 2. KMP算法详解 3. 从头到尾彻底理解KMP

  5. 字符串匹配--kmp算法原理整理

    kmp算法原理:求出P0···Pi的最大相同前后缀长度k: 字符串匹配是计算机的基本任务之一.举例,字符串"BBC ABCDAB ABCDABCDABDE",里面是否包含另一个字符 ...

  6. 字符串匹配KMP算法的讲解C++

    转自http://blog.csdn.net/starstar1992/article/details/54913261 也可以参考http://blog.csdn.net/liu940204/art ...

  7. 字符串匹配KMP算法(转自阮一峰)

    转自 http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 字符串匹配是计算 ...

  8. 快速字符串匹配一: 看毛片算法(KMP)

    前言 由于需要做一个快速匹配敏感关键词的服务,为了提供一个高效,准确,低能耗的关键词匹配服务,我进行了漫长的探索.这里把过程记录成系列博客,供大家参考. 在一开始,接收到快速敏感词匹配时,我就想到了 ...

  9. 【Luogu P3375】字符串匹配KMP算法模板

    Luogu P3375 模式串:即题目中的S2所代表的意义 文本串:即题目中的S1所代表的意义 对于字符串匹配,有一种很显然的朴素算法:在S1中枚举起点一位一位匹配,失配之后起点往后移动一位,从头开始 ...

  10. 字符串匹配KMP算法的C语言实现

    字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...

随机推荐

  1. Python:numpy.newaxis

    x1[:,np.newaxis]:增维,转置 从字面上是插入新的维度的意思 demo1: 针对一维的情况 >>> b = np.array([1, 2, 3, 4, 5, 6]) & ...

  2. PAT乙级1001

    https://pintia.cn/problem-sets/994805260223102976/problems/994805325918486528 #include<bits/stdc+ ...

  3. for 循环使用 enumerate 以及yield生成器简单例子

    >>>seq = ['one', 'two', 'three'] >>> for i, element in enumerate(seq): ... print i ...

  4. 【js】走近小程序(2) 常见问题总结

    一.API请求? 二.基础库兼容? 三.不同页面之间的传值   一.API请求? wx.request({ url: 'test.php', // 仅为示例,并非真实的接口地址 data: { x: ...

  5. webdriver 获取页面response

    在selenium webdriver实现自动化抓取数据过程中,发现无法从webdriver获取页面response 查来查去最终在 stackoverflow 上找到了这一篇文章 文章中说:webd ...

  6. Scala-元组操作

    package com.bigdata object TupleMapO { def main(args: Array[String]): Unit = { // 元组:Tuple,就是由()包起来, ...

  7. 使用uliweb自动创建表单

    1.在apps/blog目录下创建form.py文件 #coding:utf-8 from uliweb.form import* class blogform(Form): user = Strin ...

  8. EDB*Plus的client_encoding问题

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页    回到顶级页面:PostgreSQL索引页 [作者 高健@博客园  luckyjackga ...

  9. 【BZOJ1044】[HAOI2008]木棍分割

    [BZOJ1044][HAOI2008]木棍分割 题面 bzoj 洛谷 题解 第一问显然可以二分出来的. 第二问: 设\(dp[i][j]\)表示前\(i\)个,切了\(j\)组的方案数 发现每次转移 ...

  10. 深度学习—caffe框架训练文档

    转存:LMDB E:\机器学习2\caffe资料\caffe_root\caffe-master\Build\x64\Release>convert_imageset.exe E:/机器学习2/ ...