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



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

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

两者都具有O(m+n(的时间复杂度。

那么,这两种算法之间的区别是什么?哪种算法最好使用?

并不总是关于时间复杂性,存储复杂性在这里扮演着重要角色:

Knuth Morris Pratt:

最坏情况性能:θ(m(预处理+θ(n(匹配

最坏情况下的空间复杂度:θ(m(

Z算法:

最坏情况性能:θ(m+n(预处理和匹配

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

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

此外,我建议为一些任务使用其他匹配算法,即使它们的时间复杂度更差,比如Boyer-moore,这都取决于的情况

最新更新