【发布时间】: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