确定数组中的哪些项是最长增长子序列的一部分

时间:2014-05-20 14:06:48

标签: algorithm lis

这是longest increasing subsequence problem的变体。假设您想要识别可以成为某些最长增长序列的一部分的项目,而不是想要找到序列或counting how many sequences there are

例如,在列表1,2,4,3,0,5中,除零之外的所有项都可以是增长最长的子序列的一部分。

找到这些物品的策略是什么?它的效率如何?

1 个答案:

答案 0 :(得分:1)

一种方法是使用与最长增加子序列问题相同的动态算法,跟踪i项之前的最佳项目,假设它是最后一项,但调整它跟踪关系。然后,在知道每个项目的最佳前面项目后,确定从最高评分项目开始时可通过该图表访问哪些项目。

对于示例1,2,4,3,0,5,它的工作方式如下:

  • 1在索引0处,所以给它一个lis得分为1而没有先前的索引
  • 2前面可以加1,因此2的得分为1 + 1 = 2,之前的索引为0
  • 4前面有21,但2的得分更高,因此4的得分为2 + 1 = 3和之前的索引1
  • 3也可以在21之后,2再次获得更高的lis分数,因此3得分为2+ 1 = 3,前一个索引为1
  • 0之前不能有任何内容,因此获得的lis得分为1而没有先前的索引
  • 5可以在任何其他项目之前,但34具有最佳的lis分数(= 3),因此5获得的分数为3 + 1 = 4,之前的索引为2或3。

现在我们采用最高评分项目,在这种情况下只需5,然后反复搜索可以在其之前的项目。这将标记53421(但不是0),因为它可能是最长的 - 序列

这肯定会在O(n^2)时间内运行,我认为通过聪明可以在O(n lg n)时间内工作。

从二次时间开始的主要挑战不是制作一个明确的图表,而且可以优先地在'之前。边缘。像1,1,1,1,1,1,...,2,2,2,2,2,2,...这样的列表具有二次数的边,因此您需要避免将它们全部存储或全部探索。