Implementación de Hash Table en JavaScript: Método Set
Clase 11 de 29 • Curso de Estructuras de Datos con JavaScript
Resumen
¿Cómo se construye una hash table en JavaScript?
Las hash tables son una estructura de datos poderosa y versátil utilizada ampliamente en programación. Son esencialmente un objeto que genera un hash para almacenar y buscar datos de manera eficiente. En esta guía, exploraremos cómo construir una hash table en JavaScript, resaltando pasos claves y conceptos esenciales.
¿Por dónde empezamos?
El primer paso en la creación de una hash table es definir la clase en JavaScript. Dentro de esta clase, debemos incluir un constructor que inicialice el tamaño de la hash table. Esto se traduce en el número de "buckets" o compartimientos que estarán disponibles para almacenar datos. Aquí un ejemplo de cómo se ve esto en código:
class HashTable {
constructor(size) {
this.data = new Array(size);
}
}
En este caso, el array creado tiene 50 espacios, permitiendo guardar datos de manera eficiente.
¿Cómo se implementa una función hash?
La función hash es una pieza crítica en la generación de un identificador único para cada dato que queramos almacenar. Aunque, en un proyecto real, rara vez se implementa una función hash desde cero, para efectos de aprendizaje, se puede construir una simple que genere un número aleatorio relacionado al key
ingresado:
hashFunc(key) {
let hash = 0;
for (let i = 0; i < key.length; i++) {
hash = (hash + key.charCodeAt(i) * i) % this.data.length;
}
return hash;
}
Es importante recordar que, en la mayoría de las aplicaciones, se usan funciones hash ya existentes que son robustas y optimizadas.
¿Cómo se agregan elementos en la hash table?
El método set
es clave para agregar elementos a la hash table. Esta función toma dos parámetros importantes: el key
y el value
. Utiliza el key
para generar un hash que indicará la ubicación del value
dentro de la hash table:
set(key, value) {
const address = this.hashFunc(key);
if (!this.data[address]) {
this.data[address] = [];
}
this.data[address].push([key, value]);
return this.data;
}
Este método maneja las colisiones eficientemente. Si dos keys distintas generan el mismo hash, el value se ubica en una sublista del "bucket" correspondiente, preservando ambas entradas.
¿Qué sucede durante una colisión?
Una colisión ocurre cuando dos keys distintas generan el mismo hash. En este escenario, es crucial manejar la colisión para evitar la pérdida de datos. Al implementar el uso de listas encadenadas (sublistas dentro de un bucket), nos aseguramos de que cada entrada se preserve adecuadamente:
set(key, value) {
const address = this.hashFunc(key);
if (!this.data[address]) {
this.data[address] = [];
}
this.data[address].push([key, value]);
}
De esta manera, cada bucket puede contener múltiples pares key-value, garantizando que la información no se sobrescriba.
¿Cómo se comporta al interactuar con la terminal de JavaScript?
En el entorno de desarrollo, podemos comprobar el funcionamiento de nuestra hash table. Iniciamos probando si los buckets se crean correctamente:
const myHashTable = new HashTable(50);
Posteriormente, almacenamos datos ejemplificativos:
myHashTable.set('Diego', 1990);
myHashTable.set('Mariana', 1998);
myHashTable.set('Alejandra', 2000);
Verificamos la integridad de nuestro sistema observando que cada dato se almacena sin ser sobrescrito. Ante colisiones, vemos que el mecanismo de listas encadenadas funciona perfectamente.
Ahora, cuentas con una sólida comprensión de cómo construir una hash table en JavaScript. A medida que avances, comprobarás cómo conceptos como la eficiencia en el almacenamiento y el manejo de colisiones son aplicables en múltiples contextos en el desarrollo de software. ¡Sigue aprendiendo y experimentando!