Re: Re: Unsorted Union
- To: mathgroup at smc.vnet.net
- Subject: [mg61639] Re: [mg61564] Re: Unsorted Union
- From: Adriano Pascoletti <pascolet at dimi.uniud.it>
- Date: Mon, 24 Oct 2005 21:06:57 -0400 (EDT)
- References: <dj4p6t$gpt$1@smc.vnet.net><dj721s$cpb$1@smc.vnet.net> <200510220724.DAA12393@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Il giorno 22 ott 2005, alle ore 09:24, Bill White ha scritto:
> Other interesting things can be done with this memoizing scheme. For
> example, it can be used to collect the duplicate elements in a list:
>
> In[11]:=
> DuplicateElements[list_List]:=
> Module[{f,dups={}},
> f[n_]:=(f[n]:=AppendTo[dups,n]);
> f/@list;
> dups];
>
> In[12]:=
> list=Table[Random[Integer,{1,10}],{10}]
>
> Out[12]=
> {3,10,7,10,2,2,6,9,6,9}
>
> In[13]:=
> DuplicateElements[list]
>
> Out[13]=
> {10,2,6,9}
>
> Cheers -
>
> bw
>
>
A very efficient approach to duplicates is based on Sow and Reap
(Mathematica v. 5):
dups = Reap[Sow[1, #], _, If[Length[#2] > 1, #1, Sequence @@ {}] &]
[[2]] &;
L=Table[Random[Integer,{-1000,1000}],{10000}];
Timing[DuplicateElements[L]][[1]]
Timing[dups[L]][[1]]
3.95812 Second
0.105166 Second
L=Table[Random[Integer,{-5000,5000}],{20000}];Timing[DuplicateElements
[L]][[1]]
Timing[dups[L]][[1]]
21.3677 Second
0.596305 Second
If you want the multeplicities of repeated elements
dups1 = Reap[
Sow[1, #], _, If[Length[#2] > 1, {#1, Length@#2}, Sequence @@
{}] &][[2]] &;
list = Table[Random[Integer, {1, 10}], {10}]
{5, 4, 6, 9, 9, 9, 3, 6, 10, 4}
dups1[list]
{{4,2},{6,2},{9,3}}
L = Table[Random[Integer, {-5000, 5000}], {20000}];
Timing[DuplicateElements[L]][[1]]
Timing[dups1[L]][[1]]
Out[40]=
30.258 Second
Out[41]=
0.557876 Second
Adriano Pascoletti
- References:
- Re: Unsorted Union
- From: "Bill White" <minutiae@gmail.com>
- Re: Unsorted Union