我们以一个非常简单的例子来开头,举例主串为abababc,模式串为abc,在我们进行匹配的时候第一次匹配的效果为
abababc
ababc(在c处产生失配)
按照朴素的匹配算法,我们应该将模模式串向右移1位然后继续匹配,如图下所示情形
a bababc
 ababc(以次类推,在产生失配的时候将模式串逐步向右移位,产生最坏O(N*M)的时间复杂度)
 让我们仔细来思考第一次产生失配的情形,在i=5(i为模式串中的顺序),j=5(j为模式串中的顺序)时产生失配。
 为了使模式串尽可能的避免不必要的匹配,我们来观察模式串ababc本身的性质,我们注意到i[1]i[2]和i[3]i[4]是相同的序列,那么我们可以想到因为i[1]-i[4]已经和j[1]-j[4]匹配成功那么我们可以将模式串向右移两位使得i[1]i[2]和j[3]j[4]对应,因为j[3]j[4]是已经和i[3]i[4]匹配成功了的,所以我们可以这么做。
 但是我们为什么会直接将模式穿向右移两位呢?我们是根据i[1]i[2]和i[3]i[4]相同这一结论,由此我们想到是不是因为在i[1]i[2]和i[3]i[4]是两位匹配所以模式串就会向右移位2位呢?我们来举下一个例子,设主串为abcabcabcd,模式串为abcabcd,第一次匹配失败时情况为
 abcabcabcd
 abcabcd(d处产生失配)
 那么我们应用KMP算法,观察到在模式串中i[1]-i[3]和i[4]-i[6]相同,所以我们试着将模式串向右移动3位,此时匹配成功。
 据此我们得出结论在产生失配的时候,我们可以应用已经匹配部分的信息,直接将模式串向右移位较大的位数,来减少不必要的匹配,节省时间,由此我们引入next[]数组的概念,next[a]=k 这个表达式的意思是,当在模式串的第a个位置出产生失配时,将整个模式串向右移位k个长度,由我们在以上的举例可以知道,即i[1]-i[k]是和i[a-k+1]-i[a-1]相同的,所以我们在进行匹配之前可以先对模式串本身求出它的next数组来减少我们的任务。
 

言简意赅告诉你KMP算法的原理,不管你信不信,我信了相关推荐

  1. (转)KMP算法原理讲解及模板C实现

    原作者:v_JULY_v 1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱.所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终不 ...

  2. 字符串匹配KMP算法的理解(详细)

    1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱.所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终不够,故才迟迟没有修改本文. ...

  3. 2020年最全最简单KMP算法讲解

    目录 1.KMP算法的来源 2.最大公共前后缀 3.KMP算法原理 4.next数组 5.next数组值的确定 6.KMP算法的缺陷 7.KMP算法的改进 1.KMP算法的来源 其实博主刚看KMP算法 ...

  4. [Algorithm] 字符串匹配算法——KMP算法

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

  5. 数据结构之字符串匹配算法(BF算法和KMP算法)

    字符串匹配算法: 就是给定两个串,主串(s)和子串(sub), 查找子串是否在主串里面,如果找到便返回子串在主串中第一个元素的位置下标,否贼返回-1,. 在这里我 们讨论的时候主要用字符串来举例实现. ...

  6. KMP算法之next数组详解

    KMP算法之next数组详解 KMP算法实现原理 KMP算法是一种非常高效的字符串匹配算法,下面我们来讲解一下KMP算如何高效的实现字符串匹配.我们假设如下主串和模式串: int i;//i表示主串的 ...

  7. KMP算法——快速求失效函数值及其代码实现

    前缀和后缀的最大相等长度 为了更好的理解我接下来所说的回溯值的求法,这里先介绍一下,如何求一个字符串的前缀和后缀相等的最大长度,为了便于说明记为k. 注意:前缀和后缀不能为字符串本身!!!!!! 如字 ...

  8. 【gif图文】KMP算法(从暴力匹配到快速匹配)

    从暴力匹配到快速匹配(KMP算法) 学习kmp算法前,首先要先了解什么是kmp算法,kmp算法具体优点是什么,kmp的主要应用方向在哪. 然后才是,代码实现 带着以上问题,我们来一步一步学习kmp算法 ...

  9. [数据结构]模式匹配算法--KMP算法详解

    目录 一. 模式匹配 二. 模式匹配算法 1. 朴素模式匹配算法 2. KMP算法 1). KMP算法的优势 2). KMP算法的原理 3). next数组的构造 4). 利用next数组匹配的过程 ...

最新文章

  1. matlab中patch命令_matlab 放大平移图形是超出边界问题的处理
  2. Dubbo中的连接控制,你真的理解吗?
  3. 手机WebAPP设计注意事项和解决方法
  4. Linux搭建虚拟机,桥接模式下,主机能够Ping通虚拟机,虚拟机ping不通主机
  5. java实训手册_java实训项目用户手册
  6. 直播预告 | 高效视频理解模型的设计及ICCV比赛冠军方案解读
  7. 理解OSI七层模型(了解OSI七层模型,数据如何传输,封装,解封装)
  8. 虚拟机性能测试:八 性能分析—Windows体验指数
  9. Codeforces 827D Best Edge Weight 倍增 + 并查集 || 倍增 + 压倍增标记 (看题解)
  10. django 1.8 官方文档翻译: 1-1-1 Django初探
  11. plsql连接本地oracle数据库,而远程主机却无法连接,出现无监听程序的解决方法(转)
  12. Car-like robot运动参数校准(图片版)
  13. poj1700快速渡河问题(贪心策略,详细解析)
  14. 测试sql server服务是否配置正确
  15. 关于soapUi工具的安装使用教程
  16. 关于特殊后缀名如vue vm less等文件在DW中高亮显示并且代码提示的解决方案
  17. red5 FAQ - 刚接触red5的可以看看
  18. 人群计数之生成密度图
  19. 如何理解答案-Leo读提问的智慧(4)
  20. 使用JS实现子页面调用父页面的函数

热门文章

  1. 精益产品过程Step3:确认产品价值
  2. sonarqube企业版最新版pojie 含中文汉化
  3. 当不知轴承型号时如何寻找轴承故障频率_不锈钢轴承温度和振动的检查及降温方法...
  4. shell脚本备份国产达梦数据库
  5. 卷积神经网络pytorch_使用PyTorch和卷积神经网络进行动物分类
  6. “沉而不low”,可能吗?
  7. 一种类似PLC原理图
  8. 用Java做s71200的上位机_S7-1200如何通过CM1241和上位机建立通讯?-工业支持中心-西门子中国...
  9. c语言中ntdll.dll,c – ntdll.dll [下面的框架可能不正确/缺失,没有为ntdll.dll加载符号]...
  10. ide-eval-resetter-2.1.6