MathGroup Archive 2012

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

Search the Archive

Re: Find Position of many elements in a large list.

  • To: mathgroup at smc.vnet.net
  • Subject: [mg127695] Re: Find Position of many elements in a large list.
  • From: Peter Pein <petsie at dordos.net>
  • Date: Wed, 15 Aug 2012 03:35:46 -0400 (EDT)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • Delivered-to: l-mathgroup@wolfram.com
  • Delivered-to: mathgroup-newout@smc.vnet.net
  • Delivered-to: mathgroup-newsend@smc.vnet.net
  • References: <k0d4bu$m8f$1@smc.vnet.net>

Am 14.08.2012 11:05, schrieb benp84 at gmail.com:
> I have a sorted, 1-dimensional list X of 1,000,000 integers, and a sorted, 1-dimensional list Y of 10,000 integers.  Most, but not all, of the elements of Y are also elements of X.  I'd like to know the positions of the elements in X that are also in Y.  What's the fastest way to compute this?
>
> I have an algorithm in mind but it requires lots of custom code and I'm wondering if there's a clever way to do it with built-in functions.  Thanks.
>

Well, using the fact that the huge list (x) is sorted, I got a faster one.

binpos[xl_, y0_] :=
   Block[{mid = BitShiftRight[Length[xl]], sel, pos},
    If[mid === 0,
     Boole[xl === {y0}],
     If[xl[[mid]] <= y0, sel = Drop; pos = mid, sel = Take; pos = 0];
     pos + binpos[sel[xl, mid], y0]
     ]];
Reap[Fold[Drop[#1, Sow[binpos[##]]] &, x, Intersection[x, y]]][[2,
    1]] // Accumulate

needs only 20% of the time needed by
  Position[x,Alternatives@@Intersection[x,y]]//Flatten

I'm sure, this can be slightly optimized.
Peter




  • Prev by Date: Re: Find Position of many elements in a large list.
  • Next by Date: Re: How to use Pick[]; Is this a bug?
  • Previous by thread: Re: Find Position of many elements in a large list.
  • Next by thread: Re: Find Position of many elements in a large list.