MathGroup Archive 2003

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Re: split a list

  • To: mathgroup at smc.vnet.net
  • Subject: [mg40592] Re: [mg40537] Re: split a list
  • From: Dr Bob <majort at cox-internet.com>
  • Date: Thu, 10 Apr 2003 03:44:05 -0400 (EDT)
  • References: <b70boj$883$1@smc.vnet.net> <200304100026.UAA21553@smc.vnet.net>
  • Reply-to: majort at cox-internet.com
  • Sender: owner-wri-mathgroup at wolfram.com

Experimental package and test data:

<< Experimental`
testList[n_Integer] := Array[Random[] &, n]
trial[n_Integer] := {testList@n, Random[]}

Three solutions:

treat[test_List, break_] := Flatten /@ Reap[If[# â?¤ break, Sow[#, 1], 
Sow[#,2]] &
          /@ test, {1, 2}]
brambilla[r_, m_] := Module[{tmp, u, v, i}, u = v = {};
    For[i = 1, i â?¤ Length[r], i++, tmp = r[[i]];
      If[tmp > m, AppendTo[u, tmp], AppendTo[v, tmp]];];
    {v, u}]
kuska[r_, m_] := {Select[r, # â?¤ m &], Select[r, # > m &]}

Accuracy (one of many):

test = trial@5;
brambilla @@ test == kuska @@ test ==
  treat @@ test

True

(Small n is a better accuracy test than large, for this one!)

Timing:

test = trial@50000;
Timing[brambilla @@ test;]
Timing[treat @@ test;]
Timing[kuska @@ test;]

{210.015*Second, Null}
{0.39100000000001955*Second,   Null}
{0.4219999999999686*Second,   Null}

test = trial@500000;
Timing[treat @@ test;]
Timing[kuska @@ test;]

{3.906000000000006*Second,   Null}
{4.187999999999988*Second,   Null}

test = trial@1500000;
Timing[kuska @@ test;]
Timing[treat @@ test;]
Timing[treat @@ test;]
Timing[kuska @@ test;]

{12.718999999999994*Second,   Null}
{12.625*Second, Null}
{12.375*Second, Null}
{13.078000000000031*Second,   Null}

'treat' doesn't win every time, and the difference is fairly small.

I think a division according to several breakpoints (not just one m) would 
favor my method more clearly.

Bobby

On Wed, 9 Apr 2003 20:26:16 -0400 (EDT), Jens-Peer Kuska 
<kuska at informatik.uni-leipzig.de> wrote:

> Hi,
>
> lst = Table[Random[], {10000}];
>
> (* your version *)
>
> SplitAt[r_, m_] := Module[{tmp, u, v, i},
> u = v = {};
> For[i = 1, i <= Length[r], i++, tmp = r[[i]];
> If[tmp > m, AppendTo[u, tmp], AppendTo[v, tmp]];];
> {v, u}
> ]
>
> (* a faster one *)
>
> SplitAt1[r_, m_] := {Select[r, # < m &], Select[r, # >= m &]}
>
>
> Timing[SplitAt[lst, 0.5];]
>
> {24.22 Second, Null}
>
> and
>
> Timing[SplitAt1[lst, 0.5];]
>
> {0.6 Second, Null}
>
> Regards
> Jens
>
> Roberto Brambilla wrote:
>>
>> Hi,
>>
>> I have a list (very long, thousands, and unsorted) of numbers 
>> r={n1,n2...}
>> and for a given a number m  I want to split it in the two sublists
>> (unsorted, same order) u={elements<m], v={elements>m}.
>> Now I use this *old-style*  method:
>>
>> u = v = {};
>> For[i = 1, i <= Length[r], i++,
>> tmp = r[[i]];
>> If[tmp > m , AppendTo[u, tmp], AppendTo[v, tmp]];
>> ]
>>
>> Any suggestion for a more efficient (and elegant) method?
>> Also oneliners are well accepted.
>>
>> Many thanks, Roberto
>>
>> Roberto Brambilla
>> CESI
>> Via Rubattino 54
>> 20134 Milano
>> tel +39.02.2125.5875
>> fax +39.02.2125.5492
>> rlbrambilla at cesi.it
>
>



-- 
majort at cox-internet.com
Bobby R. Treat



  • References:
  • Prev by Date: RE: Re: How do I make graphs of (easy) functions like those in textbooks?
  • Next by Date: RE: split a list
  • Previous by thread: Re: split a list
  • Next by thread: Re: split a list