【问题标题】:efficient longest common subsequence algorithm library?高效最长公共子序列算法库?
【发布时间】:2011-04-09 05:04:31
【问题描述】:

我正在寻找一种用于 C++ 程序的 LCS 算法的(空间)高效实现。输入是两个随机访问整数序列。
我目前正在使用关于 LCS 的维基百科页面中的动态编程方法。但是,这在内存和时间上有 O(mn) 的行为,并且在我身上死了,因为更大的输入会出现内存不足的错误。
我已经阅读了 Hirschberg 的算法,它可以显着提高内存使用率,Hunt-Szymanski 以及 Masek 和 Paterson。由于实现这些并非易事,我更愿意使用现有实现在我的数据上尝试它们。有人知道这样的图书馆吗?我想既然文本差异工具很常见,应该有一些开源库吧?

【问题讨论】:

  • 您对实际最长公共子序列感兴趣还是只对它的长度感兴趣?
  • 失望的是,一些快速的网络搜索并没有发现任何特别有用的东西(C 中 char 的大量临时实现,但无论是 Hirschberg 的线性空间加速还是元素类型的模板化都没有对于 C++)。如果您确实找到(或创建 :D)任何东西,请更新!
  • 另外:不是直接在主题上,但 Myers 有几个 O(nd) 算法,其中 d 是需要的编辑次数。非常适合您期望相似的输入! (我认为大多数diffs 仍然使用其中之一。)
  • 迄今为止我发现的最好的是wordaligned.org/articles/longest-common-subsequence 虽然你必须小心:C++ 版本在执行递归调用时会增加迭代器的末尾。需要修复。此外,它没有实现常见的前缀/后缀优化。

标签: c++ algorithm performance dynamic-programming lcs


【解决方案1】:

Hirschberg's Algorithm 嵌入了一个 javascript 实现:几乎是 C。

【讨论】:

    【解决方案2】:

    不是 C++,而是 Python,但我认为可用。

    http://wordaligned.org/articles/longest-common-subsequence

    【讨论】:

      【解决方案3】:

      在搜索此类内容时,请尝试 Academic.google.com。寻找学术著作要好得多。它出现了 http://www.biotec.icb.ufmg.br/cabi/artigos/seminarios2/subsequence_algorithm.pdf 本文档是“最长公共子序列算法的调查”。

      【讨论】:

      • 勉强 +1,因为 OP 真的想要所述算法的库实现,而不是描述。但无论如何可能是一篇有用的论文。
      • 此外,了解出版日期和其他详细信息也会有所帮助。
      猜你喜欢
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 2011-02-25
      • 2013-02-13
      • 1970-01-01
      相关资源
      最近更新 更多