KMP算法
KMP算法补充解释
看本文前请先通读算法竞赛进阶指南,本文仅为少许补充。
书中引理解释
我们先来定义“候选项”:以i为结尾的后缀个和前缀个数相同,则next[i]的值可能是,也就称是next[i]的候选项。
引理内容
若是next[i]的“候选项”不存在“候选项”在next[]到之间。推论:若next[i]=,也就是以i为结尾的后缀个和前缀个数相同,那么得出只有j = 或next[]或next[next[]]或……时,以i为结尾的后缀j个和前缀j个数相同。

证明:
我们沿用书中的反证法,假设在和next[]中存在,其中也为“候选项”。
配图解释:
假设next[i] =
(1)为1~i的完整字符串。(2)为以i为结尾的个字符。(3)为以i为结尾的next[]个字符。(4)为以i为结尾的个字符。
(5)为以1为首的个字符。(6)为以为结尾的next[]个字符。(7)为以1为首的next[]个字符。(8)为以1为首的个字符。
已知:(2)和(5)相同,(3)和(7)相同,(6)和(7)相同。
所以(3)和(6)相同。
假设(4)和(8)相同,那么(8)在(5)上肯定有对应后缀串,又由于 > next[],所以next[]应该为,矛盾。所以不存在,使为候选项。
这个引理有什么用?
如果next[i] = j,则next[i - 1] = j - 1,也就是说如果以i为结尾的j个字符和以1为首的j个字符相等时,必有以i - 1为结尾的j - 1个字符和以1为首的j个字符相等。contrapositive后,只有next[i - 1] = j - 1,才可能next[i] = j。
也就是next[i] = 。
这样我们对于next[i]求取可以做到很好的剪枝,只需要查询少量可能的j。且我们只需要找到第一个符合的即可,所以A自匹配算法复杂度为O(N)。
知道了next后如何在B中查找A?
A中附加了很多退回信息,这种信息相当于钩子一样。一般而言,一旦不匹配就相当于滑倒底端,从1开始再一个一个匹配。加入了next之后,相当于在半当中被挂住,可以从中间开始继续匹配。
Comments
No comments yet.