Boyer Moore算法理解与实例?

时间:2011-06-01 21:16:50

标签: algorithm string-search

我在理解Boyer Moore字符串搜索算法方面遇到了问题。

我正在关注以下文件。 Link

我无法确定delta1和delta2的确切含义,以及它们如何应用于查找字符串搜索算法。 语言看起来很模糊......

如果有人可以帮助我理解这一点,那将非常有帮助。

或者,如果您知道任何其他易于理解的链接或文档,请分享。

提前致谢。

6 个答案:

答案 0 :(得分:111)

Boyer-Moore背后的见解是,如果您开始在模式中以 last 字符开头的字符串中搜索模式,那么当您遇到不匹配时,可以向前跳转多个字符

假设我们的模式p是字符序列p1p2,...,pn,我们正在搜索字符串s,目前p已对齐,pn位于i的索引s

E.g:

s = WHICH FINALLY HALTS.  AT THAT POINT...
p = AT THAT
i =       ^

B-M论文做了以下观察:

(1)如果我们尝试匹配不在p中的字符,那么我们可以向前跳转n个字符:

'F'不在p,因此我们提前n个字符:

s = WHICH FINALLY HALTS.  AT THAT POINT...
p =        AT THAT
i =              ^

(2)如果我们尝试从k的末尾匹配最后位置为p的字符,那么我们可以向前跳转k个字符:

p中的最后一个位置距离结尾是4,因此我们提前4个字符:

s = WHICH FINALLY HALTS.  AT THAT POINT...
p =            AT THAT
i =                  ^

现在我们从i向后扫描,直到我们成功或我们遇到不匹配。 (3a)如果不匹配从k开头p出现p字符且不匹配的字符不在k中,那么我们可以提前(至少)p个字符。

'L'不在p6且与s = WHICH FINALLY HALTS. AT THAT POINT... p = AT THAT i = ^ 不匹配,因此我们可以推进(至少)6个字符:

i

然而,我们实际上可以比这更好。 (3b)因为我们知道在旧p我们已经匹配了一些字符(在这种情况下为1)。如果匹配的字符与s = WHICH FINALLY HALTS. AT THAT POINT... p = AT THAT i = ^ 的开头不匹配,那么我们实际上可以向前跳一点(这篇额外的距离在论文中称为'delta2'):

s = WHICH FINALLY HALTS.  AT THAT POINT...
p =                       AT THAT
i =                             ^

此时,观察(2)再次适用,给出

{{1}}

和宾果游戏!我们已经完成了。

答案 1 :(得分:44)

第一条建议,深呼吸。你明显感到紧张,当你感到压力时,首先发生的事情是大脑的大块关闭。这使得理解变得困难,这增加了压力,并且你遇到了问题。

改善头顶空间的5分钟超时似乎无法采取,但可能会有惊人的帮助。

现在说,该算法基于一个简单的原理。假设我正在尝试匹配长度为m的子字符串。我将首先看一下索引m处的角色。如果该字符不在我的字符串中,我知道我想要的子字符串不能以索引1, 2, ... , m的字符开头。

如果该字符在我的字符串中,我会假设它位于我的字符串中的最后一个位置。然后我会跳回来并开始尝试匹配我可能的起始位置的字符串。这条信息是我的第一张表。

一旦我从子串的开头开始匹配,当我发现不匹配时,我不能从头开始。我可以通过一场比赛从一个不同的角度开始。例如,如果我尝试匹配anand ananand成功匹配anan,请认识到以下a不是d,而是我我只是匹配an,所以我应该跳回去尝试匹配我的子串中的第三个字符。这个,“如果我在匹配x个字符后失败,我可以在匹配的第y个字符上”信息存储在第二个表中。

请注意,当我无法匹配时,第二个表知道匹配的距离我可能基于我刚刚匹配的内容。第一个表知道我可能会基于我刚刚看到的那个我无法匹配的角色。你想对这两条信息使用更悲观的东西。

考虑到这一点,算法的工作原理如下:

start at beginning of string
start at beginning of match
while not at the end of the string:
    if match_position is 0:
        Jump ahead m characters
        Look at character, jump back based on table 1
        If match the first character:
            advance match position
        advance string position
    else if I match:
        if I reached the end of the match:
           FOUND MATCH - return
        else:
           advance string position and match position.
    else:
        pos1 = table1[ character I failed to match ]
        pos2 = table2[ how far into the match I am ]
        if pos1 < pos2:
            jump back pos1 in string
            set match position at beginning
        else:
            set match position to pos2
FAILED TO MATCH

答案 2 :(得分:17)

该算法的共同发明人的网站怎么样 - 这有帮助吗? http://www.cs.utexas.edu/users/moore/best-ideas/string-searching/index.html

喝彩!

答案 3 :(得分:2)

H.W的解释。 Lang 非常清楚,因为它详细解释了B&amp; M,详细说明。只有在读完这篇文章后,我才能理解B&amp; M算法。

http://www.inf.fh-flensburg.de/lang/algorithmen/pattern/bmen.htm

答案 4 :(得分:1)

我找到了这个链接,这以最基本的方式解释了算法。希望这可以帮助。 http://www.blackbeltcoder.com/Articles/algorithms/fast-text-search-with-boyer-moore

答案 5 :(得分:0)

另一个详细解释...... {{3P>