需要了解算法的答案

时间:2014-09-27 08:04:09

标签: algorithm sorting

我正在尝试使用javascript解决上面最长的单调增加子序列问题。为了做到这一点,我需要知道最长的单调子序列。目前我正在关注wikipedia文章。我不理解这个例子的是,最长的增加子序列是从0, 2, 6, 9, 13, 15列表中的0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15, …给出的。问题是为什么答案在2到6之间没有3,在6到9之间有8等?该答案是如何得出的?

2 个答案:

答案 0 :(得分:1)

最重要的是,考虑名称"最长单调增加子序列" 。因此,从给定的数组中,您需要找出数字应以严格增加的方式出现的最大序列。可以有多个序列,其中子数组可以严格增加,但您需要找到最大子数组。

因此。让我们调试这个数组。 a [] = {0,8,4,12,2,10,6,14,1,9,5,13,​​3,11,7,15}

在这里,一些单调增加的子阵列是:

{0,8,12,14,15}长度= 5

{0,4,12,14,15}长度= 5

{0,1,9,13,15}长度= 5,依此类推。

但如果按这样计算,你可以找到最大的子阵列:

{0,2,6,9,13,15} ,长度= 6,所以这就是答案。

您选择任何数字的每一个小时间,下一个数字应该比前一个数字大,并且必须存在于数组中。说{0,2,6,9,13,15}这个列表,当你选择 9 时,下一个数字应该大于9.立即序列显示 13&gt; 9 < / strong>,所以你可以选择 13 。您也可以选择11.但这将创建子阵列的另一个分支。喜欢 : {0,2,6,9,11,15} 这是另一种解决方案。

希望这个解释能帮助你理解LIS(增长最快的子序列)。谢谢。

答案 1 :(得分:0)

首先,你问题的标题是:增长最快的CONTIGUOUS子序列,这是LIS原始问题的轻微变化,其中结果不需要如上述例子中所指出的那样具有来自原始数组的连续值。请按照此链接获得有关LIS算法的合理解释,该算法具有O(n ^ 2)解决方案,并且可以优化以具有O(nlogn)解决方案: http://www.algorithmist.com/index.php/Longest_Increasing_Subsequence

对于LIS的连续变体,这是一个不错的解决方案: http://worldofbrock.blogspot.com/2009/10/how-to-find-longest-continuous.html