Menu
Coddy logo textTech

Trie (árbol de prefijos)

Última actualización

Un trie (se pronuncia "trai"), o árbol de prefijos, almacena un conjunto de cadenas por sus caracteres: cada arista se etiqueta con un carácter y un camino desde la raíz deletrea un prefijo. Las palabras que comparten un prefijo comparten los mismos nodos, así que "car", "card" y "care" reutilizan todas el camino c-a-r. Pulsa reproducir arriba para ver cómo se insertan las palabras un carácter a la vez, ramificándose solo donde difieren.

Como las búsquedas recorren un nodo por carácter, buscar una palabra de longitud m toma O(m) sin importar cuántas palabras contenga el trie. Eso hace que los tries sean ideales para autocompletado, corrección ortográfica y búsqueda por prefijos.

Complejidad temporal y espacial

OperaciónComplejidadNotas
InsertarO(m)m = longitud de la palabra
BuscarO(m)Un paso por carácter
Consulta de prefijoO(m)Recorrer hasta el nodo del prefijo
EspacioO(total chars)Los prefijos compartidos se almacenan una sola vez

Paso a paso (inserción)

PasoQué ocurre
1Comienza en el nodo raíz.
2Por cada carácter de la palabra, busca una arista hija coincidente.
3Si existe, síguela (reutilizando el prefijo compartido).
4Si no, crea un nuevo nodo hijo para ese carácter.
5Tras el último carácter, marca ese nodo como fin de palabra.

Ejemplo resuelto

Insertando ["car", "card", "care"] en un trie vacío:

PasoEstructuraAcción
Insertar carroot → c → a → r✓No existen hijos coincidentes, así que crea c, a, r y marca r como fin de palabra.
Insertar cardroot → c → a → r✓ → d✓Reutiliza el camino existente c-a-r, luego crea un nuevo hijo d y márcalo como fin de palabra.
Insertar careroot → c → a → r✓ → {d✓, e✓}Reutiliza c-a-r, ramifica desde r con un nuevo hijo e y marca e como fin de palabra.
Buscar careroot → c → a → r → e✓Recorre c, a, r, e; el nodo final está marcado como fin de palabra, así que care está presente.
Buscar caroot → c → aEl camino existe pero a no está marcado como fin de palabra, así que ca es un prefijo pero no una palabra almacenada.

Cuándo usar un trie

Úsalo cuandoEvítalo cuando
Necesitas consultas por prefijo o autocompletado sobre un conjunto de cadenas.Solo necesitas búsquedas de claves completas: una tabla hash es más rápida y ligera.
Muchas palabras almacenadas comparten prefijos comunes, así que se reutilizan nodos.Las claves son largas y rara vez se solapan, desperdiciando un nodo por carácter.
Quieres que las claves se devuelvan en orden mediante un recorrido.La memoria es escasa: los punteros a hijos por nodo añaden una sobrecarga considerable.
El coste de búsqueda debe depender de la longitud de la clave, no del tamaño del conjunto de datos.El alfabeto es enorme (p. ej. todo Unicode) y los hijos se almacenan de forma densa.

Código de Trie (Prefix Tree)

Una implementación limpia y ejecutable de Trie (Prefix Tree) en Python, JavaScript, Java, C++, C. Elige un lenguaje, copia el código o ábrelo ya cargado en el Playground de Coddy.

Código de Trie (Prefix Tree) en Python

Python
1class TrieNode:2    def __init__(self):3        self.children = {}4        self.is_word = False5
6
7class Trie:8    def __init__(self):9        self.root = TrieNode()10
11    def insert(self, word):12        node = self.root13        for ch in word:14            node = node.children.setdefault(ch, TrieNode())15        node.is_word = True16
17    def search(self, word):18        node = self._walk(word)19        return node is not None and node.is_word20
21    def starts_with(self, prefix):22        return self._walk(prefix) is not None23
24    def _walk(self, s):25        node = self.root26        for ch in s:27            if ch not in node.children:28                return None29            node = node.children[ch]30        return node31
32
33trie = Trie()34for word in ["car", "card", "care", "dog"]:35    trie.insert(word)36
37print("search(card):     ", trie.search("card"))38print("search(ca):       ", trie.search("ca"))39print("starts_with(ca):  ", trie.starts_with("ca"))40print("starts_with(do):  ", trie.starts_with("do"))41print("starts_with(cat): ", trie.starts_with("cat"))
Ejecuta este código en el Playground de Python

Preguntas frecuentes sobre tries

¿Para qué se usa un trie?
Los tries impulsan funciones basadas en prefijos: autocompletado y sugerencias de búsqueda, correctores ortográficos, tablas de enrutamiento IP y consultas de diccionario. Allí donde necesitas responder rápido a "¿alguna palabra almacenada empieza por este prefijo?", un trie brilla.
¿Cuál es la complejidad temporal de un trie?
La inserción, la búsqueda y las consultas de prefijo se ejecutan todas en O(m), donde m es la longitud de la palabra o prefijo, independientemente de cuántas palabras se almacenen. El compromiso es la memoria: un trie puede usar mucho espacio, aunque los prefijos compartidos se almacenan una sola vez.
¿Cuál es la diferencia entre un trie y una tabla hash?
Una tabla hash ofrece búsqueda promedio en O(1) de claves completas, pero no puede responder consultas de prefijo. Un trie es algo más lento por búsqueda, pero admite de forma natural la búsqueda por prefijo, el recorrido ordenado y el autocompletado, la razón por la que se prefiere para esos casos.
¿Cuándo debería usar un trie en lugar de un árbol binario de búsqueda?
Usa un trie cuando tus claves sean cadenas y necesites búsquedas por prefijo: se ejecuta en O(m) por operación sobre la longitud de la clave, mientras que un BST equilibrado cuesta O(m log n) porque cada comparación recorre la cadena y hay log n de ellas. Un BST es mejor opción cuando las claves no son de tipo cadena o cuando la sobrecarga de memoria importa más que la velocidad de prefijos.
¿Cómo se maneja el fin de una palabra en un trie?
Cada nodo lleva una marca de fin de palabra que se activa solo cuando una palabra completa insertada termina ahí. Sin ella no podrías distinguir una palabra almacenada de un mero prefijo: por ejemplo, tras insertar card, el nodo de car existe pero solo debería reportarse como palabra si car también se insertó.
¿Los tries siempre ahorran memoria al compartir prefijos?
No siempre. La compartición ayuda solo cuando muchas claves se solapan; con claves largas y distintas, un trie puede usar mucha más memoria que un conjunto hash, ya que cada carácter se convierte en su propio nodo con punteros a hijos. Si el espacio es la preocupación, un árbol radix comprimido fusiona las cadenas de un solo hijo para reducir esa sobrecarga.
Coddy programming languages illustration

Domina los algoritmos con Coddy

COMENZAR