[作者:byeyear 首发:cnblogs 转载请注明]
关于KMP算法,教科书和网上都能找到很多资料,算法分析过程各有千秋。这里我们使用一种独特的图示法来对其进行分析,如果KMP让您感到压力,这篇文章或许能让您身上一轻。虾米,KMP是虾米东东?额,请关闭此页面。
我们用下面这张图表示文本串和模式串。这里我们没有使用指针的概念,而是在画图的时候让文本串和模式串的待比较部分对齐:
两个长条分别表示文本串和模式串。阴影部分是已经匹配的,阴影之后的一个字符发生了失配,于是我们需要将模式串右移,以进行下一次匹配。最直观的方式是右移一个字符,那么我们能不能多移几位呢?让我们近距离观察阴影部分。
假如模式串的阴影(已匹配)部分有这样的特征:已匹配部分的开始的若干字符等于结尾的若干字符,即C==D,那么因为这部分是已匹配的,就必然有A==B==C==D。于是下面这张图也一定是成立的:
上图中,B和C必然是匹配的。那就是说,我们可以将模式串一次性移动到B跟C对齐,并且只需从X和?开始比较。
但是且慢,我们先要确认一个问题:在A和B之间是否仍然存在着匹配可能?这里,我们只要保证C和D是满足相等条件的最长串,就可以保证A和B之间不存在匹配可能,因为从上图可以看出,C和D越长,模式串移动距离越小。当C和D为满足条件最长串,模式串的移动距离必然最小,于是A和B之间就不存在匹配可能。
上面就是关于KMP的另类图示分析。我还没发现有人用这个办法去理解KMP。我自己认为上面的图比使用具体的字符串做例子要好理解。客官您怎么看?
至于如何计算模式串的自匹配值,我们仍然可以用类似的方法进行图示分析,我就不再画图了。相信您一定可以搞定。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架