我目前正在学习模式匹配算法,并且遇到过这两种算法。我有以下一般想法:
KMP
BM
我遇到了以下引发这个问题的问题(正确或错误):
如果我们愿意,Knuth-Morris-Pratt(KMP)算法是一个不错的选择 在许多不同的文本中反复搜索相同的模式。
所以我认为答案是正确的,因为假设每次在不同的文本上运行算法时,预处理只是O(n),对于BM,它是O(n +字母大小)。但是,我不确定我是否正在做出正确的假设,即每次重新运行算法时都会重新计算新表。因为说文字总是落在英文字母表中。我只需要计算一次表,只需重用表。那么在一天结束时,这个问题的答案是否取决于这样的事实:算法都是在包含在同一字母表中的文本上运行,还是有一些其他可能影响它的因素?
答案 0 :(得分:21)
理论上,两种算法都具有“相似”的性能; KMP将在搜索阶段进行大约2n次比较,Boyer-Moore将在搜索阶段进行大约3n次比较,在最坏的情况下。在这两种情况下,您都不需要在获得新文本时重复预处理。
但真正的答案是你不应该在实践中使用任何一个。
由于所有额外的内存访问,两种算法所需的线性辅助存储导致现代架构的性能更加粗糙。
然而,Boyer-Moore和KMP背后的想法是大多数快速字符串匹配算法的基础。像我所知的每个实用有效的字符串匹配算法都使用像KMP的“失败函数”这样的想法;事实证明,你可以为即时模式计算一个次优的“失效函数”,它仍然为你提供线性时间匹配,同时只需要不断的额外空间。在固定模式与随机噪声匹配的“平均情况”中,Boyer-Moore比线性更快,这在许多实际情况中都有所体现。