Re: Help on Partitions, Again!!!
- To: mathgroup at smc.vnet.net
- Subject: [mg24661] Re: Help on Partitions, Again!!!
- From: d8442803 at student.nsysu.edu.tw (Wen-Feng Hsiao)
- Date: Mon, 31 Jul 2000 09:23:28 -0400 (EDT)
- Organization: NSYSU
- References: <8lt1mt$2m2@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
> In[ ] = f [ {A,B,C,D,E,F},{3,3}]
> Out [ ] = { { {A,B,C},{D,E,F} }, { {
> A,B,F},{C,D,E}},...................} and so on.
> In [ ] = Length[%]
> Out [ ] = 10
Dear DeMelo,
You can still make use of KSubsets to obtain what you want.
A basic idea is: Suppose we want to partition a list into combinations
with element numbers n1 and n2. Then we can use KSubsets to find the
"combinations" of n1-element and n2-element, separately; followed by
concating them, and checking if they fulfill the requirements: no
duplication. Specifically,
set1 = KSubsets[lst, n1];
set2 = KSubsets[lst, n2];
result = Select[Outer[List, n1, n2, 1],
Union[Sequence@@#]==Length[lst]&];
result = Union[Sort /@ result]; (* remove duplicated lists *)
The final function could be:
<< DiscreteMath`Combinatorica`
comb[lst_List, parts_List] :=
Module[{len = Length[lst], partlen = Length[parts], sets, matches},
If[Plus @@ parts != len, Print["Partitions are not correct."];
Return[]];
sets = KSubsets[lst, #] & /@ parts;
matches =
Select[Flatten[Outer[List, Sequence @@ sets, 1], partlen - 1],
Length[Union[Sequence @@ #]] == len &];
matches = Union[Sort[#] & /@ matches];
Return[matches];]
In[7]:=
comb[{a, b, c, d}, {2, 1, 1}]
Out[7]=
{{{a}, {b}, {c, d}}, {{a}, {c}, {b, d}}, {{a}, {d}, {b, c}},
{{b}, {c}, {a, d}}, {{b}, {d}, {a, c}}, {{c}, {d}, {a, b}}}
In[8]:=
comb[{a, b, c, d, e, f}, {3, 3}]
Out[8]=
{{{a, b, c}, {d, e, f}}, {{a, b, d}, {c, e, f}}, {{a, b, e}, {c, d, f}},
{{a, b, f}, {c, d, e}}, {{a, c, d}, {b, e, f}}, {{a, c, e}, {b, d, f}},
{{a, c, f}, {b, d, e}}, {{a, d, e}, {b, c, f}}, {{a, d, f}, {b, c, e}},
{{a, e, f}, {b, c, d}}}
Regards,
Wen-Feng