我无法理解KMP如何维持O(m + n)。我正在寻找“aaaaaaaaaa ......”中的模式“aaaab”。
然后前缀表将是
AAAAB
01230
每次在'b'上发生不匹配时,它的前缀长度始终为0.因此模式只向右移动一步。
... AAAAAAAAAA
AAAAB
... AAAAAAAAAA
_aaaab
... AAAAAAAAAA
__ AAAAB
对于每次试验,我需要比较完全n次,因为在最后一次'b'发生不匹配。因此,它仍然需要O(m * n)比较。
有谁可以解释KMP如何获得O(m + n)?提前谢谢。
答案 0 :(得分:2)
诀窍在于,当你遇到不匹配时,你不只是将字符串中的位置提前1个字符。 KMP旨在避免这样做。在您的示例中,在连续4次匹配后发生不匹配。那些4 a中没有b,所以你可以将字符串中的搜索位置提高4,而不是1.你继续这样做,最后得到O(m)。
为了使所有这些工作正常,KMP使用该模式预先计算帮助程序表。此表基本上会告诉您在字符串中的位置前进多少,以便在模式中的给定位置发生不匹配。事实证明,该表也是以线性时间O(n)构建的。
有关示例,详细信息和(伪)代码,请参阅维基百科和其他地方。