======= EN CONSTRUCCIÓN =======
FIXME
====== Trie ======
===== Idea intuitiva =====
Un **Trie** es una estructura de datos del tipo [[cpp-avanzado:map|diccionario]] cuyas claves son **strings**.\\
En breve veremos la flexibilidad de los tries; pero bajo esta definición, en principio podemos simularlo con un ''map'':
/// Falso trie
map T;
T["edad"] = 16
T["altura"] = 174
Al escribir nosotros mismos la estructura, podemos mejorarla para añadir operaciones que ''map'' no soporta, a la vez que mejoramos la eficiencia.
----------
===== ¿Qué son? =====
Concretamente, llamamos **Trie** a un **árbol** con raíz donde cada arco está etiquetado con un carácter, y dos arcos con la misma etiqueta no pueden salir del mismo nodo.
De esta manera, cada nodo representa al string que se obtiene de mirar el camino desde la raíz a él.
{{ https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Trie_example.svg/640px-Trie_example.svg.png?300 }}
//Imagen: Wikipedia.//\\
Trie con contenido: ''"A" : 15, "to" : 7, "tea" : 3, "ted" : 4, "ten" : 12, "i" : 11, "in" : 5, "inn" : 9''. \\
Los nodos no guardan las claves sino el valor (en azul), las etiquetas están sólo a modo de ilustración.
----------
===== Operaciones =====
Las **operaciones básicas** de todo diccionario son:
* ''insertar(clave, valor)'' : asocia el valor a la clave
* ''buscar(clave)'' : devuelve el valor asociado a la clave (o indica que no se encuentra)
* ''eliminar(clave)'' : elimina la entrada
Inicialmente se tiene un trie vacío que consiste de un único nodo: la raíz.
* Para **insertar** un string a un trie, sólo hay que ir recorriéndolo desde la raíz creando los árcos y los nodos que hagan falta. En nuestro ejemplo anterior, si queremos agregar la palabra "TENAZ", llegaremos hasta el nodo "TEN", y luego vamos a tener que agregar dos arcos (y sus correspondientes nodos): A y Z para formar "TENAZ".
* Para **buscar** un string, recorremos el trie desde la raíz hasta llegar al nodo tomando los arcos indicados por cada letra del string, en orden. Si en algún momento necesitamos tomar un arco que no existe, concluimos que el elemento buscado no se encuentra.
* Para **borrar**, hacemos una búsqueda, pero en lugar de borrar el nodo simplemente lo marcamos como "eliminado" y lo ignoramos en las subsecuentes búsquedas. Se debe recordar desmarcarlo si se hace una inserción.
==== Complejidad ====
Llamemos $n$ a la cantidad de elementos en la estructura y $k$ es la longitud de una clave.
Mientras que un ''map'' tiene una **complejidad temporal** $O(k\ \log n)$ para todas estas operaciones, un ''trie'' lo logra en $O(k)$: ¡es lineal!
Asímismo, la **complejidad espacial** también es lineal, $O(S)$ donde $S$ es la suma de las longitudes de todas las claves.
----------
===== Implementación =====
Se sugiere fuertemente intentar programar un trie por cuenta propia sabiendo las ideas ya vistas.
Se proveen acá dos implementaciones de tries, una recursiva, y una iterativa.\\
De cualquier manera, la estructura propiamente dicha del trie es recursiva. //¿Por qué?//
Al pensar recursivamente, se cometen menos errores.
==== La recursiva ====
#include
#include