Este repositorio contiene las soluciones para el proyecto HashMap del currículo de JavaScript de The Odin Project.
El objetivo principal de este proyecto es construir nuestra propia estructura de datos HashMap (Tabla Hash) desde cero para entender cómo funcionan estas colecciones por debajo, cómo se implementan los algoritmos de hashing y cómo lidiar con el problema de las colisiones en memoria.
Una estructura de datos rápida que asocia claves (keys) de tipo string con valores (values).
Implementa manejo de colisiones agrupando pares dentro del mismo "bucket" y tiene crecimiento dinámico (duplica su capacidad de memoria automáticamente cuando excede el factor de carga de 0.75).
Métodos principales implementados:
hash(key): Produce un código numérico para la clave, aplicando el operador módulo (%) de forma segura en cada iteración para evitar desbordamiento de enteros (integer overflow).set(key, value): Asigna el valor a la clave o lo actualiza si la clave ya existía.get(key): Retorna el valor asignado a la clave, onullsi no la encuentra.has(key): Retornatruesi la clave está en el mapa, ofalsesi no.remove(key): Elimina la clave y retornatrue, ofalsesi no existe.length(): Retorna el número total de pares guardados.clear(): Vacía completamente la memoria de la tabla.keys(),values(),entries(): Retornan arreglos con las claves, los valores, o los pares[key, value]respectivamente.
Un comportamiento idéntico al del HashMap, pero que solo almacena claves, sin valores asociados. Es la estructura ideal cuando simplemente necesitas verificar rápidamente si un elemento existe en un conjunto único o no.
Ya teniendo instalado Node.js instalado en mi sistema.
-
Abrimos la terminal y ejecutamos el siguiente comando.
node main.js
-
Y la terminal no mostrara lo siguiente.
--- Después de la carga inicial --- Capacidad actual: 16 Tamaño actual: 12 --- Después de sobrescribir --- Valor de 'apple': green Tamaño actual (debe seguir siendo 12): 12 Capacidad actual (debe seguir siendo 16): 16 --- Después de forzar expansión --- Tamaño actual: 13 Capacidad actual tras expansión: 32 --- Pruebas de métodos --- has('dog'): true has('sun'): false get('kite'): pink Keys: [ 'moon', 'carrot', 'frog', 'banana', 'grape', 'ice cream', 'jacket', 'kite', 'elephant', 'apple', 'hat', 'dog', 'lion' ] Values: [ 'silver', 'orange', 'green', 'green', 'purple', 'white', 'blue', 'pink', 'gray', 'green', 'black', 'brown', 'golden' ] Entries: [ [ 'moon', 'silver' ], [ 'carrot', 'orange' ], [ 'frog', 'green' ], [ 'banana', 'green' ], [ 'grape', 'purple' ], [ 'ice cream', 'white' ], [ 'jacket', 'blue' ], [ 'kite', 'pink' ], [ 'elephant', 'gray' ], [ 'apple', 'green' ], [ 'hat', 'black' ], [ 'dog', 'brown' ], [ 'lion', 'golden' ] ] --- Probando eliminación --- remove('dog'): true has('dog'): false Tamaño tras borrar un nodo: 12 --- Probando clear --- Tamaño tras clear(): 0
-
Habiendo finalizado las pruebas, comprobamos:
- Asignación y Actualización Correcta: El método
set()guarda nuevos pares clave-valor y actualiza correctamente los valores de claves existentes (como'apple'y'banana') sin duplicar entradas ni incrementar incorrectamente el tamaño total. - Crecimiento Dinámico Automático (Resize): Al sobrepasar el factor de carga de
0.75(al agregar el elemento número 13,'moon'), la capacidad de la tabla se duplicó automáticamente de16a32buckets. - Re-hasheado Exitoso: Al expandir la capacidad, todos los elementos existentes se redistribuyeron correctamente en el nuevo espacio de memoria según sus nuevos índices hash.
- Manejo de Colisiones: El mapa continuó recuperando y modificando elementos sin perder información, comprobando que el encadenamiento dentro de los buckets funciona.
- Consistencia de Métodos Auxiliares: Métodos como
get(),has(),remove(),keys(),values(),entries()yclear()funcionaron perfectamente tanto antes como después de la expansión de los buckets.
- Asignación y Actualización Correcta: El método
- Vanilla JavaScript (ES6 Classes y Modules).
- Algoritmos de Hashing: Transformación de strings en índices numéricos deterministas.
- Manejo de Colisiones: Resolución de superposiciones cuando dos claves generan el mismo hash.
- Redimensionamiento Dinámico (Growth Logic): Ampliación de capacidad en tiempo de ejecución (Double Capacity).
- Big O Notation: Entendimiento de las operaciones de complejidad constante O(1) que hacen tan eficientes a las Tablas Hash.