KMP算法最坏情况分析

KMP algorithm worst case analysis

我无法理解 KMP 是如何保持 O(m+n) 的。我正在寻找“aaaaaaaaaa...”中的模式“aaaab”。

那么前缀[=​​30=]就是

aaaab

01230

每次 'b' 上发生不匹配时,其前缀长度始终为 0。因此模式仅向右移动一步。

aaaaaaaaaa...

aaaab

aaaaaaaaaa...

_aaaab

aaaaaaaaaa...

__aaaab

并且对于每次试验,我都需要比较完整的 n 次,因为不匹配发生在最后 'b'。因此它仍然需要 O(m*n) 次比较。

谁能给我解释一下 KMP 是如何得到 O(m+n) 的?提前致谢。

诀窍在于,当您遇到不匹配时,您不只是将字符串中的位置提前 1 个字符。 KMP 旨在避免这样做。在您的示例中,不匹配发生在 4 个连续匹配 a 之后。这 4 个 a 中没有 b,因此您可以将字符串中的搜索位置提高 4,而不是 1。您继续这样做,最终得到 O(m)。

为了使所有这些都起作用,KMP 使用该模式来预先计算一个助手 table。 table 基本上会告诉您在模式中的给定位置发生不匹配时,字符串中的位置要前进多少。原来table也是线性时间建立的,O(n).

有关示例、详细信息和(伪)代码,请参阅维基百科和其他地方。