我已经在StackOverflow上研究了各种解决方案,以试图了解Boyer-Moore算法的功能,但是我正在寻找更多这样的逐步说明算法的实际功能(视觉学习很多对我来说更好)。
我正在尝试理解该图像,但是我不完全理解为什么在比较6中它会跳过:
我希望它能更好地绘制出来,但是如果您可以通过伪代码告诉我为什么会这样,我将不胜感激。
谢谢。
答案 0 :(得分:1)
Boyer Moore 算法中最重要的是最后出现表,这是对模式的预处理。它存储模式中每个不同字符出现的最后一个索引。
这些步骤可以分解如下所示,其中我稍微修改了您的可视化。
换档步骤说明如下
文本字符 a 与模式字符 b 不匹配。 字符 a 出现在索引为 4 的最后一个出现表中。 移位模式使索引 4 与不匹配的文本字符 a 对齐。
文本字符 a 与模式字符 c 不匹配。 字符 a 出现在索引为 4 的最后一个出现表中。 移动模式使索引 4 与不匹配的文本字符 a 对齐会向后移动模式。这是没有意义的,所以我们所能做的就是将模式移动 1。
文本字符 a 与模式字符 b 不匹配。 字符 a 出现在索引为 4 的最后一个出现表中。 移位模式使索引 4 与不匹配的文本字符 a 对齐。
文本字符 d 与模式字符 b 不匹配。 字符 d 未出现在最后出现的表中。 因此,我们可以将整个模式移过这种不匹配。
文本字符 a 与模式字符 b 不匹配。 字符 a 出现在索引为 4 的最后一个出现表中。 移位模式使索引 4 与不匹配的文本字符 a 对齐。
所有字符都匹配,即我们有一个完全匹配。将模式天真地移动 1。
与比较 7 的情况相同。将模式的索引 4 与不匹配的文本字符 a 对齐。
与上述相同的场景。
与比较 2、3 和 4 完全相同的场景。将模式移动 1。
文本字符 b 与模式字符 a 不匹配。我们到了 正文结束,我们就完成了。