繁体   English   中英

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

[英]What is the difference between KMP and Z algorithm of string pattern matching?

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

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

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

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

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

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

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

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

Z算法:

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

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

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

此外,我会推荐一些任务的其他匹配算法,即使它们的时间复杂度更差,比如 Boyer-moore,这完全取决于情况

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM