我在理解Boyer Moore字符串搜索算法时遇到问题。
我正在关注以下文件。链接
我无法弄清楚delta1和delta2的真正含义是什么,以及他们如何将其用于查找字符串搜索算法。语言看起来有点模糊。
如果有人在那里可以帮助我理解这一点,那将是非常有帮助的。
或者,如果您知道其他易于理解的链接或文档,请分享。
提前致谢。
第一条建议,深吸一口气。您显然会感到压力,当您感到压力时,第一件事就是大脑的大部分区域都关闭了。这使理解变得困难,增加了压力,并且您遇到了问题。
5分钟的超时时间可能无法改善您的顶空,但可能会非常有用。
如此说来,该算法基于简单的原理。假设我要匹配一个length的子字符串m。我将首先看一下index上的字符m。如果该字符不在我的字符串中,那么我知道我想要的子字符串不能以index处的字符开头1, 2, ... , m。
m
1, 2, ... , m
如果该字符在我的字符串中,则假定它在字符串的最后位置。然后,我跳回去,开始尝试从可能的起始位置匹配我的字符串。这条信息是我的第一张桌子。
从子字符串的开头开始匹配后,一旦发现不匹配,就不能从头开始。我可能会从另一点开始参加一场比赛。例如,如果我要anand在ananand成功匹配中进行匹配,请anan意识到以下a内容不是d,但我刚刚进行了匹配an,因此我应该跳回去尝试匹配子字符串中的第三个字符。这样,“如果在匹配x个字符后失败,那么我可能在第y个字符上”信息存储在第二个表中。
anand
ananand
anan
a
d
an
请注意,当我未能匹配第二张表时,它会根据我刚刚匹配的内容知道匹配的距离。第一张桌子根据我刚刚看到的我不匹配的字符知道我可能要走多远。您想使用这两种信息中较为悲观的信息。
考虑到这一点,算法的工作方式如下:
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