关于KMP算法的一些碎碎念(非教程向)

这篇博客的目的不是为了探讨算法的具体实现,只是用于个人记录一些KMP的思想便于以后复习,如要学习了解KMP,建议看视频学习,可跳过此篇博客。好,叠甲完毕!

KMP算法简介

具体的可以百度,KMP复杂度O(m+n),比起暴力匹配O(mn)优化的不是一点!
m是文本串的长度,n是模式串的长度,KMP做的就是在文本串里快速找到模式串,即子串匹配。

下面是一些碎碎念

现在有比KMP更好的字符串匹配算法了,忘了叫啥,有兴趣可自行百度。

某些场景下可以使用字符串哈希,比如找回文串,利用哈希预处理,预处理完找起来就是O(1),预处理的复杂度是多少我忘了。。。

AC自动机等字符串相关算法也和KMP紧密相关,没事,AC自动机我也手动实现不了:(

算法题里面一般会是KMP的变形,直接套板子的还是比较少,嗯,今年的省赛的某道据说是KMP的变形,没看出来,直接打铁。

说了这么多,可以看出KMP在字符串匹配里面的地位。

KMP的实现

这块看博客会比较难受,字符串的匹配不好作图,直接去找视频了解思想,然后找标准的代码直接开啃。

值得一提的是,KMP的实现有多种,有next数组第一位放-1的,第一位放0的,还有构造的是lsp数组,然后lsp稍微变化一遍就成了next数组的(B站一个阿三的视频讲的就是lsp,我们的教材用的不是这个)。所以你看视频的时候感觉模模糊糊或者懵逼的原因可能是因为他们讲的思想差不多,实现是不一样的。

考研408的KMP算法看天勤的,手动会求next数组就行,考了代码实现当场把卷子撕了。

KMP缩短匹配次数的思想

下面的next数组之类的是啥不做解释,自行找视频了解。

j=next[j],这是一句经典的形容KMP的代码,不是说代码实现里一定有这一句,而是这句话表达了一个跳跃的思想,不像暴力一样要一个一个匹配过去。

KMP预处理模式串得到next数组再去进行匹配,本质用的是当发生匹配错误时,错误的字符的前面的部分字符可以不用再匹配,即公共前后缀,当前缀和后缀相同时,可直接让文本串发生匹配错误的那一位与公共前缀的后一位进行匹配,即让文本串发生错误的那一位与next数组的值指向的(模式串的)那一位进行匹配。

个人觉得KMP的精华,最天才的地方在于next数组的求解,缩小匹配次数的思想是借助了公共前后缀。

关于KMP算法的一些碎碎念(非教程向)_第1张图片

注:图片来自阿三视频。

  • 为什么X前面部分串(ab)与模式串C的前面的子串(abcdab)的公共后缀必定相同?

因为是一个一个比较过来,X前面长度相同的子串(abcdab)是肯定与模式串C前面的子串相同的,不然怎么会比较到C,早在C之前就终止了。


代码的话我只看了阿三的lsp数组实现:github入口

关于借助next数组实现KMP,考完研或者什么时候有空再补一下。
(现在学408学到这里稍作记录,给以后实现KMP打个断点,不过感觉了解思想就够了,要用的话拿现成板子过来用就行:( )

你可能感兴趣的:(随笔,算法,dubbo,KMP)