排列中的升序子序列

Ascending subsequences in permutation

本文关键字:升序 排列      更新时间:2023-10-16

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

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

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

您需要实际的升序序列吗?或者仅仅是升序子序列的个数?

在少于列出它们所需的时间内生成它们是不可能的。如前所述,它是O(NX / (X-1)!)。(可能存在X的意外因素,因为列出大小为X的数据结构需要O(X)时间。)显然,对它们的递归搜索与此相差不远。

然而,如果你使用动态规划,计数它们可以及时完成O(X * N2)。这里是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)

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

你不可能在线性时间内找到所有升序子序列,因为可能有更多的子序列。

例如,在一个已排序的原始序列中,所有子集都是递增子序列,因此一个长度为N(1,2,…,N)的已排序序列有N选k = n!/(n-k)!k!个长度为k的递增子序列