直观地了解博耶尔摩尔

时间:2018-12-05 01:15:06

标签: algorithm boyer-moore

我已经在StackOverflow上研究了各种解决方案,以试图了解Boyer-Moore算法的功能,但是我正在寻找更多这样的逐步说明算法的实际功能(视觉学习很多对我来说更好)。

我正在尝试理解该图像,但是我不完全理解为什么在比较6中它会跳过:

boyer-moore

我希望它能更好地绘制出来,但是如果您可以通过伪代码告诉我为什么会这样,我将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:1)

Boyer Moore 算法中最重要的是最后出现表,这是对模式的预处理。它存储模式中每个不同字符出现的最后一个索引。

这些步骤可以分解如下所示,其中我稍微修改了您的可视化。

boyer-moore-diagramming

换档步骤说明如下

  1. 文本字符 a 与模式字符 b 不匹配。 字符 a 出现在索引为 4 的最后一个出现表中。 移位模式使索引 4 与不匹配的文本字符 a 对齐。

  2. 文本字符 a 与模式字符 c 不匹配。 字符 a 出现在索引为 4 的最后一个出现表中。 移动模式使索引 4 与不匹配的文本字符 a 对齐会向后移动模式。这是没有意义的,所以我们所能做的就是将模式移动 1。

  3. 文本字符 a 与模式字符 b 不匹配。 字符 a 出现在索引为 4 的最后一个出现表中。 移位模式使索引 4 与不匹配的文本字符 a 对齐。

  4. 文本字符 d 与模式字符 b 不匹配。 字符 d 未出现在最后出现的表中。 因此,我们可以将整个模式移过这种不匹配。

  5. 文本字符 a 与模式字符 b 不匹配。 字符 a 出现在索引为 4 的最后一个出现表中。 移位模式使索引 4 与不匹配的文本字符 a 对齐。

  6. 所有字符都匹配,即我们有一个完全匹配。将模式天真地移动 1。

  7. 与比较 7 的情况相同。将模式的索引 4 与不匹配的文本字符 a 对齐。

  8. 与上述相同的场景。

  9. 与比较 2、3 和 4 完全相同的场景。将模式移动 1。

  10. 文本字符 b 与模式字符 a 不匹配。我们到了 正文结束,我们就完成了。