Re: Finding the closest number from a list
- To: mathgroup at smc.vnet.net
- Subject: [mg39548] Re: Finding the closest number from a list
- From: Uri Zwick <zwick at tau.ac.il>
- Date: Sat, 22 Feb 2003 03:38:45 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Hi, Here is my solution the problem. The trick is to sort the two lists together! fnd[x_,y_] := Module[ {inv,ind,one,pos,ly,x1} , inv = ind = Ordering[ Join[ y , x1 = Sort[ Join[x,{-$MaxMachineNumber,$MaxMachineNumber}] ] ] ] ; inv[[ind]] = Range[1,Length[ind]] ; ly = Length[y] ; one = Map[ (If[#<=ly,0,1])& , ind ] ; pos = FoldList[ Plus , one[[1]] , Drop[one,1] ] [[ Take[inv,Length[y]] ]] ; MapThread[ If[#1<(#2+#3)/2,#2,#3]& , { y , x1[[pos]] , x1[[pos+1]] } ] ] On my 900Mhz Pentium III I get: In[1]:= x = Table[Random[], {30000}]; In[2]:= y = Table[Random[], {10000}]; In[3]:= Timing[fnd[x, y];] {0.401 Second, Null} About two thirds of the time is spent on the last MapThread. The other costly operation is probably Map. Is there a simple way to speed these operations up? Also, it would have been cleaner to use -Infinity and Infinity instead of -$MaxMachineNumber and $MaxMachineNumber. But, according to the standard order -Infinity is larger than finite numbers !!! In[4] := Sort[ {0,-Infinity} ] {0 , -Infinity } Am I missing something here? Giving Sort and explicit ordering function slows it down considerably. Uri