通过对列表进行分区,我指的是列表元素的一组子集,使得任何不同的子集对的交集都是空的,并且所有子集的并集等于原始列表。如何获得Mathematica中列表的所有分区?
例如,如果我的输入列表是{1,π,x}
那么我想返回
{ {{1},{π},{x}}, {{1,π},{x}}, {{1,x},{π}}, {{1},{x,π}}, {{1,π,x}} }
通过对列表进行分区,我指的是列表元素的一组子集,使得任何不同的子集对的交集都是空的,并且所有子集的并集等于原始列表。如何获得Mathematica中列表的所有分区?
例如,如果我的输入列表是{1,π,x}
那么我想返回
{ {{1},{π},{x}}, {{1,π},{x}}, {{1,x},{π}}, {{1},{x,π}}, {{1,π,x}} }
使用适合代码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 *)
@Wizard先生,这将需要我一点时间精神分析,但据我可以告诉它做的工作,谢谢! – Michael
@Michael,我忘了检查标准库中的这个函数。查看我刚才提供的更新。 –
@Simon,感谢您的编辑。 –
@yoda:该OP可能与术语混淆。我同意这些不是分区。 – Blender
@Blender是的,我只是意识到他可能会得到别的东西。 – abcd
@Blender,yoda:这些是[集合意义上的分区](http://en.wikipedia.org/wiki/Partition_of_a_set),不是Mathematica命令[Partition](http:// reference .wolfram.com /数学/ REF/Partition.html)。 – Simon