举个通俗的例子解释KMP算法中NEXT[J]:
字符串:abcX
子串 : abcd
当比较到d与X的时候,最原始的算法是子串向后移动一位继续比较
字符串:abcX
子串 : abcd
而KMP则利用已知信息abc前3个字符是相等的,j从0跳到3,向后移动3位,比较a与X
字符串:abcX
子串 : abcd
=======================================================
当例子变复杂一点的时候:
字符串:abcabX
子串 : abcabz
根据kmp原理可知,子串应该向后移动到
字符串:abcabX
子串 : abcabz
这样的位置而不是
字符串:abcabX
子串 : abcabz
原因就是子串里面有重复的值(即"前缀"和"后缀"有相似)。
=======================================================
当子串是正常的时候,我们向后移动的位数应该就是子串比较了多少位直到不相等(就是j值)(懂kmp的你懂的。。),如:

abcabd | abcabg | abcdefg |
abc | ab | de |
后移3位 | 后移两位 | 后移2位 |

但是,就是因为子串不是单纯的每个不相等(前后缀不相似),所以就需要我们的next[j]了!!
比如:abcabgabcabx
abcabx
这里原本是可以直接向后移动j=5,5位的,
abcabgabcabx
abcabx
但是因为abcabx中有相似,所以只能向后移动5-2=3位了
abcabgabcabx
abcabx
而要减去的这个2,则是next[5]的所存储的东西!
所以next[j]的作用就是,保存当有相似子串时,要减去的数(相似度)

那么,对于不相似的情况,也可以范化为,相似度为0,next[j]=0,
所有子串比较到不相等的情况时,都后移j-next[j]位
这就是next[j]的作用。

下面有傻逼死:

  1. "前缀"和"后缀"。

"前缀"指除了最后一个字符以外,一个字符串的全部头部组合;"后缀"指除了第一个字符以外,一个字符串的全部尾部组合。

2."前缀"和"后缀"相似度,即next数组的值,即《部分匹配表》(Partial Match Table)是什么。

那么,如何来计算呢?

先明确"前缀"和"后缀"相似度是什么。

如在abcabx中,

  • 当j=0时只有a,前缀和后缀都为空集,共有元素的长度为,next[j]=0;
  • 当j=1时,ab的前缀是a,后缀是b,如上,next[j]=0;
  • 当j=2时,abc的前缀是a,ab,后缀是bc,b,如上,next[j]=0;
  • 当j=3时,abca的前缀是a,ab,abc,后缀是bca,ca,a, 前缀跟后缀有一个交集(相似)a,长度为1,所以next[j]=1;
  • 当j=4时,abcab的前缀是a,ab,abc,abca,后缀是bcab,cab,ab,b, 前缀跟后缀有一个最大交集(相似)ab,长度为2,所以next[j]=2;
  • 当j=6时,abcabx的前缀是a,ab,abc,abca,abcab,后缀是bcabx,cabx,abx,bx,共有元素的长度为,next[j]=0;
引自知乎

KMP算法的浅显解释相关推荐

  1. KMP算法最浅显理解——一看就明白

    说明 KMP算法看懂了觉得特别简单,思路很简单,看不懂之前,查各种资料,看的稀里糊涂,即使网上最简单的解释,依然看的稀里糊涂. 我花了半天时间,争取用最短的篇幅大致搞明白这玩意到底是啥. 这里不扯概念 ...

  2. KMP算法的详细解释及实现

    这是我自己学习算法时有关KMP的学习笔记,代码注释的十分的详细,分享给大家,希望对大家有所帮助 在介绍KMP算法之前, 先来介绍一下朴素模式匹配算法: 朴素模式匹配算法: 假设要从主串S=" ...

  3. KMP算法之病毒检测

    什么是KMP算法? KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特--莫里斯--普拉特操作(简称KMP算法).KMP ...

  4. KMP 算法详解(CPP 实现)

    转载请标明出处:https://blog.csdn.net/kiss0tql/article/details/81416283 本文来自:deemo的博客 说明 kmp 算法思想 next 数组计算 ...

  5. 基于KMP算法的字符匹配问题

    基于KMP算法的字符匹配问题 反正整个清明都在纠结这玩意-差点我以为下个清明要给自己过了. 至于大体的理解,我就不再多说了(还要画图多麻烦鸭),我参考了以下两个博客,写的真的不错. (原创)详解KMP ...

  6. KMP算法具体解释(转)

    作者:July. 出处:http://blog.csdn.net/v_JULY_v/. 引记 此前一天,一位MS的朋友邀我一起去与他讨论高速排序,红黑树,字典树,B树.后缀树,包含KMP算法,只有在解 ...

  7. KMP算法的next数组通俗解释

    我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度. 当然我们可以看到这个算法针对的是子串有对称属性, ...

  8. 较为简洁明了的KMP算法解释

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

  9. 转载大神的~~~~~~ KMP算法的前缀next数组最通俗的解释,如果看不懂我也没辙了

    KMP算法的前缀next数组最通俗的解释,如果看不懂我也没辙了 分类: 常用基础算法 IT经典笔试题 2012-09-02 10:09  1042人阅读  评论(1)  收藏  举报 算法 c 编程 ...

最新文章

  1. C++ Primer 5th笔记(chap 16 模板和泛型编程)转发参数包
  2. Java连接FTP服务器并且实现对其文件的上传和下载
  3. 产品必备:注册登录完整解决方案 | 含原型下载
  4. Repeater控件使用总结
  5. C++虚函数与多态性
  6. 使用ToolRunner运行Hadoop作业的原理及用法
  7. Zookeeper集群安装(开启kerberos)
  8. Vue自定义指令—— 完美解决H5页面不同尺寸屏幕的适配问题
  9. python脚本用类编写_跟老齐学Python之编写类之二方法
  10. 排序算法之四 归并排序(C++版本)
  11. 容器技术Docker K8s 39 Serverless Kubernetes(ASK)详解-阿里云Serverless容器(ASK)适用场景与核心功能
  12. Max Script 入门教程
  13. 基于NNIE神经网络引擎_海思hi3516DV300方案硬件平台适合做哪些开发
  14. ζ(2)的夹逼代数证明
  15. JavaWeb:掌握Session的使用,完善用户登录注册案例的功能
  16. java纲要_幼儿园综合素质笔试大纲
  17. NVMe ssd加速卡和NVMe ssd硬盘的区别
  18. SDUST 实验+ 作业
  19. 半夜冒着大雨跑网吧写文章是怎样的体验?
  20. python可视化---阶梯图step()

热门文章

  1. 加密货币交易所Gemini已支持新加坡元(SGD)
  2. 通用的实时数仓构建方法与实践
  3. 调试阶段 获取微信小程序openid
  4. 【XSY2718】gift 分数规划 网络流
  5. [hdu2089]不要62(数位dp)
  6. 【转载】Kali-linux安装之后的简单设置
  7. DB2 SQLSTATE 消息
  8. Netty简单样例分析[转]
  9. aspdotnet部分资源
  10. 【7.9校内test】T1挖地雷