排列中的升序子序列
Ascending subsequences in permutation
给定排列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 6
和X = 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的递增子序列
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么不;名字在地图上是按顺序排列的吗
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 找到具有最多子串栅栏的字符串排列
- 为什么我的递归函数按降序打印,然后按升序打印?
- 重新排列单线以形成闭合多边形?
- 将值插入到标准 c++ 数组的正确索引(升序)中
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- C++ - 将元素按升序插入数组的 SEG 错误
- 输入的 C++ 排列
- 如何用单词排列向量中的每个字符升序?
- 如何检查 2D 数组在 c++ 中是否按升序排列?
- 字符串的升序排列
- 在stl映射中,关键帧是如何按升序排列的
- 按升序排列的矢量元素
- 如何用C++编写一个程序,该程序从输入中接收10个数字并检查这些数字是否按升序排列
- 生成0,1,…中所有可能的组合n-1, n (k)每个组合应按升序排列
- 排列中的升序子序列
- 按升序排列数组