用于集合的所有可能集合的列表的算法

时间:2014-11-11 06:57:13

标签: algorithm set

我很难想出一种算法来生成一组所有可能的集合列表。我的意思是,给定一个SI想知道所有可能的集合包含集合S的集合。我可能没有太好地描述它所以我将给出一个有希望得到重点的例子。

如果S = {1, 2, 3}

我正在寻找:

  

{{1,2,3}}

     

{{1,2},{3}}

     

{{1,3},{2}}

     

{{2,3},{1}}

     

{{1},{2},{3}}

虽然乏味但我可以手工生成这些但是我很难想出一个我可以放入代码的算法。

3 个答案:

答案 0 :(得分:1)

你可以递归地进行,我会告诉你如何从{1,2}找到{1,2,3}的答案。

对于具有n个元素的集合,通过解决没有第n个元素的问题,如下所示:

{{1 , 2}}
{{1}, {2}}

然后考虑为n-1个元素创建的每个集合。并将第n个元素添加到此集合的每个元素中,如下所示:

来自{{1 , 2}}我们:

{{1 , 2} , {3}}
{{1 , 2 , 3}}

来自{{1}, {2}}我们:

{{1, 3}, {2}}
{{1} ,{2, 3}}
{{1}, {2}, {3}}

正如您现在所看到的,我们解决了3个元素的问题。

答案 1 :(得分:0)

你可以使用下面的帖子和概念相同的递归算法。我早些时候回答过这个问题。

C++ recursive algorithm for permutation

答案 2 :(得分:0)

我在这里看到两个独立的任务:

  • 鉴于N个元素的有序集 S 产生所有可能的Permutations

  • 给定一个数字N产生N的所有partitions,其中单个分区定义 S 如何分割成子集。这是algorithm

然后您需要为每个分区应用每个分区。这将生成所有可能的结果集 Q ,但其中一些是重复的,例如{{1,2},{3}}和{{2,1} {3}}。下一步是摆脱重复。这有点棘手。解决方案如下。

<强>更新

如果符合以下条件,则允许定义 Q 唯一的结果集。

Q 定义为有序集:{P1,P2,P3,...}其中Pi也是元素{Xi1,Xi2,...}的有序集合。然后 Q 唯一如果:

  • 每个集合Pi的元素按升序排列(即Xi1 <= Xi2 <= Xi3 ...)
  • 集合Pi按其大小的升序排列(即sizeof(P1)&lt; = sizeof(P2)&lt; = sizeof(P3)...)
  • 集合Pi按其最大值的升序排列(即maximum_of(P1)&lt; = maximum_of(P2)&lt; = maximum_of(P3)...),其中最大值的Pi是其中最重要的元素。

Exampe:

{{1,2},{3,4}, {6,5} ,{7,8}} - 不是唯一的

{ {3,4},{1,2} ,{5,6},{7,8}} - 不是唯一的

{{1,3},{2,4},{5,6},{7,8}} - 唯一

{ {1,2},{3} ,{4},{5,6},{7,8}} - 不是唯一的