Re: Finding the closest number from a list

*To*: mathgroup at smc.vnet.net*Subject*: [mg39554] Re: Finding the closest number from a list*From*: Uri Zwick <zwick at tau.ac.il>*Date*: Sun, 23 Feb 2003 04:59:51 -0500 (EST)*Sender*: owner-wri-mathgroup at wolfram.com

Hi, Here is an improvement over my previous suggestion. It runs about three times faster: fnd3[x_,y_] := Module[ {inv,ind,one,pos,ly,x1,z1,z2,avr,sgn} , inv = ind = Ordering[ Join[ y , x1 = Sort[ Join[x,{-$MaxMachineNumber,$MaxMachineNumber}] ] ] ] ; inv[[ind]] = Range[1,Length[ind]] ; ly = Length[y]+0.5 ; one = Sign[ Sign[ind-ly] + 1 ] ; pos = FoldList[Plus,one[[1]],Drop[one,1]] [[Take[inv,Length[y]]]] ; z1 = x1[[pos]] ; z2 = x1[[pos+1]] ; avr = (z1+z2)/2 ; sgn = Sign[ Sign[ Sign[y-avr]-0.5 ] + 1 ] ; (1.-sgn)z1 + (sgn+0.) z2 ] On my 900Mhz Pentium III I get: In[1]:= x = Table[Random[], {30000}]; In[2]:= y = Table[Random[], {10000}]; In[3]:= Timing[fnd3[x, y];] {0.15 Second, Null} It is interesting to note that "(1.-sgn)z1 + (sgn+0.) z2" is much faster than "(1-sgn)z1 + sgn z2". Also, using 0.5 instead of 1/2 inside the Sign speeds things up. The posting of Daniel Lichtblau suggests a similar approach, though the implementation details are quite different. Does anyone know why 0 comes before -Infinity in the standard ordering? (See my previous posting in this thread.) Also, did anyone encounter an "assertion failed at "\[InvisibleSpace]" after perturbation steplength > 0" while calling ConstrainedMin? (See a separate posting.) Uri