📅  最后修改于: 2020-12-11 01:45:39             🧑  作者: Mango
Robert Boyer和J Strother Moore于1977年成立了它。BM字符串搜索算法是一种特别有效的算法,自那时以来一直作为字符串搜索算法的标准基准。
的BM算法需要一个“落后”的方法:模式字符串(P)与所述文本字符串的开始(T)对准,并且然后比较的图案的字符从右到左,以最右边的字符开始。
如果比较的字符不在模式中,则无法通过分析此位置上的任何其他方面找到匹配项,因此可以完全在不匹配字符更改模式。
为了确定可能的偏移,BM算法同时使用了两种预处理策略。每当发生不匹配时,如果每种情况都使用最有效的策略,则该算法会使用两种方法来计算偏差并选择更为显着的偏移。
这两种策略被称为B-M的启发式算法,因为它们用于减少搜索。他们是:
这种启发式方法有两个含义:
因此,在任何情况下,偏移都可能大于一个。
示例1:让文本T =
示例2:如果不存在错误字符,则使用该模式。
在某些情况下,坏字符启发法会产生一些负面变化。
这意味着我们需要一些额外的信息,以便在遇到坏字符有所转变。该信息与模式中各个方面的最后位置有关,也与模式中使用的字符集(通常称为模式的字母∑)有关。
良好的后缀是已成功匹配的后缀。在不匹配之后,不良字符启发法会发生负向偏移,请查看是否匹配的模式子串直到不良字符具有良好的后缀为止,如果是这样,则我们向前跳的次数等于找到的后缀的长度。
Algorithm | Preprocessing Time | Matching Time |
---|---|---|
Naive | O | (O (n – m + 1)m) |
Rabin-Karp | O(m) | (O (n – m + 1)m) |
Finite Automata | O(m|∑|) | O (n) |
Knuth-Morris-Pratt | O(m) | O (n) |
Boyer-Moore | O(|∑|) | (O ((n – m + 1) + |∑|)) |