【问题标题】:What is the best algorithm to find the longest double monotonically increasing sub-sequence of a sequence of n numbers?找到n个数字序列的最长双单调递增子序列的最佳算法是什么?
【发布时间】:2014-10-14 05:25:41
【问题描述】:

我看过一些关于最长单调递增子序列算法的讨论。但我的情况有点不同。

双递增子序列定义如下: 子序列的第一部分和第二部分都是单调递增的子序列。

例如:

序列 10,19,8,12 是;

序列10,19,28,33是;

序列10,19,28,28是;

序列 10,19,8,2 不是; 序列 10,19,8,8 不是

另一个满足条件的序列是:

1,3,5,7,9,10, 6,9,11,17,28,30;

所以第一部分 1,3,5,7,9,10 是严格单调递增的;第二部分 6,9,11,17,28,30 也是如此。 原始序列可能类似于:

1,99,3,98,5,97,7,96, 9,95,10,6,89,9,88,11,87, 17,86,28,85,30

我们能找到一个 little-o(n^2)-time 算法吗?

【问题讨论】:

  • 如何 10,19,28,28 “是”,而 10,19,8,8 “不是”?
  • (@user1990169: 10,19,8,8 “不是”(双倍)严格增加。)(哎呀 - 因为子序列不一定连续而下降。再次。)
  • (“原始序列”示例中的第一个“bold 子序列”不是最大的(可以包括 94 - 7 到 9 可以很好地分隔两个递增的子序列)) - > 除了严格递增之外,对组成子序列的原始序列的元素是否有限制(可能两者都没有元素)? 2、1、4、3、6、5、8、7呢? 1,2,3,3,3,3,3,3,4,5?
  • @greybeard 抱歉我又修改了。而且我相信 user2040251 提供了一个有价值的解决方案。谢谢!

标签: algorithm math data-structures computer-science


【解决方案1】:

是的,甚至可以得到 O(n log n) 的解。假设我们已经计算了每个 i 从 i 到左侧(包括)某处结束的最长递增子序列的长度,以及从 i 到右侧(不包括 i)的反向数组中最长递减子序列的长度.那么答案是所有 i 的这两个值的最大和。它可以在 O(n log n) 时间内完成,因为您所要做的就是运行标准算法来计算两次最长的递增/递减子序列,然后进行几次线性传递。

【讨论】:

  • 好主意!但我还是有些困惑。我同意增加/减少两个计算需要 O(nlogn),那么你仍然不知道正确的点 i 在哪里。因此,您需要将 i 从 1 循环到 n 以找到最好的。因此 T~O(n^2 logn)。我说的对吗?
  • @ValarMorghulis 您首先在O(n log n) 中进行这两个计算,然后从 1 循环到 n(它们没有嵌套)。所以它是O(n log n) + O(n) = O(n log n),而不是O(n log n) * O(n)
  • 非常感谢!我想通了!
猜你喜欢
  • 2013-11-27
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
相关资源
最近更新 更多