最大长度对按升序排列

时间:2013-08-02 14:05:16

标签: java algorithm

给定n对数字,第一个数字总是小于第二个数字。当且仅当b <= c时,对(c,d)可以跟随一对(a,b)。可以以这种方式形成对链。找到可以从给定的一对组中形成的最长链。

e.g。 { (1,2), (3,4), (5,7), (9,10), (7,9), (8,9), (0,6) }

所以输出应该是:{(1,2), (3,4), (5,7), (8,9), (9,10)}

我的算法如下:

 1. Sort the list according to the 2nd number of elements
i.e.`{ (1,2), (3,4), (0,6), (5,7), (7,9), (8,9), (9,10)  }`
 2. choose the first element from the list  i.e. `(1,2)`
 3. for each element e in the list left
      4. choose this element e if the first number of the element is greater than the 2nd number of the previous element. i.e. after `(1,2)` choose `(3,4)` because `3 > 2.`

在上述算法之后,您将输出为{(1,2), (3,4), (5,7), (8,9), (9,10)}

请告诉我有关算法的正确性。谢谢。

修改

更直观的正确证明:

  

证明:在链中包含更多对的唯一方法是用一个具有较小Y值的对替换一对,以允许下一个   配对有一个较小的X值,可能适合另一对在哪里   它以前不适合。如果将一对替换为具有相同Y的一对   价值,你什么都得不到。如果替换具有更大的Y值,则全部   你已经完成了可能会阻止一些之前适合的对。

     

因为这些对已按Y值排序,所以您永远不会找到具有较小Y的替换。在排序中查找“向前”   对,它们都具有相同或更大的Y值。看着   “落后”,最初从链中消失的任何东西都是   因为X值不够高,情况仍然如此。

这取自here

3 个答案:

答案 0 :(得分:2)

这是对的。这是一个证据:

s1, s2, ..., sl成为算法找到的对,i1, i2, ..., ik是最佳解决方案。

我们有:

l == k => your algorithm is obviously correct, since it's clear that
          it doesn't produce invalid solutions;

l > k => this would contradict our hypothesis that i1, ..., ik is optimal,
         so it makes no sense to bother with this;

l < k => this would mean that your algorithm is wrong. 
         Let's assume this is the case.

假设i1 != s1。在这种情况下,我们可以在最佳解决方案中将i1替换为s1,因为s1是具有最低完成时间的对。所以s1, i2, ..., ik仍然是最佳解决方案。

t <= l成为st != it的第一个索引。因此,s1, s2, ..., s[t-1], it, ...是最佳解决方案。我们可以将it替换为st,因为:

  • st不是最佳解决方案的第一个t-1元素的一部分;
  • st不属于i[t+1], ..., ik。如果是,则意味着stit完成后开始,这与算法选择st的方式相矛盾。

因此,继续以这种方式,我们的最佳解决方案是s1, s2, ..., sl, ..., ik。这意味着可以在sl之后添加更多对,但这与算法的工作方式相矛盾,因此我们有l = k,算法正确。

答案 1 :(得分:2)

  1. (c, d)可以关注一对(a, b) iff b <= c
  2. (c, d)有约束d > c
  3. 我们可以说,

    b <= c
    

    变为

    b < d because d > c
    

    因此,最长的序列将从最小的第二个元素开始。因此,您根据第二个元素选择第一个元素对它们进行排序,并根据您的原始条件b <= c

    进行比较

    算法是正确的。当你得到第一个元素(贪婪)然后你保持原始约束完整b <= c

    注意: 排序后您无法使用b < d条件来比较元素,因为您无法从b <= c推断出b < d(原始条件),但可以采用其他方式。

答案 2 :(得分:-1)

这个问题可以通过很多方法解决 已经有相同类型的问题检查它 给你n对数字。在每对中,第一个数字总是小于第二个数字。如果b

你可以去这里有很多有用的资源

MaximumLengthChainoofPairs

LongestIncreasingSequence