找到所有最长增长子序列的最优化算法是什么?

时间:2014-05-19 16:53:43

标签: algorithm lis

我试图找到数组中所有最长的增加子序列。我可以设法在O(n log n)中找到一个这样的LIS,使用二进制搜索建议on Wikipedia

有人可以帮助我,我怎样才能找到所有这样的LIS。我找不到比O(n²)更好的方法。任何有关优化的建议都会非常有用。

2 个答案:

答案 0 :(得分:6)

考虑这个清单:

2,1, 4,3, 6,5, 8,7, 10,9, ..., 2m,2m-1

此列表的最长序列长度为m = n/2。您可以通过从每个"中选择一个元素来轻松地构建这样的序列。的项目。由于m个这样的对,并且选择是独立的,因此有2^m个最长的序列。

因此,您的算法速度不能快于Ω(2^(n/2)),因为在某些情况下,您的算法至少会输出那么多。

要解决此问题,您需要调整问题,可能是通过执行output-sensitive analysis计算序列数而不是实际生成它们。另一种方法是输出一种紧凑的方式,可以在以后中使用来生成所有序列,这就是线性时间unification算法的作用。

答案 1 :(得分:1)

可能存在指数级的许多此类序列。你当然不能在二次时间内枚举它们。

您可以在O(n log(n))时间内找到在数组中每个位置开始和结束的最长增长子序列的长度。然后,您可以通过简单的递归来枚举所有最长的增长子序列。