Re: List complement operator
- To: mathgroup at smc.vnet.net
- Subject: [mg85087] Re: List complement operator
- From: Szabolcs Horvát <szhorvat at gmail.com>
- Date: Sun, 27 Jan 2008 05:51:18 -0500 (EST)
- Organization: University of Bergen
- References: <fn1ndi$97t$1@smc.vnet.net> <fn21s3$irs$1@smc.vnet.net> <fnessh$i8c$1@smc.vnet.net>
sashap wrote:
> Under the assumption that lists a and b contain positive integers the
> following
> version is the fastest:
>
> f5[a_List, b_List] :=
> Block[{x},
> Join @@ (ConstantArray @@@
> DeleteCases[
> List @@ (Total[(#2 x^#1 & @@@ Tally[a])] -
> Total[(#2 x^#1 & @@@ Tally[b])]) /. {c_. x^(n_.) :> {n,
> c}}, {_, _?NonPositive}])]
>
> In[85]:= Timing[r1 = f1[a, b];]
>
> Out[85]= {0.547, Null}
>
> In[86]:= Timing[r3 = f3[a, b];]
>
> Out[86]= {0.719, Null}
>
> In[87]:= Timing[r5 = f5[a, b];]
>
> Out[87]= {0.015, Null}
>
> In[88]:= r1 === r3 === r5
>
> Out[88]= True
>
That's a very smart trick, exploiting the properties of Plus and Times,
and avoiding the need to align the results from Tally[a] and Tally[b]!
:-)
Szabolcs