Io sono un po 'in perdita come effettuare le seguenti operazioni in modo efficiente in Mathematica:MemberQ in 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}]
risultato atteso è:
{False, True, False, True, False}
mie liste a
e b
sono grandi, così Mathematica sta facendo ricerche kazillion lineari attraverso b
. Voglio che faccia ricerche più veloci con una tabella hash. Ma sembra che non ci sia una tale struttura. Il più vicino che ho trovato è uno SparseArray, ma
sa = SparseArray[{1 -> True, 2 -> True}];
MemberQ[sa, 1]
è False
.
Sono sicuro che questo deve essere possibile in Mathematica in una riga di codice o meno, non riesco a vederlo per gli alberi, o qualcosa del genere.
Qualsiasi eroe in soccorso? Nel frattempo, lo farò con C#.
Grazie per aver fatto il confronto temporale. Penso che ti meriti la risposta accettata anche se non avevi la risposta più veloce. Ma a tale proposito, il .06 vs .09 non convince: vuoi provarlo con un ordine di grandezza maggiore per assicurarsi che regga? – dreeves
Quale è meglio, sembra dipendere anche da alist e blist. Con alist e blist impostati su RandomInteger [** 100000 **, 800000], la soluzione di Dispatch è migliore di 5.2s rispetto alla soluzione funzionale (5.4), mentre su RandomInteger [** 10000 **, 800000] la soluzione funzionale è più veloce (5.3s contro 5.7s). La soluzione sparsa emette messaggi di errore, che non ho esaminato .. –
Ho riassegnato la risposta accettata, perché dreeves lo richiede. Grazie per i tempi di confronto, mi sento un po 'a disagio a sprecare il tempo della gente in questo modo. :) – Gleno