Re: Sorting and Selecting in MultiLevel Lists?
- To: mathgroup at smc.vnet.net
- Subject: [mg31208] Re: Sorting and Selecting in MultiLevel Lists?
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Fri, 19 Oct 2001 03:11:58 -0400 (EDT)
- References: <200110140811.EAA02423@smc.vnet.net> <9qjjp9$j8c$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Using Ordering instead of Sort gives a further speedup: sortOnNorm3[ll_List] := ll[[Ordering[#.#&/@ll]]] sortOnNorm[ll_List] := Map[Rest, Sort[Map[Prepend[#,#.#]&, ll]]] n = 4; ll = Table[Random[], {10^n}, {2}]; Timing[sortedll = sortOnNorm[ll];] {1.59 Second,Null} Timing[sortedll3 = sortOnNorm3[ll];] {0.33 Second,Null} sortedll===sortedll3 True -- Allan --------------------- Allan Hayes Mathematica Training and Consulting Leicester UK www.haystack.demon.co.uk hay at haystack.demon.co.uk Voice: +44 (0)116 271 4198 Fax: +44 (0)870 164 0565 "Daniel Lichtblau" <danl at wolfram.com> wrote in message news:9qjjp9$j8c$1 at smc.vnet.net... > aes wrote: > > > > Suppose I want to Sort, or Select from, a multilevel list, e.g. > > > > myList = { {x1,y1}, {x2,y2}, {x3,y3}, . . . } > > > > with a Sort or Select criterion that's some function of the xn and yn values > > > > For example, I can sort the above list on the value of x^2 + y^2 by using > > > > Sort[myList, (Take[#1, 1][[1]]^2 + Take[#1, 2][[1]]^2) < > > (Take[#2, 1][[1]]^2 + Take[#2, 2][[1]]^2) &] > > > > Question: Is there an easier way to get at the "x" and "y" values associated > > with the #1 and #2 arguments in Sort, or with the # argument in Select, than the > > awkward Take[#,m][[n]] notation used here? > > > If the outer lists in question are large then speed can be an issue. In > that case it is best to use default Sort because comparison evaluations > for the 2-argument form are relatively expensive. To achieve this goal > you can prepend your "sorting value" to each sublist, sort, then remove > it. > > sortOnNorm[ll_List] := Map[Rest, Sort[Map[Prepend[#,#.#]&, ll]]] > > In[74]:= n = 5; > > In[75]:= ll = Table[Random[], {10^n}, {2}]; > > In[76]:= Timing[sortedll = sortOnNorm[ll];] > Out[76]= {0.88 Second, Null} > > For comparison: > > In[78]:= sortOnNorm2[ll_List] := Sort[ll, #1.#1 < #2.#2 &] > > In[79]:= Timing[sortedll2 = sortOnNorm2[ll];] > Out[79]= {32.46 Second, Null} > > In[80]:= sortedll2 === sortedll > Out[80]= True > > > Daniel Lichtblau > Wolfram Research >
- References:
- Sorting and Selecting in MultiLevel Lists?
- From: aes <siegman@stanford.edu>
- Sorting and Selecting in MultiLevel Lists?