Java 最长递增子序列-无法理解实际LIS创建
有人能解释一下Peter在文章中给出的最后一个算法吗 我无法获得实际LIS的构造,即父数组将如何构造。 请用彼得举的同样的例子来解释。Java 最长递增子序列-无法理解实际LIS创建,java,c,algorithm,dynamic-programming,Java,C,Algorithm,Dynamic Programming,有人能解释一下Peter在文章中给出的最后一个算法吗 我无法获得实际LIS的构造,即父数组将如何构造。 请用彼得举的同样的例子来解释。 提前感谢。在彼得的例子中,最长的递增子序列实际上是“2 3 4 5 8”,导致长度为5 通过查看算法末尾的数组S无法获得LIS,并且S是不是最长的递增子序列 如果我们需要构建LIS,我们将需要存储更多信息并修改所提出的算法。在本文后面的部分中,Peter提到存储parent[i]并将S[i]更改为存储索引而不是值 让我修改他提出的算法,并定义Si以存储数组S中的
提前感谢。在彼得的例子中,最长的递增子序列实际上是“2 3 4 5 8”,导致长度为5 通过查看算法末尾的数组
S
无法获得LIS,并且S
是不是最长的递增子序列
如果我们需要构建LIS,我们将需要存储更多信息并修改所提出的算法。在本文后面的部分中,Peter提到存储parent[i]
并将S[i]
更改为存储索引而不是值
让我修改他提出的算法,并定义Si
以存储数组S
中的数字索引,以及parent[i]
以array[i]
结尾的LIS中上一个数字的索引。
用他的例子:array[]={2,6,3,4,1,2,9,5,8}
。请注意,当父数组形成最大长度为1的LIS时,会在父数组中使用-1
0. S = {} - Initialize S to the empty set
Si = {}
parent = {}
1. S = {2} - New largest LIS
Si = {0}
parent = {-1}
2. S = {2, 6} - New largest LIS
Si = {**0**, 1}
parent = {-1, **0**}
3. S = {2, 3} - Changed 6 to 3
Si = {**0**, 2}
parent = {-1, 0, **0**}
4. S = {2, 3, 4} - New largest LIS
Si = {0, **2**, 3}
parent = {-1, 0, 0, **2**}
5. S = {1, 3, 4} - Changed 2 to 1
Si = {4, 2, 3}
parent = {-1, 0, 0, 2, -1}
6. S = {1, 2, 4} - Changed 3 to 2
Si = {**4**, 5, 3}
parent = {-1, 0, 0, 2, -1, **4**}
7. S = {1, 2, 4, 9} - New largest LIS
Si = {4, 5, **3**, 6}
parent = {-1, 0, 0, 2, -1, 4, **3**}
8. S = {1, 2, 4, 5} - Changed 9 to 5
Si = {4, 5, **3**, 7}
parent = {-1, 0, 0, 2, -1, 4, 3, **3**}
9. S = {1, 2, 4, 5, 8} - New largest LIS
Si = {4, 5, 3, **7**, 8}
parent = {-1, 0, 0, 2, -1, 4, 3, 3, 7}
最后,我们得到父数组{-1,0,0,2,-1,4,3,3,7}
1) 通过查看S
,我们知道有一个长度为5、在索引8处结束、值为8的LIS。
LIS={?,?,?,?,8}
2) 现在我们看一下索引8的父级,parent[8]
是7,LIS的前一个成员将在索引7中。这是5号。
LIS={?,?,?,5,8}
3) 现在我们看一下索引7的父级(值5),parent[7]
为3,LIS的前一个成员将位于索引3中。这是4号。
LIS={?,?,4,5,8}
4) 现在我们看一下索引3的父级(值4),parent[3]
为2,LIS的前一个成员将位于索引2中。这是3号。
LIS={、3、4、5、8}
5) 现在我们看一下索引2的父级(值3),parent[2]
为0,LIS的前一个成员将位于索引0中。这是2号。
LIS={2,3,4,5,8}
6) 实际的LIS将是
2 3 4 5 8
你是指O(N log N)
版本,对吗?例如:2 6 3 4 1 2 9 5 8
带解决方案1,2,4,5,8
似乎是错误的,因为在4
之前,没有子序列按该顺序包含1,2,4
,没有1,这并不意味着算法是错误的。@ldgabbay…是的,只有一个..我想了解LIS部分的构造..所以你的意思是他使用的算法没有顺序…比如先得到长度,然后构造实际的LIS?我在上面已经详细阐述了:)非常感谢…我现在知道了…:)