###KMP原理及使用的再总结###
@(算法学习)

回顾之前写的文章,再看对其中的简单数学原理理解更深了。但是奇怪的是,看别人用有限自动机理论解释还是看不太懂,索性还是从这里起步推导为佳。

http://blog.csdn.net/u011240016/article/details/52372086?locationNum=1&fps=1

这篇主要说明了如何只根据模式串(待匹配的子串)自身推导得出下一个要比较的字符。

即使不熟悉KMP,记住一句话则非编码题可手动解出。

这句话是:当失配时,文本串中游走的指针仍然指向此次失配时的字符,而在模式串中,考虑回退,在过去找一个字符与文本串的这个字符匹配。当然,模式串中此字符及其前面所有的都与文本串当前指示的字符及其往前相同数目的字符相匹配。

总结成量化的语句是:
寻找的k值 = 模式串中失配字符之前的全部字符前缀和后缀相等的最大长度+1。

这里字符下标都是从1开始。

所以,失配时,只需要在模式串中,研究当前失配字符左边的全部字符(不含失配字符),前缀和后缀最大公共部分。模式串中下一个与文本串中失配字符比较的字符是此前缀后面的字符。

这是通过数学推导证明的。

比如:abaabc,在比较c时失配。则我们知道的信息其实很多了,即:前面的abaab已经匹配了。下一个与文本串失配字符比较的是谁呢?
根据上面的说法,看c以前的全部字符:ab‾aab‾\underline {ab}a\underline {ab}ab​aab​,划线的ab是最大公共子串,因此,中间的a将是下一个与文本串比较的字符。

你看,我们都不知道文本串是什么,居然可以知道文本串失配的字符是什么!这就是数学在背后的作用。具体数学推导看上面的文章链接。下面是用题目实际验证。

看一个小题:

已知字符串S为abaabaabacacaabaabcc,模式串P为abaabc。采用KMP算法进行匹配,第一次出现“失配”(S[i]≠P[j]S[i]\neq P[j]S[i]​=P[j])时,i=j=5i = j = 5i=j=5,则下次开始匹配时,i和j的值分别是:C。
A. i = 1, j = 0
B. i = 5, j = 0
C.i = 5, j = 2
D. i = 6, j = 2

分析:但凡有一点点对KMP思想的理解,就很容易排除A,D。因为文本串S在失配时指针不动。
剩下BC,而B显然是不对的,因为,我们目的是在失配时让模式串中指针往右游走更多距离。因为比较时已经看到了挺多字符,不用起来做一个快速的决策,实在过于浪费。

因此,单纯解此题而言,不用真正用KMP去求解,用基本思想就足够了。

而如果是动手解,不看选项的话,也很简单。但需要注意下标是从0开始的。但我们不必管。上面举的例子就是这题的解法。即abaabc比较到c失配了,该在模式串中选择的是第三个字符(P[2])与文本串比较。此时i = 5,S[5] = a.恰好相等。我们再往前看S[5]之前的是ab, P[2]之前的也是ab,即前面都是匹配的。从这里出发再往后进行比较即可。

所以i = 5(没变),j=2(指示下一个模式串的下标),此时S[i] = P[j]。这正是失配时问题的解决方案。

分析了一大段,最终得到的操作是很简单的比较前缀后缀。希望对你也有所帮助。

再以一个求next数组的例子思考这个问题:

模式串S = ‘abaabcac’
字符下标从1开始。
next[j] = k,表示在S[i]与P[j]失配时,用P[k]与S[i]继续比较。

  • next[1] = 0,next[2] = 1;

  • next[3], 此时比较到aba,在a处失配。因此看ab的前后缀,最长公共后缀长度是0,所以,next[3] = 1,即还从第一个字符开始比较。

  • next[4], 此时abaa,看aba的前缀后缀,有公共子串a,因此指向前缀a后面的字符b,即next[4] = 2(下标从1开始)

  • next[5],此时abaab,看abaa的前缀后缀,有公共子串a,因此也指向前缀a后面的字符b,即next[5] = 2

  • next[6],此时abaabc,看abaab的前缀后缀,有公共子串ab,因此指向前缀ab后面的字符a,即next[5] = 3

  • next[7],此时abaabca,看abaabc的前缀后缀,没有公共子串,因此指向第一个字符,即next[7] = 1

  • next[8],此时abaabcac,看abaabca的前缀后缀,有公共子串a,因此指向前缀a后面的字符b,即next[8] = 2.

所以:

编号 1 2 3 4 5 6 7 8
S a b a a b c a c
next 0 1 1 2 2 3 1 2

这便是求解next数组的手动过程。老实说,用了一年才真正理解这个算法。一直不想不敢静下心来仔细思考背后的原理,只是想马上知道怎么用。
静下心来,美好的事情就要发生。

2019.10 Update:

第一届PAT算法直播课培训班招募帖,欢迎点击查看详情、

END.

