这是longest increasing subsequence problem的变体。假设您想要识别可以成为某些最长增长序列的一部分的项目,而不是想要找到序列或counting how many sequences there are。
例如,在列表1,2,4,3,0,5
中,除零之外的所有项都可以是增长最长的子序列的一部分。
找到这些物品的策略是什么?它的效率如何?
答案 0 :(得分:1)
一种方法是使用与最长增加子序列问题相同的动态算法,跟踪i
项之前的最佳项目,假设它是最后一项,但调整它跟踪关系。然后,在知道每个项目的最佳前面项目后,确定从最高评分项目开始时可通过该图表访问哪些项目。
对于示例1,2,4,3,0,5
,它的工作方式如下:
1
在索引0处,所以给它一个lis得分为1而没有先前的索引2
前面可以加1
,因此2
的得分为1 + 1 = 2,之前的索引为0 4
前面有2
和1
,但2
的得分更高,因此4
的得分为2 + 1 = 3和之前的索引1 3
也可以在2
和1
之后,2
再次获得更高的lis分数,因此3
得分为2+ 1 = 3,前一个索引为1 0
之前不能有任何内容,因此获得的lis得分为1而没有先前的索引5
可以在任何其他项目之前,但3
和4
具有最佳的lis分数(= 3),因此5
获得的分数为3 + 1 = 4,之前的索引为2或3。现在我们采用最高评分项目,在这种情况下只需5
,然后反复搜索可以在其之前的项目。这将标记5
,3
,4
,2
和1
(但不是0
),因为它可能是最长的 - 序列
这肯定会在O(n^2)
时间内运行,我认为通过聪明可以在O(n lg n)
时间内工作。
从二次时间开始的主要挑战不是制作一个明确的图表,而且可以优先地在'之前。边缘。像1,1,1,1,1,1,...,2,2,2,2,2,2,...
这样的列表具有二次数的边,因此您需要避免将它们全部存储或全部探索。