我有一组元素,我想从中提取ordered
个子集。 ordered
子集的意思是我无法在集合中切换元素。我举了三个例子来说明我是如何解决这个问题的。
让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
让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}
让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...
答案 0 :(得分:2)
如果数组包含该集,请修改该数组,使每个元素之间有一个空格。此空间保留用于分区。采取任何命名约定。 0
表示没有分区,而1
表示分区。现在遍历数组以递归方式在分区中添加1
或0
。可以生成所有可能的组合。
参加示例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,依此类推。
通过这种方式,我们可以生成所有子集。