【问题标题】:What is the difference between KMP and Z algorithm of string pattern matching?字符串模式匹配的KMP和Z算法有什么区别?
【发布时间】:2021-07-21 20:17:51
【问题描述】:
在 KMP 算法中,我们对模式进行预处理,以找到我们在匹配时用来跳过字符的最长前缀。
在Z-算法中,我们首先创建一个新字符串
new_string = 模式 + 'x' + 字符串
其中 x = 模式和字符串中都不存在的字符
在创建 new_string 之后,我们对 new_string 进行预处理以找到最长的前缀,如果前缀的借出等于模式长度,那么我们找到了模式
两者的时间复杂度都是 O(m+n)。
那么这两种算法有什么区别,哪一种最好用呢?
【问题讨论】:
标签:
string
algorithm
matching
【解决方案1】:
并不总是与时间复杂度有关,存储复杂度在这里起着重要作用:
克努斯·莫里斯·普拉特:
最坏情况下的性能:Θ(m) 预处理 + Θ(n) 匹配
最坏情况空间复杂度:Θ(m)
Z算法:
最坏情况下的性能:Θ(m+n) 预处理和匹配
最坏情况空间复杂度:Θ(n+m)
此外,除了搜索模式之外,您还可以将搜索前缀和后缀的想法用于其他用途,因此您可能有其他理由对特定信息进行分析
另外我会推荐一些任务的其他匹配算法,即使它们的时间复杂度更差,比如 Boyer-moore,这完全取决于具体情况