我正在尝试用C做一些事情,我需要一个算法,它返回另一个数组中包含的最大维度排序数组。所以,例如,如果我有以下数组:
A[5] = {5, 2, 3, 1, 4}
它应该返回:
2, 3, 4
我无法想到任何有效的实施。有什么想法吗?谢谢。 :)
答案 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中编写代码。