Ho cercato un'implementazione efficiente di String trie. Principalmente ho trovato un codice come questo:
Implementazione referenziale in Java (per Wikipedia)
Non mi piacciono queste implementazioni per principalmente due motivi:
- Supportano solo 256 caratteri ASCII. Devo coprire cose come il cirillico.
- Sono estremamente inefficienti dalla memoria.
Ogni nodo contiene una matrice di 256 riferimenti, ovvero 4096 byte su una macchina a 64 bit in Java. Ognuno di questi nodi può avere fino a 256 nodi secondari con 4096 byte di riferimenti ciascuno. Quindi un Trie completo per ogni stringa di caratteri ASCII 2 richiederebbe un po 'più di 1 MB. Tre stringhe di caratteri? 256 MB solo per array nei nodi. E così via.
Ovviamente non ho intenzione di avere tutti i 16 milioni di tre stringhe di 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 (char ha 64k valori invece di 256 in Java).
C'è qualche speranza di creare un trie efficiente per le corde? 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 spezzare le stringhe in parti a 4 bit che consentirebbero array di nodi di dimensione 16 al costo di un albero più profondo.