KMP算法的浅显解释
字符串: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]的作用。
下面有傻逼死:
- "前缀"和"后缀"。
"前缀"指除了最后一个字符以外,一个字符串的全部头部组合;"后缀"指除了第一个字符以外,一个字符串的全部尾部组合。
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算法的浅显解释相关推荐
- KMP算法最浅显理解——一看就明白
说明 KMP算法看懂了觉得特别简单,思路很简单,看不懂之前,查各种资料,看的稀里糊涂,即使网上最简单的解释,依然看的稀里糊涂. 我花了半天时间,争取用最短的篇幅大致搞明白这玩意到底是啥. 这里不扯概念 ...
- KMP算法的详细解释及实现
这是我自己学习算法时有关KMP的学习笔记,代码注释的十分的详细,分享给大家,希望对大家有所帮助 在介绍KMP算法之前, 先来介绍一下朴素模式匹配算法: 朴素模式匹配算法: 假设要从主串S=" ...
- KMP算法之病毒检测
什么是KMP算法? KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特--莫里斯--普拉特操作(简称KMP算法).KMP ...
- KMP 算法详解(CPP 实现)
转载请标明出处:https://blog.csdn.net/kiss0tql/article/details/81416283 本文来自:deemo的博客 说明 kmp 算法思想 next 数组计算 ...
- 基于KMP算法的字符匹配问题
基于KMP算法的字符匹配问题 反正整个清明都在纠结这玩意-差点我以为下个清明要给自己过了. 至于大体的理解,我就不再多说了(还要画图多麻烦鸭),我参考了以下两个博客,写的真的不错. (原创)详解KMP ...
- KMP算法具体解释(转)
作者:July. 出处:http://blog.csdn.net/v_JULY_v/. 引记 此前一天,一位MS的朋友邀我一起去与他讨论高速排序,红黑树,字典树,B树.后缀树,包含KMP算法,只有在解 ...
- KMP算法的next数组通俗解释
我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度. 当然我们可以看到这个算法针对的是子串有对称属性, ...
- 较为简洁明了的KMP算法解释
字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...
- 转载大神的~~~~~~ KMP算法的前缀next数组最通俗的解释,如果看不懂我也没辙了
KMP算法的前缀next数组最通俗的解释,如果看不懂我也没辙了 分类: 常用基础算法 IT经典笔试题 2012-09-02 10:09 1042人阅读 评论(1) 收藏 举报 算法 c 编程 ...
最新文章
- C++ Primer 5th笔记(chap 16 模板和泛型编程)转发参数包
- Java连接FTP服务器并且实现对其文件的上传和下载
- 产品必备:注册登录完整解决方案 | 含原型下载
- Repeater控件使用总结
- C++虚函数与多态性
- 使用ToolRunner运行Hadoop作业的原理及用法
- Zookeeper集群安装(开启kerberos)
- Vue自定义指令—— 完美解决H5页面不同尺寸屏幕的适配问题
- python脚本用类编写_跟老齐学Python之编写类之二方法
- 排序算法之四 归并排序(C++版本)
- 容器技术Docker K8s 39 Serverless Kubernetes(ASK)详解-阿里云Serverless容器(ASK)适用场景与核心功能
- Max Script 入门教程
- 基于NNIE神经网络引擎_海思hi3516DV300方案硬件平台适合做哪些开发
- ζ(2)的夹逼代数证明
- JavaWeb:掌握Session的使用,完善用户登录注册案例的功能
- java纲要_幼儿园综合素质笔试大纲
- NVMe ssd加速卡和NVMe ssd硬盘的区别
- SDUST 实验+ 作业
- 半夜冒着大雨跑网吧写文章是怎样的体验?
- python可视化---阶梯图step()