Ultimamente avevo un problema con un array che conteneva alcune centinaia di migliaia di valori e l'unica cosa che volevo fare era verificare se un valore era già presente. Nel mio caso si trattava di IP da un registro del server web. Quindi, in pratica qualcosa di simile:Esistono strutture dati alternative rispetto agli array in PHP, dove posso beneficiare di diverse tecniche di indicizzazione?
in_array(ip2long(ip),$myarray)
ha fatto il lavoro
Tuttavia, il tempo di ricerca è aumentato drammaticamente e 10k di ricerche ha preso circa 17 secondi o giù di lì.
Quindi in questo caso non mi importava se avessi duplicati o meno, avevo solo bisogno di verificare l'esistenza. Così ho potuto memorizzare gli indirizzi IP nell'indice come questo:
isset($myarray[ip2long($ip)])
e boom, i tempi di ricerca è andato giù da 17 secondi (e più) per un tempo statico di 0,8 secondi per 10k le ricerche. Come valore per la voce dell'array ho appena usato int 1
.
Penso che l'indice di array sia probabilmente basato su un b-tree che dovrebbe avere log (n) tempo di ricerca e l'indice su una hashmap.
Nel mio caso, l'utilizzo dell'indice ha funzionato correttamente, ma esistono strutture di dati in cui è possibile utilizzare hashmaps come indice di valori, in cui possono essere utilizzati anche più valori (mi rendo conto che ciò ha senso solo se non si dispone di troppi duplicati e non posso usare efficientemente le richieste di intervallo/ricerca, che è il vantaggio principale delle strutture ad albero)?
A volte buone soluzioni sono proprio di fronte a voi e vi basti pensare troppo complicato. -- Ben fatto. – Smamatti
L'ha capovolto da quello che ho capito. –
L'uso di isset ($ a [$ key]) è molto (!) Più veloce di array_key_exists ($ key, $ a), perché isset è una struttura e array_key_exists() è una funzione. – BurninLeo