从数组中获取最大排序子数组的算法

时间:2012-11-08 14:06:31

标签: c arrays algorithm sorted

我正在尝试用C做一些事情,我需要一个算法,它返回另一个数组中包含的最大维度排序数组。所以,例如,如果我有以下数组:

A[5] = {5, 2, 3, 1, 4}

它应该返回:

2, 3, 4

我无法想到任何有效的实施。有什么想法吗?谢谢。 :)

2 个答案:

答案 0 :(得分:5)

您的问题称为“longest increasing subsequence”。

使用dynamic programming的算法可以是found here, with a good explanation。它具有O(nlogn)的最优渐近复杂度。

基本思想是,您要跟踪长度为i的子序列的最佳可能最后元素(或者更确切地说是其索引)。处理下一个元素时,检查数组m以查看是否有

  • 找到一个更好(即更小)的最后一个元素,长度为i
  • 否则你发现了比你目前更长的序列。

答案 1 :(得分:0)

来自维基百科页面的最长增长子序列:

 L = 0
 for i = 1, 2, ... n:
    binary search for the largest positive j ≤ L
      such that X[M[j]] < X[i] (or set j = 0 if no such value exists)
    P[i] = M[j]
    if j == L or X[i] < X[M[j+1]]:
       M[j+1] = i
       L = max(L, j+1)

这不是C,但应该直接在C中编写代码。

相关问题