2011-11-29 63 views
8

通过对列表进行分区,我指的是列表元素的一组子集,使得任何不同的子集对的交集都是空的,并且所有子集的并集等于原始列表。如何获得Mathematica中列表的所有分区?

例如,如果我的输入列表是{1,π,x}那么我想返回

{ {{1},{π},{x}}, {{1,π},{x}}, {{1,x},{π}}, {{1},{x,π}}, {{1,π,x}} } 
+0

@yoda:该OP可能与术语混淆。我同意这些不是分区。 – Blender

+0

@Blender是的,我只是意识到他可能会得到别的东西。 – abcd

+1

@Blender,yoda:这些是[集合意义上的分区](http://en.wikipedia.org/wiki/Partition_of_a_set),不是Mathematica命令[Partition](http:// reference .wolfram.com /数学/ REF/Partition.html)。 – Simon

回答

12

使用适合代码http://mathforum.org/advanced/robertd/bell.html

BellList[1] = {{{1}}}; 
BellList[n_Integer?Positive] := Join @@ 
    (ReplaceList[#, 
    {{b___, {S__}, a___} :> {b, {S, n}, a}, 
    {S__} :> {S, {n}}} 
    ] & /@ BellList[n - 1]) 

s = {a, b, c, d, e}; 

bell = [email protected]@s /. n_Integer :> s[[n]] 

或者,勿庸置疑,在Combinatorica包有此功能(SetPartitions)了!

Needs["Combinatorica`"] 

comb = SetPartitions[{a, b, c, d, e}] 

检查,他们都返回相同的结果(但在不同的顺序)

Complement[bell, comb] == {} 
[email protected] == [email protected] 
(* Both of the above return True *) 
+0

@Wizard先生,这将需要我一点时间精神分析,但据我可以告诉它做的工作,谢谢! – Michael

+0

@Michael,我忘了检查标准库中的这个函数。查看我刚才提供的更新。 –

+0

@Simon,感谢您的编辑。 –

2

我将开始与设定的Powerset功能(使用Subsets[x]),然后滤除那些地方Union[x]的集合不是原始集合。

有点慢,但我觉得它很直观。

+0

{{1,x},{π}}'的联合不是原始集合;尽管OP要求它。 –

+3

@BillyONeal为什么你说联合{1,x}和{π}不等于{1,π,x}?一组元素的顺序与集合的定义无关... – Michael

+0

@Blender:我站得更正了。 :) –

相关问题