字符串模式匹配的KMP和Z算法有什么区别?

问题描述

在 KMP 算法中,我们对模式进行预处理以找到我们在匹配时用来跳过字符的最长前缀。

在Z-算法中,我们首先创建一个新字符串
new_string = 模式 + 'x' + 字符串
其中 x = 模式和字符串中都不存在的字符
生成 new_string 之后,我们对 new_string 进行预处理以找到最长的前缀,如果前缀的长度等于模式长度,那么我们找到了模式

两者的时间复杂度都是 O(m+n)。

那么这两种算法有什么区别,哪一种最好用?

解决方法

并不总是与时间复杂性有关,存储复杂性在这里起着重要作用:

克努斯·莫里斯·普拉特:

最坏情况下的性能:Θ(m) 预处理 + Θ(n) 匹配

最坏情况空间复杂度:Θ(m)

Z 算法:

最坏情况下的性能:Θ(m+n) 预处理和匹配

最坏情况空间复杂度:Θ(n+m)

此外,除了搜索模式之外,您还可以将搜索前缀和后缀的想​​法用于其他用途,因此您可能有其他理由对特定信息进行分析

另外,我会为某些任务推荐其他匹配算法,即使它们具有更糟糕的时间复杂度,例如 Boyer-moore,这完全取决于情况