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