KMP原理及使用的再总结相关推荐

  1. 从原理到策略算法再到架构产品看推荐系统 | 附Spark实践案例

    原文链接:mp.weixin.qq.com  作者 | HCY崇远 01 前言 本文源自于前阵子连续更新的推荐系统系列,前段时间给朋友整理一个关于推荐系统相关的知识教学体系,刚好自身业务中,预计明年初 ...

  2. 堆排序稳定性举例_最常用的 8 个排序算法:从原理到改进,再到代码兑现透彻解析...

    1. 关于排序 很高兴与大家一起探讨计算机科学中的基础算法之排序算法.排序算法是非常基础同时又应用非常广泛的算法,无论在工作还是在生活中,比如: 数据库脚本,如MSSql, MySql, NoSql ...

  3. Taglib原理和实现:再论El和JST

    作者: WalkingWithJava 出处: Java研究组织 问题:你想和JSTL共同工作.比如,在用自己的标签处理一些逻辑之后,让JSTL处理余下的工作. 看这个JSP例子: <% Str ...

  4. KMP算法原理详解_论文解读版

    1. KMP算法 KMP算法是一种保证线性时间的字符串查找算法,由Knuth.Morris和Pratt三位大神发明,而算法取自这三人名字的首字母,因而得名KMP算法. 那发明这样的字符串查找算法又有什 ...

  5. 【数据结构-查找】2.字符串(逐步演绎过程,超级详解KMP算法)

    串的定义 串(string)是有0~n个字符组成的有限序列,一般记为 S=′a1a2-an′(n≥0)S = 'a_1a_2-a_n'(n≥0) S=′a1​a2​-an′​(n≥0) S 是字符串的 ...

  6. 字符串匹配算法(三):KMP(KnuthMorrisPratt)算法

    文章目录 KMP 原理 next数组的构建 代码实现 KMP 一提到字符串匹配算法,想必大家脑海中想到的第一个必然就是KMP算法,KMP算法的全称叫做KnuthMorrisPratt算法,与上一篇博客 ...

  7. [转]数据结构KMP算法配图详解(超详细)

    KMP算法配图详解 前言 KMP算法是我们数据结构串中最难也是最重要的算法.难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维.真正理解代码的人可以说对KMP算法的了解已经相当深入了.而 ...

  8. 用动画给面试官解释 KMP 算法

    点击上方蓝字设为星标 下面开始今天的学习- 作者 |  小鹿 来源 |  小鹿动画学编程 什么是 KMP? 听说 KMP 算法是一种字符串的改进算法,嗯~ 字符串匹配算法还有啥?不好意思,记性不好,居 ...

  9. 数据结构 kmp字符串匹配_用动画解释 KMP 算法

    大家好,我是一个每天在互联网都被读者催更催到爆肝,爆肾小鹿童鞋. 说实话,一些数据结构和算法我这辈子都不可能用到实际当中,但个人一直觉得能把复杂的东西讲明白是一件很牛逼的事情. 毕竟想牛逼也是很难的, ...

最新文章

  1. Linq基础知识小记二
  2. 数据库安装时挂起问题
  3. 翻译职称计算机能力,2018年职称计算机word2003考点辅导:用好Office2003中的翻译功能...
  4. 学习笔记(25):Python网络编程并发编程-Thread其他属性和守护线程
  5. Robot Framework + Selenium library + IEDriver环境搭建
  6. asp.net操作IIS主机头的问题总结
  7. 计算机会计学实验报告,最新计算机会计学实验报告-10本.doc
  8. TransactionScrope 2
  9. POJ1917 UVA10361 Automatic Poetry【文本】
  10. 初一计算机第6单元,青岛出版社初中信息技术 七年级下册第二单元 第6课 海报设计 教学设计...
  11. postgresql 数据库的备份和还原
  12. 用cmd命令下载百度云的资源
  13. 51单片机流水灯从原理图到PCB转化
  14. 华为OJ——将真分数分解为埃及分数
  15. 5G技术的原理(转)
  16. PTA乙级题解(110题全)
  17. 2019大数据领域十大必读书籍
  18. 马自达css滑动按钮,纯css的滑块开关按钮
  19. c++第一次亲密接触
  20. svn: E170001

热门文章

  1. Win10和Ubuntu20.04双系统启动引导项修复指南
  2. HTML之文本相关标签
  3. 【RobotStudio学习笔记】(九)坐标偏移设置
  4. matlab噪声 方差_产生多种分布的热噪声信号
  5. java开发区块链_使用Java语言从零开始创建区块链
  6. mysql的数据层基类_C# 基于MySQL的数据层基类(MySQLHelper)
  7. php实现简单的框架,PHP 实现简单的 MVC 框架
  8. 二等水准数据平差_自编单次二等水准平差计算表
  9. 中专考的计算机一级b有用吗,白城计算机一级B资格证真实可查么
  10. scala数据类型_Scala数据类型示例教程