Dear All,

I am still wondering why it can be so slow in some cases? In my
example it took almost 30 secs to remove one element from a list
of 50000 items. And this one element was not even existing in the
array.

Trying to avoid traversing the list myself I now use:

    nitms = @col[j].uniq.nitems
    nitms -= 1 if mitms > 0  # i.e., if there are missing values

That is speed enough. Going through the list with a hash 'by hand'
and then counting keys was almost as fast (5 secs more).

So what slows it down so much when going through the list twice?

Hans Werner.

> > > Yes, current implementation is optimized for bigger arrays, it
> > > takes O(N+M) time, but former was O(N*M), where arrays with N
> > > and M size.  Perhaps, in this case, GC occurred several times
> > > per each loops by 1,600,000 items hashes.
> >
> > I'm curious. How do you do this operation in O(N+M)?

> Once making a hash whose keys are the minuend's elements, and
> remove the subtrahend's elements from it.  At last, for all the
> minuend's elements, add it to the result array if it is
> contained in the hash.  Oops, sorry, it was O(2*N+M).
>
> --
> Nobu Nakada