KMP算法前后缀原理
要想把把KMP算法搞清楚,必须要先了解一个叫做BF的暴力破解算法。这个算法的思路相当简单,是在串区配中最容易想到的一个算法。其实就是把所有有可能的串挨个比较一遍,这样匹配的结果一定是正确的。
如上图所示,T是主串,P是模式串,i是主串T当前的位置,j是模式串P当前的位置,当i=4,j=4时发现T[i]!=P[j],BF算法会将i回溯为1,j回溯为0重新进行下一轮的对比。
下面我们来考虑一个问题,当i=4,j=4检测到字符不相等时,到底有没有必要把i回溯到1、j回溯到0?
把i回溯到1、j回溯到0实际上是为了比较T(1,8)和P是否相等。若能百分之百确定T(1,8)和P不相等,则把i回溯到1、j回溯到0则无意义。可以直接跳过这一轮检测,直接进入下一轮i回溯为2,j回溯为0的检测。
因为T(1,3)是T(1,8)开头的3个字符,P(0,2)是P开头的3个字符。所以:
若T(1,3)不等于P(0,2),则T(1,8)则必不等于P,所以直接跳过i回溯到1、j回溯到0这一步。
若T(1,3)等于P(0,2),则T(1,8)有可能等于P,这一步不能跳过,还得继续比较。又因为前三个字符已经确定是相等的,所以不必从i=1,j=0开始比较,而是可以直接从i=4,j=3开始比较。
所以整个问题的关键就在于T(1,3)到底和P(0,2)相不相等。
又因为T(1,3)等于P(1,3),所以这个问题可以可以转化为比较P(1,3)和P(0,2)相不相等。P(1,3)其实就是P(0,3)长度为3的后缀,P(0,2)其实就是P(0,3)的长度为3的前缀。所以我们有如下结论:
当i=4,j=4检测到字符不相等时,若P长度为3的前缀和后缀相等,则i保持不变,j回溯至3即可。若不等,则整个串也必不匹配,可以跳过此次回溯。
同理我们可以得出:
当i=4,j=4检测到字符不相等时,若P长度为2的前缀和后缀相等,则i保持不变,j回溯至2即可。若不等,则整个串也必不匹配,可以跳过此次回溯。
当i=4,j=4检测到字符不相等时,若P长度为1的前缀和后缀相等,则i保持不变,j回溯至1即可。若不等,则整个串也必不匹配,可以跳过此次回溯。
当i=4,j=4检测到字符不相等时,若P不存在任何长度相等的前缀和后缀相等,则i保持不变,j回溯至0即可。
下面我们不举特殊的例子,直接推导:
假设T的长度是m,P的长度是n
当匹配到第一个不相等的字符时,根据暴力破解法,实际上进行了如下操作:
int k = j - 1;
while (k > 0) {把T从i - k开头的位置重新和P比较注意此时P(j - k, j - 1)等于T(i - k, i - 1)必相等。若此时P(0, j - 1)的长度为k的前缀和后缀相等,即P(0,k - 1)和P(j - k, j - 1)相等,则P(0, k - 1)等于T(i - k, i - 1),这就意味着T(i - k, i - k + n)和P前k个字符是相等的,所以不需要再比较了,我们可以直接比较T(i - k + k, i - k + k + n)和P(k, n - k + 1)即可,也就是比较T(i,i+n)和P(k,n-k+1)。所以i保持不变,j回溯至k。若此时P(0, j - 1)的长度为k的前缀和后缀相等,即P(0,k - 1)和P(j - k, j - 1)不相等,则P(0, k - 1)不等于T(i - k, i - 1),这就意味着T(i - k, i - k + n)和P前k个字符不相等。所以将i回溯至i-k重新比较一遍无意义。k--;
}
KMP算法前后缀原理相关推荐
- 【数据结构与算法】之深入解析KMP算法的核心原理和实战演练
一.简介 ① 概念 KMP 算法是一种改进的字符串匹配算法,由 D.E.Knuth,J.H.Morris 和 V.R.Pratt 提出的,因此称它为克努特-莫里斯-普拉特操作,简称 KMP 算法. K ...
- KMP算法具体解释(转)
作者:July. 出处:http://blog.csdn.net/v_JULY_v/. 引记 此前一天,一位MS的朋友邀我一起去与他讨论高速排序,红黑树,字典树,B树.后缀树,包含KMP算法,只有在解 ...
- 【gif图文】KMP算法(从暴力匹配到快速匹配)
从暴力匹配到快速匹配(KMP算法) 学习kmp算法前,首先要先了解什么是kmp算法,kmp算法具体优点是什么,kmp的主要应用方向在哪. 然后才是,代码实现 带着以上问题,我们来一步一步学习kmp算法 ...
- 【GO语言实现字符串匹配算法-KMP算法】
[GO语言实现字符串匹配算法-KMP算法] KMP算法原理说明: KMP算法是一种改进的字符串匹配算法,是有D.E.Knuth,J.H.Morris和V.R.Pratt提出的,所以被称为KMP算法. ...
- 图解KMP算法,带你彻底吃透KMP
模式串匹配--KMP算法 KMP算法一直是一个比较难以理解的算法,本篇文章主要根据<大话数据结构>中关于KMP算法的讲解,结合自己的思考,对于KMP算法进行一个比较详细的解释. 由于博主本 ...
- KMP算法真的有这么难吗?(清晰详细版)
KMP算法我一年之前就接触了,但由于实在难以理解next[]求法故放弃,每次做一次字符串匹配的时候,很多情况下都是暴力解决,除了极个别情况把next[]求法背成模板求解AC. 注意:KMP算法已经成为 ...
- 终于弄懂KMP算法了
1.简例弄懂KMP-点此链接查看 看了上面的文章,你肯定大概明白了KMP的运作原理,但是你可能对于文章提到的"部分匹配值"的又来还存在疑惑,那么请继续往下看: 我们先抛出两个问题, ...
- KMP算法-超级无敌详细(嚼碎了喂你)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.朴素的模式匹配算法(BF暴力匹配算法) 二.KMP算法 1.next[]数组求法 2.next[j]数组代码分析 ...
- C语言 实现 KMP算法
已传入github,可下载,想测试对应函数,调用传参即可,记得注释掉之前的主函数 文件名为2022_1_19,因为是是那天写的 GitHub - frankRenlf/c_programshttps: ...
最新文章
- 韩国文档的编码方式_像韩国学生学习英语一样学习编码
- down 网卡端口周期性的up_Linux 中如何启用和禁用网卡?
- python系统监控_python psutil系统监控详解
- 安装numpy,setuptools的时候,不能再注册表中识别出来python2.7
- jQuery之高级选择器
- dotnet Blazor 用 C# 控制界面行为
- 【渝粤教育】电大中专跨境电子商务理论与实务 (20)作业 题库
- swagger core 和 swagger ui 如何关联【窥探】
- python 整数输出 d f_如何将数字(10,11,12,13,14,15)分配给Python 3中的字母(A,B,C,D,E,F)?...
- php的SAPI,CLI SAPI,CGI SAPI
- 江苏省职称计算机考试internet,江苏省计算机职称考试题库及答案
- signal、kill、fork
- Android 11 系统字体加载流程
- 第十一届蓝桥杯省赛B组真题训练
- 目前可行的4种知网文献免费下载方法分享
- 7-97 约会成功了吗?
- STM32MP157C-DK2->Develop on Arm® Cortex®-A7之 C语言开发uart例程
- HDU6608 Fansblog
- 【Java】若依前后端分离,分页数据为null报错
- TVM中的auto-scheduling机制(Ansor)学习笔记
热门文章
- 快手公布于香港联交所主板上市计划详情;木莲庄酒管全线开放加盟合作 | 美通企业日报...
- Weblogic 弱密码+部署war包getshell
- Java redis 删除单个和多个key的方法
- scipy butter 滤波器实现
- 苹果发布了没有太多更新的 iOS 13 beta 8;一次编码、到处运行;SwiftUI 的两个特性;如何让网站加载更快...
- C语言实现自动出题、单词拼写等功能,附带管理员模式
- canvas写的地铁地图
- 盘点 | 2023年最值得学的编程语言TOP 5,Python再度夺冠!
- 【Elastic Search权威指南 读书小记3】ES之数据操作
- 欧拉全新发布:基础软件的技术溢出效应或再现!