|
|
Re: Find Position of many elements in a large list.
Posted:
Aug 15, 2012 3:33 AM
|
|
Am 14.08.2012 11:05, schrieb benp84@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
|
|