Ho cercato un'efficiente implementazione di trie String. Per lo più ho trovato un codice come questo:
Implementazione referenziale in Java (per wikipedia)
Non mi piacciono queste implementazioni principalmente per due motivi:
- Supportano solo 256 caratteri ASCII. Ho bisogno di coprire cose come il cirillico.
- Sono estremamente inefficienti nella memoria.
Ogni nodo contiene una matrice di 256 riferimenti, che è 4096 byte su a Macchina a 64 bit in Java. Ciascuno di questi nodi può avere fino a 256 sottonodi con 4096 byte di riferimenti ciascuno. Quindi un Trie completo per ogni stringa di caratteri ASCII 2 richiederebbe un po 'più di 1MB. Tre stringhe di caratteri? 256 MB solo per gli array nei nodi. E così via.
Naturalmente non intendo avere tutti i 16 milioni di stringhe di tre caratteri nel mio Trie, quindi molto spazio è solo sprecato. La maggior parte di questi array sono solo riferimenti null poiché la loro capacità supera di gran lunga il numero effettivo di chiavi inserite. E se aggiungo unicode, gli array diventano ancora più grandi (il char ha 64k valori invece di 256 in Java).
C'è qualche speranza di creare un trie efficiente per archi? Ho preso in considerazione un paio di miglioramenti rispetto a questi tipi di implementazioni:
- Invece di usare una matrice di riferimenti, potrei usare una matrice di tipo intero primitivo, che indicizza in una matrice di riferimenti a nodi la cui dimensione è vicina al numero di nodi effettivi.
- Potrei interrompere le stringhe in parti a 4 bit che consentirebbero array di nodi di dimensione 16 al costo di un albero più profondo.