繁体   English   中英

最长的递增子序列-无法了解LIS的实际创建

[英]Longest Increasing Subsequence - Not able to understand the actual LIS creation

谁能解释一下彼得在文章中给出的最后算法: 如何使用动态编程确定最长的递增子序列? 我无法获得实际的LIS的构造,即如何构造父阵列。 请用彼得所举的相同例子来解释。 提前致谢。

在Peter的示例中,最长的递增子序列实际上是“ 2 3 4 5 8”,长度为5。

在算法末尾无法通过查看数组S来获得LIS,并且S 并不是最长的增长子序列。

如果需要构建LIS,则需要存储更多信息并修改所提供的算法。 Peter在本文的后面部分提到了存储parent[i]和更改S[i]以存储索引而不是值。

让我修改他提出的算法,并定义Si来将数字的索引存储在数组S并定义parent[i]来将前一个数字的索引存储在LIS中(以array[i]结束array[i] 以他的示例为例: 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的LIS,它的结尾是索引8,值为LIS = { ?, ?, ?, ?, 8 }

2)现在,我们看一下索引8的父级, parent[8]是7,LIS的前一个成员将在索引7中。这是数字LIS = { ?, ?, ?, 5, 8 }

3)现在我们看一下索引7的父级(值5), parent[7]是3,LIS的前一个成员将在索引3中。这是数字LIS = { ?, ?, 4, 5, 8 }

4)现在我们看一下索引3的父级(值4), parent[3]是2,LIS的前一个成员将在索引2中。这是数字LIS = { ?, 3, 4, 5, 8 }

5)现在我们看一下索引2的父级(值3), parent[2]为0,LIS的前一个成员将在索引0中。这是数字LIS = { 2, 3, 4, 5, 8 }

6)实际LIS为2 3 4 5 8

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM