我在理解Boyer Moore字符串搜索算法方面遇到了问题。
我正在关注以下文件。 Link
我无法确定delta1和delta2的确切含义,以及它们如何应用于查找字符串搜索算法。 语言看起来很模糊......
如果有人可以帮助我理解这一点,那将非常有帮助。
或者,如果您知道任何其他易于理解的链接或文档,请分享。
提前致谢。
答案 0 :(得分:111)
Boyer-Moore背后的见解是,如果您开始在模式中以 last 字符开头的字符串中搜索模式,那么当您遇到不匹配时,可以向前跳转多个字符
假设我们的模式p
是字符序列p1
,p2
,...,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>