Lección
La teoría — Trie: el árbol de prefijos, paso a paso
Un trie, o árbol de prefijos, guarda un conjunto de palabras en un árbol con un nodo por cada prefijo distinto. La raíz representa el prefijo vacío. Cada arista lleva una letra, de modo que el camino desde la raíz hasta un nodo forma el prefijo de ese nodo. El nodo está marcado si su prefijo es una palabra completa del conjunto. Las palabras que empiezan igual comparten el tramo de camino correspondiente a ese comienzo. Una búsqueda sigue las letras de la palabra desde la raíz; una búsqueda por prefijo llega hasta el nodo del prefijo y recoge todos los nodos marcados que hay debajo. Edward Fredkin dio nombre a esta estructura en 1960 a partir de la palabra inglesa retrieval, con la intención de que se pronunciara como tree.
Qué significa cada símbolo
W- número de palabras de la lista
L- número total de letras de esas palabras
N- número de nodos, uno por cada prefijo distinto, sin contar la raíz
- Supone
- Se usan letras minúsculas de la a a la z, un byte por letra y punteros de 64 bits. En ninguna de las estructuras se cuentan los bytes de relleno ni la memoria adicional que necesita el gestor de memoria. La búsqueda binaria cuenta cada par de letras que compara y se detiene en el primero que difiere; llegar al final de una palabra no tiene coste. La tabla hash funciona sin ninguna colisión, su caso más favorable. Los nodos de 18 bytes mantienen sus hijos en orden alfabético, de modo que la búsqueda entre ellos se detiene en cuanto pasa de la letra buscada.
Problema resuelto al detalle
-
¿Cuántas letras habría que compartir para que el trie ocupara menos? 4 pasos
Pulsa Palabras largas: 85 letras en 21 nodos, tres cuartas partes compartidas, y el trie con nodos de 18 bytes aún ocupa 396 bytes frente a los 157 de la lista. Si todas las palabras tienen k letras, el caso más favorable para el trie frente a la lista es el que contiene todas las palabras posibles. Con los bytes que cuenta esta página, ¿cuál es el menor valor de k para el que ese trie ocupa menos que la lista simple?
Abre este problema en la herramienta
-
En la página hay 21 nodos más la raíz: 22 × 18 = 396 bytes. La lista guarda 85 letras y, por cada una de sus 8 palabras, un byte de fin y un puntero de 8 bytes: 85 + 9 × 8 = 157.
-
El conjunto de todas las cadenas de k letras contiene 26k palabras, cada una de k letras. La lista ocupa, por tanto, (k + 9) × 26k bytes.
-
El trie necesita un nodo por cada cadena de 1 a k letras: 26 + 26² + … + 26k, algo menos que 26/25 × 26k. Al añadir la raíz y multiplicar por 18, el trie ocupa algo menos de 18,72 × 26k bytes.
-
La lista pasa a ocupar más cuando k + 9 supera 18,72. El primer valor que lo cumple es k = 10. Para k = 9, el trie ocupa un 4,0 % más que la lista; para k = 10, un 1,5 % menos.
Respuesta
10 letras, con las 2610 palabras posibles en la lista: unas 1,4 × 1014 palabras. Con nodos de 209 bytes, la misma suma exige que k + 9 supere aproximadamente 217; hacen falta palabras de 209 letras.
-
Ruta de aprendizaje
Qué operaciones abarata una estructura de datos
Referencias (3)
- The name, its origin in "retrieval", and Fredkin's intended pronunciation, quoted in the definition: Paul E. Black, "trie", in Dictionary of Algorithms and Data Structures [online], Paul E. Black, ed., NIST, entry modified 12 February 2019.
- The paper that named the structure: Edward Fredkin, "Trie memory," Communications of the ACM 3(9), September 1960, pp. 490–499.
- The earlier description of searching on letter-by-letter keys: René de la Briandais, "File searching using variable length keys," Papers presented at the Western Joint Computer Conference, San Francisco, 3–5 March 1959, pp. 295–298.