He estado buscando una implementación eficiente de String trie. Principalmente he encontrado un código como este:
Implementación referencial en Java (según wikipedia)
No me gustan estas implementaciones principalmente por dos razones:
- Solo admiten 256 caracteres ASCII. Necesito cubrir cosas como cirílico.
- Son extremadamente ineficientes de memoria.
Cada nodo contiene una matriz de 256 referencias, que son 4096 bytes en una máquina de 64 bits en Java. Cada uno de estos nodos puede tener hasta 256 subnodos con 4096 bytes de referencias cada uno. Por lo tanto, un Trie completo para cada cadena de caracteres ASCII 2 requeriría un poco más de 1 MB. Tres cadenas de caracteres? 256 MB solo para matrices en nodos. Y así.
Por supuesto, no tengo la intención de tener 16 millones de cadenas de tres caracteres en mi Trie, por lo que se desperdicia mucho espacio. La mayoría de estas matrices son solo referencias nulas, ya que su capacidad supera con creces el número real de claves insertadas. Y si agrego unicode, las matrices se vuelven aún más grandes (char tiene valores de 64k en lugar de 256 en Java).
¿Hay alguna esperanza de hacer un trie eficiente para cuerdas? He considerado un par de mejoras sobre este tipo de implementaciones:
- En lugar de usar una matriz de referencias, podría usar una matriz de tipo entero primitivo, que se indexa en una matriz de referencias a nodos cuyo tamaño es cercano al número de nodos reales.
- Podría dividir cadenas en partes de 4 bits que permitirían matrices de nodos de tamaño 16 a costa de un árbol más profundo.