【发布时间】:2013-04-18 14:05:08
【问题描述】:
我目前正在学习模式匹配算法,并且遇到过这两种算法。我有以下一般想法:
KMP
- 从左到右比较文本
- 使用故障数组智能切换
- 计算失败数组需要 O(m),其中 m 是模式的长度
- 占用 O(m),空间
- 需要 O(n),时间来搜索一个字符串
BM
- 比较最后一个字符的模式
- 使用不好的字符跳转和好的后缀跳转
- 计算表需要 O(m + 字母大小)
- 占用 O(m + 字母大小),空格
- 需要 O(n),但通常更好搜索
我遇到了以下引发此问题的问题(对或错):
如果我们想要,Knuth-Morris-Pratt (KMP) 算法是一个不错的选择 在许多不同的文本中重复搜索相同的模式。
所以我相信答案是正确的,因为假设每次您在不同的文本上运行算法时,预处理只是 O(n),而对于 BM,它是 O(n + 字母大小)。但是,我不确定我是否做出了正确的假设,即每次重新运行算法时都会重新计算一个新表。因为说文本总是落在英文字母表中。我只需要计算一次表并重用该表。因此,归根结底,这个问题的答案是否取决于算法都在包含在同一个字母表中的文本上运行这一事实,还是有其他可能影响它的因素?
【问题讨论】:
-
这里有很多信息:stackoverflow.com/q/12656160/56778,以及其他 SO 帖子。在 Google 上搜索 [kmp vs boyer-moore]。
-
@JimMischel 我已经看过那篇文章,但它并没有直接回答我问题的主要部分。我已经尝试用谷歌搜索了
-
这正是我正在寻找的。任何帮助将不胜感激。
标签: algorithm pattern-matching boyer-moore knuth-morris-pratt