c++ - 排列中的升序子序列

标签 c++ algorithm

给定排列 1...n 例如 5 3 4 1 2 如何在线性时间内找到所有长度为 3 的升序子序列?

是否有可能找到其他长度为 X 的升序子序列? X

我不知道如何在线性时间内解决它。

最佳答案

您需要实际的升序吗?或者只是上升子序列的数量?

要在列出它们的时间内生成它们是不可能的。正如已经指出的那样,它是 O(N<sup>X</sup> / (X-1)!) . (可能有一个意外因素 X,因为它需要时间 O(X) 来列出大小为 X 的数据结构。)对它们的明显递归搜索与此相差不远。

但是可以及时计算它们 O(X * N<sup>2</sup>)如果你使用动态规划。这是 Python。

counts = []
answer = 0
for i in range(len(perm)):
    inner_counts = [0 for k in range(X)]
    inner_counts[0] = 1
    for j in range(i):
        if perm[j] < perm[i]:
            for k in range(1, X):
                inner_counts[k] += counts[j][k-1]
    counts.add(inner_counts)
    answer += inner_counts[-1]

例如3 5 1 2 4 6X = 3你会得到:

counts = [
    [1, 0, 0],
    [1, 1, 0],
    [1, 0, 0],
    [1, 1, 0],
    [1, 3, 1],
    [1, 5, 5]
]
answer = 6

(以上只找到5个,少了一个2 4 6。)

扩展这个答案来创建一个数据结构并不难,它可以很容易地直接列出它们,找到一个随机的等等。

关于c++ - 排列中的升序子序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5847817/

相关文章:

algorithm - 投影变换拟合

java - 如何将测试函数应用于遗传算法

algorithm - 重新排序列表的元素,以便连续的元素彼此成功?

algorithm - 在没有PWM的AVR组件中生成方波

c++ - 在 C++ Builder XE2 中重命名 VCL Form 类

C++:operator<< 嵌套类中的重载

c++ - 如何更改 C++ 中的文件内容?

c++ - 倒置几何图形 gBuffer 位置用于透视。正字还好吗?

c++ - 如何在单链表中正确使用protected

algorithm - 将一个字符串转换为最短路径中的另一个字符串