【问题标题】:find the longest increasing subsequence (LIS)找到最长的递增子序列 (LIS)
【发布时间】:2011-10-27 15:22:47
【问题描述】:

给定 A= {1,4,2,9,7,5,8,2},求 LIS。显示填充的动态规划表以及如何找到解决方案。

我的书没有涵盖 LIS,所以我对如何开始有点迷茫。对于 DP 表,我对最长公共子序列做了类似的事情。任何有关如何开始的帮助将不胜感激。

【问题讨论】:

  • 有一篇非常好的维基百科文章。您可能会在那里找到入门所需的内容。

标签: dynamic-programming


【解决方案1】:

LIS 和 LCS 之间的关系非常密切。

http://en.wikipedia.org/wiki/Longest_increasing_subsequence

我认为这篇文章解释得很好。基本上,这个想法是,您可以将一个问题简化为另一个问题(在许多涉及动态编程的情况下都是这种情况)。

【讨论】:

    【解决方案2】:

    已经有很多关于这个主题的答案,但这是我的演练,我将这个网站视为未来子孙后代的答案库,这只是为了在我自己解决这个问题时提供额外的见解。

    最长递增子序列 (LIS) 问题是求给定序列的最长子序列的长度,使得该序列的所有元素 子序列按升序排列。例如,

    的 LIS 长度
    { 10, 22, 9, 33, 21, 50, 41, 60, 80 } is 6 and LIS is {10, 22, 33, 50, 60, 80}.
    

    S[pos] 定义为结束长度为 pos 的递增序列的最小整数。

    现在遍历输入集的每个整数 X 并执行以下操作:

    如果 X > S 中的最后一个元素,则将 X 附加到 S 的末尾。这本质上意味着我们找到了一个新的最大 LIS。

    否则找到S中最小的元素,即>=比X,改成X。因为S是随时排序的,所以可以找到该元素 在 log(N) 中使用二进制搜索。

    总运行时间 - N 个整数和每个整数的二进制搜索 - N * log(N) = O(N log N)

    现在让我们做一个真实的例子:

    整数集:2 6 3 4 1 2 9 5 8

    步骤:

    0. S = {} - Initialize S to the empty set
    1. S = {2} - New largest LIS
    2. S = {2, 6} - 6 > 2 so append that to S
    3. S = {2, 3} - 6 is the smallest element > 3 so replace 6 with 3
    4. S = {2, 3, 4} - 4 > 3 so append that to s
    5. S = {1, 3, 4} - 2 is the smallest element > 1 so replace 2 with 1
    6. S = {1, 2, 4} - 3 is the smallest element > 2 so replace 3 with 2
    7. S = {1, 2, 4, 9} - 9 > 4 so append that to S
    8. S = {1, 2, 4, 5} - 9 is the smallest element > 5 replace 9 with 5
    9. S = {1, 2, 4, 5, 8} - 8 > 5 so append that to S
    So the length of the LIS is 5 (the size of S).
    

    让我们看一些其他序列,看看这将涵盖所有可能的警告,每个都有自己的问题

    假设我们有1,2,3,4,9,2,3,4,5,6,7,8,10

    基本上它首先构建12349,然后2 将替换33 将替换44 将替换9,然后附加5,6,7,8,10 所以看起来像1,2,2,3,4,6,7,8,10

    以我们有1,2,3,4,5,9,2,10的另一种情况为例 这会给我们1,2,2,4,5,9,10

    或以我们有1,2,3,4,5,9,6,7,8,10的情况为例 这会给我们1,2,3,4,5,7,8,10

    这样就可以说明发生了什么,在第一种情况下,关键时刻是当您在9 之后点击2 时会发生什么, 你如何处理这些。好吧,2,3,4 的块实际上不会做任何事情,当您点击5 时,您会替换9,因为59 几乎不可区分 9 结束第一个 5 增加元素的块,您将 9 替换为 5 因为 5 更小所以那里 以后有更大的潜力击中 >5。但你只替换最小的元素 > 本身。例如。在最后一种情况下, 如果您的6 不替换9,而是替换17 替换28 替换3,那么我们得到一个由7 个元素组成的最终数组 9. 所以只要做一些这些并找出模式,这个逻辑并不是最容易翻译成纸的。

    【讨论】:

      猜你喜欢
      • 2014-05-23
      • 2019-06-19
      • 2012-02-01
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      相关资源
      最近更新 更多