【问题标题】:How can I obtain all partitions of a list in Mathematica?如何在 Mathematica 中获取列表的所有分区?
【发布时间】:2011-11-29 01:53:43
【问题描述】:

列表的划分是指列表元素的一组子集,使得任何不同的子集对的交集为空,并且所有子集的并集等于原始列表。

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

{ {{1},{π},{x}}, {{1,π},{x}}, {{1,x},{π}}, {{1},{x,π}}, {{1,π,x}} }

【问题讨论】:

  • @yoda:OP 可能与术语混淆。这些不是分区,我同意。
  • @Blender 是的,我刚刚意识到他可能在做别的事情。
  • @Blender, yoda:这些是partitions in the sense of sets,只不过不是 Mathematica 命令Partition 的意义。
  • @Simon 我知道,我没有混淆。这个问题起初对我来说并不清楚,我认为他的意思是{{1},{π},{x}}, {{1,π},{x}} 等中的每一个都是他感兴趣的子集,我的评论是这两者的交集不是空的。二读后,我明白了他的意思,并撤回了我的评论。
  • @yoda:好的。有时可删除的 cmets 可能会令人困惑!

标签: wolfram-mathematica


【解决方案1】:

使用来自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 = BellList@Length@s /. n_Integer :> s[[n]]

或者,不出所料,Combinatorica 包已经有这个功能 (SetPartitions)!

Needs["Combinatorica`"]

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

检查它们是否都返回相同的结果(但顺序不同)

Complement[bell, comb] == {}
Sort@bell == Sort@comb
(* Both of the above return True *)

【讨论】:

  • @Mr.Wizard,我需要花一点时间来进行心理分析,但据我所知,它可以完成这项工作,谢谢!
  • @Michael,我忘了在标准库中检查这个函数。查看我刚刚进行的更新。
  • 刚刚点赞了 3 个帖子。您现在的标签价为 1000!当一天结束时享受你的金徽章:)
  • @yoda 非常感谢! :-D
【解决方案2】:

我将从集合的Powerset 开始(使用Subsets[x]),然后过滤掉集合的Union[x] 不是原始集合的那些。

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

【讨论】:

  • {{1,x},{π}} 的并集不是原始集合;虽然 OP 要求它。
  • @BillyONeal 为什么说并集 {1,x} 和 {π} 不等于 {1,π,x}?集合元素的顺序与集合的定义无关...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
相关资源
最近更新 更多