序列[1,2,3]考虑。该序列具有以下6种不同的序列:[1]和[2]和[3]和[1,2]和[2,3]和[1,2,3]
请注意!初始序列的长度最多可达100位。 请帮我。我该如何制作以下序列? 我喜欢研究更多关于这种算法的知识。请告诉我这种算法的名称。
答案 0 :(得分:1)
这是打印所有子序列的c代码。算法使用嵌套循环。
#include<stdio.h>
void seq_print(int A[],int n)
{
int k;
for(int i =0;i<=n-1;i++)
{
for(int j=0;j<=i;j++)
{
k=j;
while(k<=i)
{
printf("%d",A[k]);
k++;
}
printf("\n");
}
}
}
void main()
{
int A[]={1,2,3,4,5,6,7,8,9,0};
int n=10;
seq_print(A,n);
}
答案 1 :(得分:0)
您的问题可以缩小为Combination问题。 stackoverflow中已经存在许多解决方案。您可以查看this,它可能对您有用。
答案 2 :(得分:0)
它被称为a power set(在您的情况下,排除了空集)。
要构建一个电源装置,请从装有空集的装置开始;然后 对于输入集中的每个项目,扩展功率集及其到目前为止累积的所有子集 包含当前项目(在Python中):
def powerset(lst):
S = [[]]
for item in lst:
S += [subset + [item] for subset in S]
return S
示例:
print(powerset([1, 2, 3]))
# -> [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
为避免一次产生所有子集,可以使用递归定义:
n
项的集的幂集包含来自电源集的所有子集
包含n - 1
项目的集合以及包含n
项目的所有这些子集。def ipowerset(lst):
if not lst: # empty list
yield []
else:
item, *rest = lst
for subset in ipowerset(rest):
yield subset
yield [item] + subset
示例:
print(list(ipowerset([1, 2, 3])))
# -> [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
另一种生成幂集的方法是为所有r
生成r
- 长度子序列(组合),从零到输入集的大小(itertools
recipe):< / p>
from itertools import chain, combinations
def powerset_comb(iterable):
s = list(iterable)
return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
示例:
print(list(powerset_comb([1, 2, 3])))
# -> [(), (1,), (2,), (3,), (1,2), (1,3), (2,3), (1,2,3)]