[英]Longest Increasing Subsequence - Not able to understand the actual LIS creation
在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.