我目前正在学习模式匹配算法,并且遇到过这两种算法。我有以下一般想法:
KMP
- 从左到右比较文本
- 使用故障阵列智能转移
- 需要 O(m),其中 m 是模式的长度,来计算失败数组
- 需要 O(m),空间
- 花费 O(n),时间来搜索一个字符串
BM
- 比较最后一个字符的模式
- 使用坏字符跳转和好的后缀跳转
- 需要 O(m + 字母大小) 来计算表格
- 需要 O(m + 字母大小), 空间
- 需要 O(n),但通常更好地搜索
我遇到了以下引发此问题的问题(对或错):
如果我们想在许多不同的文本中重复搜索相同的模式,Knuth-Morris-Pratt (KMP) 算法是一个不错的选择。
所以我相信答案是正确的,因为假设每次你在不同的文本上运行算法时,预处理只是 O(n),而对于 BM,它是 O(n + 字母大小)。但是,我不确定我是否做出了正确的假设,即每次重新运行算法时都会重新计算一个新表。因为说文本总是落在英文字母表中。我只需要计算一次表并重用该表。因此,归根结底,这个问题的答案是否取决于算法都在同一字母表中包含的文本上运行的事实,还是有其他可能影响它的因素?