A-A+
图解字符串匹配之Horspool算法和Boyer-Moore算法
说在前面的话
字符串匹配问题要求在一个较长的称为文本的n个字符的串中,寻找一个称为模式的给定的m个字符的串。
Horspool算法是Boyer-Moore算法的一个简化版本,都是从右到左进行比较。
Horspool算法
horspool算法将主串中匹配窗口的最后一个字符跟模式串中的最后一个字符比较。如果相等,继续从后向前对主串和模式串进行比较,直到完全相等 或者在某个字符处不匹配为止(如下图中的α与σ失配)。如果不匹配,则根据主串匹配窗口中的最后一个字符β在模式串中的下一个出现位置将窗口向右移动。
Horspool算法相对于Boyer-Moore算法改进了坏字符规则,Boyer-Moore算法只是将模式串P中从当前未匹配位置向右第一个坏字符与母串的坏字符(未匹配的字符)对齐进行再次匹配,Horspool算法是以当前匹配窗口中母串的最末尾的一个字符和模式串最靠近它的字符对齐,下图中β是当前匹配窗口的母串最后一个字符,将其与模式串左边最靠近的β对齐移动。
Horspool算法预处理
为了实现模式串的移动,必须先记录每一个字符串在模式串中距离最右边的距离:
Boyer-Moore算法
Boyer-Moore算法原理
Boyer-Moore算法是一种基于后缀匹配的模式串匹配算法,后缀匹配就是模式串从右到左开始比较,但模式串的移动还是从左到右的。字符串匹配 的关键就是模式串的如何移动才是最高效的,Boyer-Moore为了做到这点定义了两个规则:坏字符规则和好后缀规则,下面图解给出定义:
下面分别针对利用坏字符规则和好后缀规则移动模式串进行介绍:
坏字符规则
- 1. 如果坏字符没有出现在模式字符中,则直接将模式串移动到坏字符的下一个字符:
(坏字符c,没有出现模式串P中,直接将P移动c的下一个位置)
- 2. 如果坏字符出现在模式串中,则将模式串最靠近好后缀的坏字符(当然这个实现就有点繁琐)与母串的坏字符对齐:
(注:如果模式串P是babababab,则是将第二个b与母串的b对齐)
好后缀规则
好后缀规则分三种情况
- 1. 模式串中有子串匹配上好后缀,此时移动模式串,让该子串和好后缀对齐即可,如果超过一个子串匹配上好后缀,则选择最靠靠近好后缀的子串对齐。
- 2. 模式串中没有子串匹配上后后缀,此时需要寻找模式串的一个最长前缀,并让该前缀等于好后缀的后缀,寻找到该前缀后,让该前缀和好后缀对齐即可。
其实,1和2都可以看成模式串还含有好后缀串(好后缀子串也是好后缀)。
- 3. 模式串中没有子串匹配上后后缀,并且在模式串中找不到最长前缀,让该前缀等于好后缀的后缀。此时,直接移动模式到好后缀的下一个字符。