Re: Re: generating submultisets with repeated
- To: mathgroup at smc.vnet.net
- Subject: [mg103794] Re: [mg103784] Re: [mg103681] generating submultisets with repeated
- From: David Bevan <david.bevan at pb.com>
- Date: Tue, 6 Oct 2009 08:01:41 -0400 (EDT)
- References: <200910051758.NAA11900@smc.vnet.net>
Here's another approach:
msNew[s_,k_]:=Flatten[Flatten[Outer[Inner[ConstantArray,#1,#2,Flatten[List[##],1]&,1]&,Subsets[s,{Length[#[[1]]]}],#,1],1]&/@Split[Flatten[Permutations/@IntegerPartitions[k],1],Length[#1]==Length[#2]&],1]
coinSetsNew[s_,k_]:=Join @@ Table[msNew[s,i],{i,k}]
coinSetsNew[{1,3,5,7},3]
{{1},{3},{5},{7},{1,1},{3,3},{5,5},{7,7},{1,3},{1,5},{1,7},{3,5},{3,7},{5,7},{1,1,1},{3,3,3},{5,5,5},{7,7,7},{1,1,3},{1,1,5},{1,1,7},{3,3,5},{3,3,7},{5,5,7},{1,3,3},{1,5,5},{1,7,7},{3,5,5},{3,7,7},{5,7,7},{1,3,5},{1,3,7},{1,5,7},{3,5,7}}
Length[coinSetsNew[Range[20],7]]//Timing
{11.297,888029}
It works by creating one multiset from each combination of a partition of k of length i and a subset of s with i elements. However, this approach doesn't create the multisets in lexicographic order.
David %^>
________________________________________
From: David Bevan [david.bevan at pb.com]
Sent: 05 October 2009 18:58
To: mathgroup at smc.vnet.net
Subject: [mg103794] [mg103784] Re: [mg103681] generating submultisets with repeated elements
Dan, Adriano, Kurt,
Thanks for the feedback.
Here are some performance results:
(* Dan *)
Length[multiSetsUpToK[Range[20],7]]//Timing
{18.14,888029}
(* Adriano *)
Length[coinSetsAdriano[Range[20],7]]//Timing
{9.516,888029}
(* Kurt *)
Length[coinSetsKurt[Range[20],7]]//Timing
Subsets::toomany: The number of subsets (189407486533) indicated by Subsets[{1,1,1,1,1,1,1,2,2,2,<<130>>},{1,7}] is too large; it must be a machine in =
teger.
And with my code:
Length[coinSets[Range[20],7]]//Timing
{5.063,888029}
My 'accumulator' approach seems to be quite effective!
However, I'm sure this can be improved significantly with the technique use=
=
d for KSubsets without too much difficulty.
David %^>
--_000_DE9DE45304B6FA4EBE8252CD4EBDA2418286B95F46PBINAMSG02MGD_
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
X-Sun-Content-Length: 2730
<html dir="ltr"><head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-=
1">
<style title="owaParaStyle"><!--P {
MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
}
--></style>
</head>
<body ocsi="x">
<p><font size="2" face="Courier New">Here's another approach:<br>
</font></p>
<p><font size="2" face="Courier New">msNew[s_,k_]:=Flatten[Flatten[Ou=
ter[Inner[ConstantArray,#1,#2,Flatten[List[##],1]&,1]&,Subsets[s,{L=
ength[#[[1]]]}],#,1],1]&/@Split[Flatten[Permutations/@IntegerPartitions=
[k],1],Length[#1]==Length[#2]&],1]</p>
<p><br>
coinSetsNew[s_,k_]:=Join @@ Table[msNew[s,i],{i,k}]<br>
<br>
coinSetsNew[{1,3,5,7},3]<br>
{{1},{3},{5},{7},{1,1},{3,3},{5,5},{7,7},{1,3},{1,5},{1,7},{3,5},{3,7},{5,7=
},{1,1,1},{3,3,3},{5,5,5},{7,7,7},{1,1,3},{1,1,5},{1,1,7},{3,3,5},{3,3,7},{=
5,5,7},{1,3,3},{1,5,5},{1,7,7},{3,5,5},{3,7,7},{5,7,7},{1,3,5},{1,3,7},{1,5=
,7},{3,5,7}}<br>
<br>
Length[coinSetsNew[Range[20],7]]//Timing<br>
</p>
<font face="Courier"><font face="Courier New"><font face="Courier New=
">
<p>{11.297,888029}</p>
</font></font></font>
<p> </p>
<p> </p>
<p>It works by creating one multiset from each combination of a p=
artition of k of length i and a subset of s with i elements.=
However, this approach doesn't create the multisets in lexicographic =
order.</p>
<p> </p>
<p>David %^></p>
<p> </p>
<p> </p>
<p> </p>
<p><br>
<br>
<br>
</font>________________________________________<br>
From: David Bevan [david.bevan at pb.com]<br>
Sent: 05 October 2009 18:58<br>
To: mathgroup at smc.vnet.net<br>
Subject: [mg103794] [mg103784] Re: [mg103681] generating submultisets with repeated el=
ements<br>
<br>
Dan, Adriano, Kurt,<br>
<br>
Thanks for the feedback.<br>
<br>
<br>
<br>
Here are some performance results:<br>
<br>
<br>
<br>
(* Dan *)<br>
<br>
Length[multiSetsUpToK[Range[20],7]]//Timing<br>
<br>
{18.14,888029}<br>
<br>
<br>
<br>
(* Adriano *)<br>
<br>
Length[coinSetsAdriano[Range[20],7]]//Timing<br>
<br>
{9.516,888029}<br>
<br>
<br>
<br>
(* Kurt *)<br>
<br>
Length[coinSetsKurt[Range[20],7]]//Timing<br>
<br>
Subsets::toomany: The number of subsets (189407486533) indicated by Subsets=
=<br>
[{1,1,1,1,1,1,1,2,2,2,<<130>>},{1,7}] is too large; it must be =
a machine in=<br>
teger.<br>
<br>
<br>
<br>
<br>
<br>
And with my code:<br>
<br>
<br>
<br>
Length[coinSets[Range[20],7]]//Timing<br>
<br>
{5.063,888029}<br>
<br>
<br>
<br>
My 'accumulator' approach seems to be quite effective!<br>
<br>
<br>
<br>
However, I'm sure this can be improved significantly with the technique use=
=<br>
d for KSubsets without too much difficulty.<br>
<br>
<br>
<br>
David %^></p>
</body>
</html>
--_000_DE9DE45304B6FA4EBE8252CD4EBDA2418286B95F46PBINAMSG02MGD_--
- References:
- Re: generating submultisets with repeated elements
- From: David Bevan <david.bevan@pb.com>
- Re: generating submultisets with repeated elements