【问题标题】:What are the main differences between the Knuth-Morris-Pratt and Boyer-Moore search algorithms?Knuth-Morris-Pratt 和 Boyer-Moore 搜索算法之间的主要区别是什么?
【发布时间】:2012-09-21 07:00:24
【问题描述】:

Knuth-Morris-Pratt 搜索算法和 Boyer-Moore 搜索算法的主要区别是什么?

我知道 KMP 在 X 中搜索 Y,试图在 Y 中定义一个模式,并将该模式​​保存在一个向量中。我也知道 BM 更适用于小词,例如 DNA (ACTG)。

它们在工作方式上的主要区别是什么?哪个更快?哪一个对计算机不那么贪婪?在哪些情况下?

【问题讨论】:

  • BM 在“自然文本”而不​​是小集合上效果更好

标签: algorithm theory string-search


【解决方案1】:

Boyer-Moore 技术从右到左匹配字符,适用于长模式。 knuth moris pratt 从左到右匹配字符,在短模式上快速工作。

【讨论】:

    【解决方案2】:

    Moore's UTexas webpage 逐步介绍了这两种算法(他还提供了各种技术资料):

    根据男人本人的说法,

    经典的 Boyer-Moore 算法存在以下现象: 往往在 DNA 这样的小字母上工作效率不高。跳过 距离趋于随着模式长度停止增长,因为 子串经常重复出现。通过记住更多的东西 已经匹配,可以通过文本获得更大的跳过。一 甚至可以安排“完美的记忆”,从而查看每个字符 大多数一次,而 Boyer-Moore 算法虽然是线性的,但可能 多次检查文本中的字符。这种想法 其他人在文献中探索了更多的记忆。它 需要非常大的表或状态机。

    但是,有一些 modifications of BM 使小字母搜索变得可行。

    【讨论】:

      【解决方案3】:

      粗略的解释

      Boyer-Moore 的 方法是尝试匹配模式的最后一个字符而不是第一个字符,假设如果末尾不匹配,则无需尝试在开头匹配.这允许“大跳跃”,因此当您搜索的模式和文本类似于“自然文本”(即英语)时,BM 效果更好

      Knuth-Morris-Pratt 通过使用以下观察来搜索“单词”W 在主要“文本字符串”S 中的出现,即当发生不匹配时,单词本身包含足够的信息来确定下一场比赛可以从哪里开始,从而绕过重新检查以前匹配的字符。 (来源:Wiki

      这意味着 KMP 更适合 DNA (ACTG) 等小型集

      【讨论】:

      • 我不明白为什么首先匹配最后一个字符会有所改进。如果失败了,你还得往前走一个字符,不是吗?
      • @ThomasAhle 下面是一个例子: 单词:吉他 文本:我喜欢吉他。然后,您将尝试匹配吉他的“r”(第 6 个字符)与文本的第 6 个字符......“爱”的“e”......因为它们不匹配......不需要检查“我爱”,因为他们永远不会匹配..所以你跳过所有部分......
      • 对,然后你跳到检查'r'与'',但这仍然只让你前进了1步。如果您检查了“g”与“l”,您将得到相同的结果。没有?
      • @ThomasAhle 可能会有所帮助:utdallas.edu/~besp/demo/John2010/boyer-moore.htm 并尝试我的示例案例:文本:“我爱吉他”模式:“吉他”
      • 很好的例子来展示 BM 背后的想法。不幸的是,实现是错误的。尝试“这是一个简单的示例”和“示例”作为输入。这将导致不匹配,即使搜索字符串出现在搜索文本中。
      猜你喜欢
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      相关资源
      最近更新 更多