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

String 字符串模式匹配的KMP算法和Z算法有什么区别?,string,algorithm,matching,String,Algorithm,Matching,在KMP算法中,我们对模式进行预处理,以找到匹配时用来跳过字符的最长前缀 在Z算法中,我们首先创建一个新字符串 新字符串=模式+x'+字符串 其中x=在模式和字符串中都不存在的字符 在生成新的_字符串之后,我们对新的_字符串进行预处理以查找最长的前缀,如果前缀的lent等于pattern length,则我们找到了该模式 两者的时间复杂度均为O(m+n) 那么这两种算法之间的区别是什么?哪种算法最适合使用?并不总是关于时间复杂度,存储复杂度在这里起作用: 克努特·莫里斯·普拉特: 最坏情况性能:

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

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

两者的时间复杂度均为O(m+n)


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

并不总是关于时间复杂度,存储复杂度在这里起作用:

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

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

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

Z算法:

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

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

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

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