Re: Challenge! ....RESULTS...
- To: mathgroup at christensen.cybernetics.net
- Subject: [mg1044] Re: Challenge! ....RESULTS...
- From: roth at sunny.mpimf-heidelberg.mpg.de (Arnd Roth)
- Date: Wed, 10 May 1995 08:05:35 -0400
- Organization: Max-Planck-Institut fuer Medizinische Forschung
In article <3nv8if$91e at news0.cybernetics.net> pehowland at taz.dra.hmg.gb (Paul E. Howland) writes: > T H E R E S U L T S > ++++++++++++++++++++ > > Tested by using list1 = {a,b,c,d,e,f,g,h,i,j}; > list2 = {A,B,C,D,E,F,G,H,I,J}; > With > Timing[Do[swap[list1,list2],{1000}]] > > on a DEC 3000/400 running Mathematica V2.2.4 for OSF/1. > > > My function 9.93333 seconds > Buchanan's function 9.56667 seconds > Lichtblau's function 4.06667 seconds > Villegas' function 1 3.9 seconds > Villegas' function 2 6.05 seconds > Wagner's function 3.66667 seconds > > So David Wagner is the winner! > > It's interesting that Wagner and Lichtblau have almost identical solutions, the > fundamental difference being that Wagner uses Random[Integer, {1,2}] whereas > Lichtblau uses Random[Integer]+1. The latter is obviously slower to compute. There are solutions that are faster than David Wagner's, but they may not have reached you when you made this timing comparison. So here is another set of timings (done on a Sparc 10/51). In[1]:= l1 = {a,b,c,d,e,f,g,h,i,j}; In[2]:= l2 = {A,B,C,D,E,F,G,H,I,J}; Howland's function pehowland at dra.hmg.gb In[3]:= swap[list1_List,list2_List] := Module[{newlist={},M,i}, M=Length[list1]; Do[AppendTo[newlist,If[Random[]>0.5,list1[[i]],list2[[i]]]],{i,M}]; newlist] In[4]:= Timing[Do[swap[l1,l2],{1000}]] Out[4]= {6.45 Second, Null} Buchanan's function buchanan at niehs.nih.gov In[5]:= swap[list1_List,list2_List] := Module[{len,sel},len=Length[list1]; sel = Table[{Random[Integer, {1,2}], i}, {i, len}]; Map[{list1,list2}[[#[[1]],#[[2]]]]&, sel]] In[6]:= Timing[Do[swap[l1,l2],{1000}]] Out[6]= {6.09 Second, Null} Lichtblau's function danl at wri.com In[7]:= swap[list1_List,list2_List] := Map[#[[Random[Integer]+1]]&,Transpose[{list1,list2}]] In[8]:= Timing[Do[swap[l1,l2],{1000}]] Out[8]= {2.17 Second, Null} Villegas' function 1 villegas at wri.com In[9]:= swap[list1_List,list2_List] := MapThread[Part[{#1,#2},1+Random[Integer]]&, {list1,list2}] In[10]:= Timing[Do[swap[l1,l2],{1000}]] Out[10]= {2.08 Second, Null} Villegas' function 2 villegas at wri.com In[11]:= swap[list1_List,list2_List] := Module[{i,len}, len=Length[list1]; Table[Part[{list1,list2},Random[Integer,{1,2}],i],{i,len}]] In[12]:= Timing[Do[swap[l1,l2],{1000}]] Out[12]= {3.98 Second, Null} Wagner's function wagner at bullwinkle.cs.colorado.edu In[13]:= swap[list1_List,list2_List] := #[[Random[Integer,{1,2}]]]& /@ Transpose[{list1,list2}] In[14]:= Timing[Do[swap[l1,l2],{1000}]] Out[14]= {1.98 Second, Null} My function roth at sunny.mpimf-heidelberg.mpg.de In[15]:= swap[list1_List, list2_List] := ReleaseHold[Thread[ Hold[If[Random[Integer] == 0, #1, #2] &][list1, list2]]] In[16]:= Timing[Do[swap[l1,l2],{1000}]] Out[16]= {1.79 Second, Null} Villegas' function 3 villegas at wri.com In[17]:= swap[list1_List, list2_List] := Thread @ Unevaluated[If[Random[Integer] == 0, #1, #2]& [list1, list2]] In[18]:= Timing[Do[swap[l1,l2],{1000}]] Out[18]= {1.44 Second, Null} So Robby Villegas' function 3 is fastest among the solutions I tested. But of course there may still be room for further speedup. Arnd Roth Abteilung Zellphysiologie Max-Planck-Institut fuer Medizinische Forschung Postfach 10 38 20, D-69028 Heidelberg, Germany http://sunny.mpimf-heidelberg.mpg.de/people/roth/ArndRoth.html