【问题标题】:Knuth-Morris-Pratt algorithm for bidirectional iterators双向迭代器的 Knuth-Morris-Pratt 算法
【发布时间】:2017-04-30 14:54:35
【问题描述】:

是否有任何用于双向迭代器的 Knuth-Morris-Pratt 算法实现?在 Boost.Algorithm 中有随机访问迭代器的版本。

【问题讨论】:

  • 我不确定是否可以有效地做到这一点。当我们没有转换时,我们需要在输入字符串上进行长时间的“跳转”。
  • 它实际上是可行的(甚至还有一个纯函数式的线性时间实现),但它需要更多的内存。
  • 我知道。但我没有找到任何关于它的文档。
  • 好吧,你可以自己做。您只需要为模式中的所有i 存储下一个字符以及p[i] 的值。
  • 哦,怎么办?

标签: c++ algorithm boost


【解决方案1】:

让我们看一下标准实现。我们真正需要随机访问的唯一地方是比较pattern[i] 和跳转后的当前字符i = p[i]。我们可以在构建转换表时将下一个字符 cp[i] 一起存储在模式中,而不是直接访问 pattern[i](对于双向迭代器而言,这将需要线性时间)。

但是,它并没有那么有用。为每个i 存储一个符号本质上与将模式复制到支持随机访问的结构中是一样的,因此直接这样做会更容易。

【讨论】:

  • 非常感谢。你知道双向迭代器的有效搜索算法吗?
猜你喜欢
  • 2014-02-21
  • 2014-05-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
相关资源
最近更新 更多