2011-11-29 44 views
8

Theo phân vùng của danh sách, tôi có nghĩa là tập con của các phần tử danh sách sao cho giao điểm của bất kỳ cặp con riêng biệt nào trống và liên kết của tất cả các tập hợp con bằng danh sách gốc.Làm cách nào để có được tất cả các phân vùng của danh sách trong Mathematica?

Ví dụ, nếu danh sách đầu vào của tôi là {1,π,x} sau đó tôi muốn một hàm trả về

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

@yoda: Các OP có thể bị nhầm lẫn với các thuật ngữ. Đây không phải là phân vùng, tôi đồng ý. – Blender

+0

@Blender Vâng, tôi mới nhận ra rằng anh ấy có thể đang nhận được thứ gì đó khác. – abcd

+1

@Blender, yoda: Đây là [phân vùng theo nghĩa của bộ] (http://en.wikipedia.org/wiki/Partition_of_a_set), không theo ý nghĩa của lệnh Mathematica [Phân vùng] (http: // tham chiếu .wolfram.com/mathematica/ref/Partition.html). – Simon

Trả lời

12

Sử dụng thích nghi mã từ 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]] 

Hoặc gì ngạc nhiên, gói Combinatorica có chức năng này (SetPartitions) rồi!

Needs["Combinatorica`"] 

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

kiểm tra rằng cả hai đều trả lại kết quả tương tự (nhưng thứ tự khác nhau)

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

@ Mr.Wizard, điều đó sẽ đưa tôi một chút thời gian để phân tích tinh thần, nhưng theo như tôi có thể nói nó thực hiện công việc, cảm ơn! – Michael

+0

@Michael, tôi quên kiểm tra chức năng này trong thư viện chuẩn. Xem bản cập nhật tôi vừa tạo. –

+0

@Simon, cảm ơn bạn đã chỉnh sửa. –

2

tôi sẽ bắt đầu với một Powerset của tập (sử dụng Subsets[x]) và sau đó lọc ra những nơi Union[x] của tập hợp không phải là tập hợp ban đầu.

Một chút chậm, nhưng tôi thấy nó trực quan.

+0

Liên minh '{{1, x}, {π}}' không phải là tập hợp ban đầu; mặc dù OP đã yêu cầu. –

+3

@BillyONeal tại sao bạn nói rằng công đoàn {1, x} và {π} không bằng {1, π, x}? Thứ tự của các yếu tố của một tập hợp không quan trọng đối với định nghĩa của tập hợp ... – Michael

+0

@Blender: Tôi đã sửa chữa. :) –

Các vấn đề liên quan