MathGroup Archive 2011

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

Search the Archive

Re: Delete elements from list..

  • To: mathgroup at smc.vnet.net
  • Subject: [mg116622] Re: Delete elements from list..
  • From: Leonid Shifrin <lshifr at gmail.com>
  • Date: Tue, 22 Feb 2011 04:41:38 -0500 (EST)

Hi Maarten,

here is one way:

In[207]:= tst = {1, 2, 3, 4, 5, 6, 4, 5, 7, 8, 9}

Out[207]= {1, 2, 3, 4, 5, 6, 4, 5, 7, 8, 9}

In[208]:= Union[Rest[FoldList[Max, -Infinity, tst]]]

Out[208]= {1, 2, 3, 4, 5, 6, 7, 8, 9}

On my machine, for the list sizes you mention, this works in under a second:

In[209]:= largeTest = RandomInteger[{1, 1000}, {1000, 1000}];

In[210]:=
Map[Union[Rest[FoldList[Max, -Infinity, #]]] &, largeTest]; // Timing

Out[210]= {0.782, Null}

If you are ultimately for speed, and have a multi-core machine with a C
compiler installed, then the following is much faster than the above code,
although it won't win the beauty contest:

fn = Compile[{{lst, _Integer, 1}},
  Module[{i, temp, len = Length[lst], reslist, solctr},
   For[reslist = Table[0, {len}]; temp = 0; i = solctr = 1, i <= len,
    i++,
    If[temp < lst[[i]], reslist[[solctr++]] = temp = lst[[i]]];];
   Drop[reslist, -(len - solctr + 1)]], CompilationTarget -> "C",
  RuntimeAttributes -> Listable]

For example:

In[223]:= largeTest1 = RandomInteger[{1, 1000}, {10000, 1000}];

In[226]:= fn[largeTest1]; // AbsoluteTiming

Out[226]= {0.0419922, Null}

So, it is about 200 time faster (I have 6-core desktop, YMMV), than the
shorter functional
solution - this is pretty much the same speed you'd have for hand-written
multi-threaded C,
I guess.

HTH.

Regards,
Leonid


On Tue, Feb 22, 2011 at 3:30 AM, Maarten van der Burgt <
Maarten.VanDerBurgt at kla-tencor.com> wrote:

> Hallo,
>
> I have a list like:
>
> mylist = {1, 2, 3, 4, 5, 6, 4, 5, 7, 8, 9}
>
> I want to delete any element which is not strictly larger than the
> previous element, until my new list has only increasing values.
>
> This means in mylist above I want to delete the 4 and the 5 at position
> 7 and 8.
>
> Any elegant and fast way for doing this?
>
> In practice I want to do this for a large amount (1000) of very large
> lists (1000). So speed is important.
>
> Thanks for your help.
>
> Maarten
>


  • Prev by Date: Re: Rational[a,b] vs Rational[1,2]
  • Next by Date: Re: Rational[a,b] vs Rational[1,2]
  • Previous by thread: Re: Delete elements from list..
  • Next by thread: Re: Delete elements from list..