前言
Boyer-Moore算法是一种基于后缀匹配的模式串匹配算法(简称BM算法),后缀匹配就是模式串从右到左开始比较,但模式串的移动依然是从左到右的。在实践中,BM算法效率高于前面介绍的《KMP算法》,算法分为两个阶段:预处理阶段和搜索阶段;预处理阶段时间和空间复杂度都是是O(m+sigma),sigma是字符集大小,一般为256;在最坏的情况下算法时间复杂度是O(m*n);在最好的情况下达到O(n/m)。
BM算法实现
BM算法预处理过程
BM算法有两个规则分别为坏字符规则(Bad Character Heuristic)和好后缀规则(Good Suffix Heuristic);这两种规则目的就是让模式串每次向右移动尽可能大的距离。BM算法是每次向右移动模式串的距离是,按照好后缀算法和坏字符算法计算得到的最大值。以下给出基本概念:
坏字符:输入文本字符串中的字符与模式串当前字符不匹配时,则文本字符串的该字符称为坏字符;
好后缀:是指在遇到坏字符之前,文本串和模式串已匹配成功的字符子串;
下面是坏字符和好后缀的图示:
坏字符规则:当输入文本字符串中的某个字符跟模式串的某个字符不匹配时,模式串需要向右移动以便进行下一次匹配,移动的位数 = 坏字符在模式串中对应的位置 - 坏字符在模式串中最右出现的位置。此外,如果模式串中不存在"坏字符",则最右出现位置为-1;所以坏字符规则必然有两种情况,下面会进行讨论。
好后缀规则:当字符失配时,后移位数 = 好后缀在模式串中对应的位置 - 好后缀在模式串上一次出现的位置,且如果好后缀在模式串中没有再次出现,则为-1。根据模式串是否存在好后缀或部分好后缀,可以分为三种情况,下面会逐一讨论。