查找子序列序列的算法

时间:2013-03-23 06:35:02

标签: algorithm sequence

序列[1,2,3]考虑。该序列具有以下6种不同的序列:[1]和[2]和[3]和[1,2]和[2,3]和[1,2,3]

请注意!初始序列的长度最多可达100位。 请帮我。我该如何制作以下序列? 我喜欢研究更多关于这种算法的知识。请告诉我这种算法的名称。

3 个答案:

答案 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)]

另见what's a good way to combinate through a set?