KMP算法最坏情况分析

时间:2017-01-01 09:03:06

标签: algorithm time-complexity string-search knuth-morris-pratt

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

  • pattern:aaaab(length n)
  • string:aaaaaaaaaa ...(length m)

然后前缀表将是

  

AAAAB

     

01230

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

  

... AAAAAAAAAA

     

AAAAB

     

... AAAAAAAAAA

     

_aaaab

     

... AAAAAAAAAA

     

__ AAAAB

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

有谁可以解释KMP如何获得O(m + n)?提前谢谢。

1 个答案:

答案 0 :(得分:2)

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

为了使所有这些工作正常,KMP使用该模式预先计算帮助程序表。此表基本上会告诉您在字符串中的位置前进多少,以便在模式中的给定位置发生不匹配。事实证明,该表也是以线性时间O(n)构建的。

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