提取所有可能的有序子集

时间:2014-02-26 16:36:25

标签: c++ algorithm recursion combinations subset

我有一组元素,我想从中提取ordered个子集。 ordered子集的意思是我无法在集合中切换元素。我举了三个例子来说明我是如何解决这个问题的。

  • 如何递归提取这些子集?
  • 你有没有伪代码?
  • {。 } = subset

示例1

S = {f1,f2,f3}成为由 3 元素组成的集合。我想提取所有可能的有序子集,如下所示:

-{f1},{f2},{f3} // {f1} is a subset, {f2} is a subset etc.
-{f1,f2},{f3} // {f1,f2} form a subset and {f3} is also a subset
-{f1},{f2,f3} // {f1} is a subset and {f2,f3} form a subset 

示例2

S = {f1,f2,f3,f4}设置为由 4 元素组成。

可能的有序子集:

-{f1},{f2},{f3},{f4}
-{f1,f2},{f3,f4}
-{f1},{f2,f3},{f4}
-{f1},{f2},{f3,f4}
-{f1,f2,f3}{f4}
-{f1},{f2,f3,f4}
-{f1,f2},{f3},{f4}
-{f1,f2,f3,f4}

示例3

S = {f1,f2,f3,f4,f5}设置为由 5 元素组成。

可能的有序子集:

-{f1},{f2},{f3},{f4},{f5}
-{f1,f2},{f3},{f4},{f5}
-{f1},{f2,f3},{f4},{f5}
-{f1},{f2},{f3,f4},{f5}
-{f1},{f2},{f3},{f4,f5}
-{f1,f2},{f3,f4},{f5}
-{f1},{f2,f3},{f4,f5}
-{f1,f2,f3},{f4,f5}
-{f1,f2,f3},{f4},{f5}
-{f1},{f2,f3,f4},{f5}
-{f1},{f2},{f3,f4,f5}
-{f1,f2},{f3,f4,f5}
-{f1,f2,f3,f4}{f5}
-{f1},{f2,f3,f4,f5}
- etc...

2 个答案:

答案 0 :(得分:2)

如果数组包含该集,请修改该数组,使每个元素之间有一个空格。此空间保留用于分区。采取任何命名约定。 0表示没有分区,而1表示分区。现在遍历数组以递归方式在分区中添加10。可以生成所有可能的组合。

参加示例1

S = {f1,f2,f3}
S'= {f1,0,f2,0,f3}

所以子集将是:

{f1,0,f2,0,f3}, {f1,0,f2,1,f3}, {f1,1,f2,0,f3}, {f1,1,f2,1,f3}

与:

相同
{f1,f2,f3}, {{f1,f2},{f3}}, {{f1},{f2,f3}}, {{f1},{f2},{f3}}

如果您不希望原始集出现在所有子集的集合中,则不要考虑每个分区包含0的状态。

答案 1 :(得分:1)

假设集合S = {a,b,c,d}包含4个元素。所有子集都可以通过在二进制和后续减法中写入2 ^ n - 1来生成。

a b c d

1 1 1 1 => (a b c d)

1 1 1 0 => (a b c)(d)

1 1 0 1 => (a b d)(c)//逻辑是将所有1个人聚集在一起

1 1 0 0 => (a b)现在0 0可以进一步细分为(1 1)=> (c d),(1 0)=> (c)(d)

1 0 1 1 => (a c d)(b)

1 0 1 0 => (a c)现在0 0可以进一步细分为(1 1)=> (b d),(1 0)=> (B)(d)

1 0 0 1 => (a d)与上述步骤相同

1 0 0 0 => (a)现在留下3个零,我们有b c d为3组现在我们可以重新开始1 1 1然后转到1 1 0,依此类推。

通过这种方式,我们可以生成所有子集。