Está en la página 1de 22

Lenguaje C

Semana 9

Clase 16
Agenda

1 Hash Tables 2 Trie


Hash Tables
0 A
1 B
2 C
3 D
4 E
5 F
6 G
7 H
Una hash table es una estructura de datos que nos 8
9
I
J
10 K
permite asociar llaves con valores. Se mira cómo un 11 L
12 M

arreglo, en dónde podemos saltar a cualquier 13


14
N
O
15 P
locación según su índice. 16 Q
17 R
18 S
19 T
20 U
21 V
22 W
23 X
24 Y
25 Z
Albus

Cedric
Draco

Fred
Ginny
Hermione

James
Kingsley
Podemos pensar que cada ubicación es Luna
Minerva
una letra de la A a la Z, y podemos Neville

Petunia
insertar nombres en cada ubicación.
Ron
Severus

Vernon

Zacharias
El arreglo tiene 26 punteros, algunos son nulo, pero algunos apuntan
a un nombre en un nodo, es posible que cada uno de los nodos apunta
a otro nombre en un nodo.

Cada nodo tendrá un arreglo de caracteres con un tamaño máximo de


LONGEST_WORD + 1 (palabra más larga + 1), llamado word. Luego, el
puntero next va apuntar a otro nodo, si es que hay otro.
Para crear la hash table, podemos escribir lo siguiente:

hash_table.c

node *hash_table[NUMBER_OF_BUCKETS];

La hash table será un arreglo de punteros a nodos, con tamaño


NUMBER_OF_BUCKETS (cantidad de cubetas)
Para decidir en qué cubeta, o locación en el arreglo un valor debe estar,
usaremos una función hash, la cual toma una entrada y produce un índice, o
locación.

Zacharias → hash function → 25


Podríamos intentar tener cadenas menos
largas en nuestra hash table usando dos
letras, en vez de una.

Ahora, tendremos 676 cubetas en total,


para todas las combinaciones de dos
letras.
★ Podríamos considerar tres letras, usando más cubetas, pero estaríamos
usando más espacio en la memoria. Algunas de esas cubetas estarán
vacías, pero es más seguro que solo necesitamos un paso para encontrar
un valor.

★ Resulta que el peor tiempo de ejecución al buscar en una hash table es


de 𝑂(𝑛), debido a que todos los valores pueden estar en la misma cubeta,
convirtiéndo esto en una lista enlazada. Pero en práctica, el tiempo de
ejecución de seguro va a ser más rápido
“Trie”
★ Podemos usar otra estructura de datos llamada trie, es el corto de la
palabra retribución, retrieval en inglés). Un trie es un árbol con arreglos
cómo nodos:

★ Cada arreglo tendrá índices que representan cada letra, de A a la Z


Para cada palabra, la primera letra va a apuntar a un arreglo, la siguiente
letra va apuntar a otro arreglo, y así sucesivamente, hasta que lleguemos a
un valor booleano indicando el final de una palabra, marcado en verde:
★ Con múltiples nombres, vemos que algunos espacios están siendo
reusados para las primeras letras compartidas
En cada nodo, o arreglo, tendremos un valor booleano que indica si es una
palabra válida (si debería o no debería estar en verde). Luego, tendremos
un arreglo de tamaño SIZE_OF_ALPHABET (tamaño del alfabeto)
apuntando a otros nodos, llamados children.
Podemos definir un trie en código con:

trie.c

typedef struct node


{
bool is_word;
struct node *children[SIZE_OF_ALPHABET];
}
node;
★ Si nuestra estructura de datos tiene muchas palabras, el tiempo máximo
de búsqueda será la longitud de la palabra que estamos buscando. Esto
será un máximo fijo, entonces tenemos un tiempo constante, 𝑂(1), para
búsqueda e inserción.

★ Pero, esto tiene un costo, y es que necesitamos mucha memoria para


almacenar más que nada punteros null.
Hay incluso, construcciones de más alto nivel, estructuras de datos
abstraídas, en dónde usamos lo que ya conocemos cómo arreglos, listas
enlazadas, árboles, hash tables y tries para resolver otro tipo de problema.
Por ejemplo, un tipo de estructura de datos abstraída son las colas, cómo una
línea de personas esperando, en dónde el primer valor que ingresamos es el
primero en salir o ser removido, también conocido cómo first-in-first-out
(FIFO), el primero en entrar es el primero en salir.
Otra estructura de datos abstraída son las pilas, en dónde los elementos
añadidos recientemente son los primeros en salir: last-in-first-out (LIFO), el
último en entrar es el primero en salir. En un comedor, es posible que
tomemos, la bandeja que está de primero en una pila, bandejas limpias serán
añadidas arriba.
¿Preguntas?

También podría gustarte