九分钟带你弄懂KMP算法【数理篇】

简介: 在原理篇当中我已经讲解了KMP中最核心的NEXT数组,以及他的求法:NEXT[j]存储了从PAT[0]到PAT[j-1]位置,以PAT[0]为首,PAT[j-1]为结尾的两个最长子字符串的长度位(可以重叠,但不能相等)。忘记的朋友们可以看看之前的篇章。

前言


       我将KMP算法的详解分为三个篇章:


        【原理篇】:主要讲解KMP实现的原理,以及手动求NEXT数组。


     ->【数理篇】:主要讲解如何在手动求出NEXT数组的情况下,找出数学规律,为之后的算法实现奠定基础。


        【实现篇】:主要讲解以C语言代码的方式实现KMP算法,以及NEXT数组的优化。


      其余篇章将在之后更新


🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈


 制作不易,若对你有帮助的话点赞、关注、评论走一波,你们的支持是我前进路上最大的动力。


前情提要:


       在原理篇当中我已经讲解了KMP中最核心的NEXT数组,以及他的求法:NEXT[j]存储了从PAT[0]到PAT[j-1]位置,以PAT[0]为首,PAT[j-1]为结尾的两个最长子字符串的长度位(可以重叠,但不能相等)。忘记的朋友们可以看看之前的篇章。


数理篇正式开始:



0
1 2 3 4 5 6 7 8 9 10
PAT字符串 a b c a b a b c a b c
NEXT数组 -1 0 0 0 1 2 1 2 3 4 5


现在有这样一个NEXT数组,除了NEXT[0]与NEXT[1]是已经规定好的-1和0之外,其余的都要我们手动去求。在上一个篇章当中,我们学会了如何用手去求NEXT数组。但在实际生产过程当中,这种方法肯定是不可取的,那么NEXT数组的构成当中有什么规律呢?


我们先假设在NEXT数组当中,有两个指针,一个叫i一个叫k。


设有NEXT[i]=k,也就是可以通过NEXT数组的下标去访问K指针所在的位置,这一假设是以下的推论的大前提。


此时就有p[0]--p[k-1](以首元素为头的子字符串)=p[x]--p[i-1](以i-1为尾的子字符串)这两个字符串相同,疑惑为什么相同的朋友们可以去看看NEXT数组的定义。那这里的X从哪里来的呢?


f59e6bf8d60343309b54b898fe3a1582.jpg


x是为了之后的推导,先假设出来的,如果不解继续往下看~


因为两字符串长度相同(定义),所以就存在关系 k-1-0=i-1-x,也就可以推导出x=i-k


此时再将x放回上文的推导关系,就有这样的一个关系p[0]--p[k-1]=p[i-k]--p[i-1]


情况1:PAT[i]=PAT[K]


PAT[i]=PAT[K]时,也就是对应的两个字符相同,可以参考上图中i k对应的位置。又因为


p[0]--p[k-1]=p[i-k]--p[i-1],p[i]=p[k](字符相同),所以就有p[0]--p[k]=p[i-k]--p[i],

又因为从next[i]=k可以推导出p[0]--p[k-1]=p[i-k]--p[i-1],那么是不是p[0]--p[k]=p[i-k]--p[i]可以反向推导出next[i+1]=k+1!


那么也就可以得出情况一的结论:


在PAT[i]=PAT[k]的情况下,NEXT[i+1]=k+1。


f59e6bf8d60343309b54b898fe3a1582.jpg


那如果PAT[i]!=PAT[k]呢?那这就是我们的情况2


情况2:PAT[i]!=PAT[K]


那就非常简单粗暴了,k=NEXT[k],也就是一直往回退直到满足PAT[i]=PAT[k]这一情况时,在继续套用情况一进行推导。如图,此时PAT[i]!=PAT[K],那么,就令k=NEXT[k],也就是移动到,p[0]的位置,此时满足情况1PAT[i]=PAT[K],所以此时的NEXT[i+1]=k+1,也就是NEXT[4]=1。

2e41650292bb4bc5aed5b7783afdcb2e.jpg


若退回到0位置时还不相等呢?那继续往下退到-1岂不是越界了?这里可以加一个判定,若退到0还不满足,可以直接令NEXT[i+1]=0(-1+1),具体实现可以关注我下一篇KMP代码实现的讲解。


05144020fdb7427f9e164c321bcb1ac1.jpg


至此,本篇博客的内容九分钟带你弄懂KMP算法【数理篇】告一段落,若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。


若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。


诸君,山顶见!


🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈

目录
相关文章
|
3月前
|
算法
第四章 KMP算法理论基础
第四章 KMP算法理论基础
30 0
|
3月前
|
算法
KMP算法
KMP算法
50 0
|
5月前
|
算法 C++
A : DS串应用–KMP算法
这篇文章提供了KMP算法的C++实现,包括计算模式串的next数组和在主串中查找模式串位置的函数,用于演示KMP算法的基本应用。
|
6月前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
152 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
5月前
|
算法
KMP算法
KMP算法
43 0
|
6月前
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用
|
7月前
|
人工智能 算法 BI
一篇文章讲明白KMP算法(俗称看毛片算法)
一篇文章讲明白KMP算法(俗称看毛片算法)
74 0
|
7天前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
7天前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
101 68
|
16天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。