字符串匹配-BM算法

来源:互联网 发布:代办网络经营许可证 编辑:程序博客网 时间:2024/04/30 01:29

BM算法

1、 三个shift函数:d1,d2,d3,函数的作用是决定当匹配不成功时窗口的移动位数。

2、 假设一个情况:已经读入了一个既是搜索窗口中的文本的后缀,同时也是模式串后缀的字符串u,并且读入的下一个文本字符σ与模式串的下一个字符a不相等。

3、 窗口安全移动是指窗口移动意味着读入新的字符,放弃上一个窗口的前面几个字符,要保证放弃的字符确实无法参与匹配。窗口移动方向是从前向后。算法的核心思想是对于模式串,可能至少有2个相同部分,这些部分肯定有一个在模式串的后缀,其它的部分可能在模式串的中间,也可能在模式串的前缀,在后缀搜索时,发现了文本串和模式串的部分匹配X,此时,如果模式串除了后缀外,其它部分还含有X,则使文本串和模式中发生不匹配的读入的字符加上原来的匹配的X形成的部分有可能与模式串其它部分的X发生匹配(如果与模式串所有的X不匹配,则说明这个窗口内不可能发生匹配),安全地向后移动窗口,放弃的部分肯定不会发生匹配了。

1) d1:后缀u在模式串p中的另一个位置是最右出现位置是j(不包括在模式串尾的出现),文本串的窗口安全移动方法是将窗口移动m-j字符,使文本中的u与模式串中最右边的u的出现位置相对齐。对模式中的每个后缀,计算它到它的下一个出现之间的距离,即shift的d1,如果P的后缀u不在P中重复出现,则d1(u)被置为模式串长度m

2) d2:后缀u不出现在p中的任何其他位置。但u的后缀v可能是模式串p的一个前缀,需要对模式串所有的后缀计算第二个函数d2。对于P的每个后缀u,d2(u)表示既是P的前缀,同时也是u的后缀的最长字符串v的长度.

3) d3:在搜索窗口中从后向前搜索时,在文本字符σ处不能成功匹配。保证下一次验证时文本字符σ一定与模式串中的一个字符σ相对应(即:使上次匹配不成功的那个字符能在模式串的第二个X部分匹配成功,在模式串中找到这个字符,该字符是X的前面一个字符),对每个字母表中的每个字符σ,d3(σ)表示σ在模式串的最右出现位置到模式串末尾的距离,如果σ不在P中,d3为m

4、 读入文本字符串u并在字符σ上不匹配时,进行如下几次比较:

1)  第一次:取d1(u)和d3(σ)中较大值。

2) 第二次:以上面的比较结果与m-d2(u)中的较小者,因为后者是最大的安全移动距离。

5、如果抵达了窗口的起始位置,说明发现阶段一个成功匹配,用d2计算窗口的下一次移动距离,进行继续匹配。

原创粉丝点击