estoy un poco en una pérdida de cómo hacer lo siguiente de manera eficiente en Mathematica:MemberQ en Mathematica
a = { 1, 2, 3, 4, 5 }; (* list of integers *)
b = { 2, 4, 6, 8 }; (* another list of integers *)
filter = Table[MemberQ[b, element], {element,a}]
salida esperada es:
{False, True, False, True, False}
Mis listas a
y b
son grandes, por lo que Mathematica está haciendo un kazillion búsquedas lineales a través de b
. Quiero que haga búsquedas más rápidas con una tabla hash. Pero parece que no hay tal estructura. Lo más cerca que pude encontrar es una SparseArray, pero
sa = SparseArray[{1 -> True, 2 -> True}];
MemberQ[sa, 1]
es False
.
Estoy seguro de que esto debe ser posible en Mathematica en una línea de código o menos, simplemente no puedo verlo por los árboles, o algo así.
¿Algún héroe al rescate? Mientras tanto, voy a hacer esto con C#.
Gracias por hacer la comparación de tiempos. Creo que mereces una Respuesta Aceptada por eso incluso si no tuviste la respuesta más rápida. Pero sobre eso, el .06 vs .09 no es convincente. ¿Quieres probarlo con un orden de magnitud mayor para asegurarte de que aguanta? – dreeves
Cuál es mejor, parece depender de alist y blist, también. Con alist y blist establecidos en RandomInteger [** 100000 **, 800000], la solución Dispatch es con 5.2s mejor que la solución funcional (5.4), mientras que en RandomInteger [** 10000 **, 800000] la solución funcional es más rápida (5.3s contra 5.7s). La solución dispersa emite mensajes de error, que no examiné. –
Le volví a adjudicar la respuesta aceptada, porque dreeves la solicitó. Gracias por las comparaciones de tiempo, me siento un poco inquieto desperdiciando el tiempo de la gente así. :) – Gleno