Implementación del método get en hash table JavaScript

Clase 12 de 29Curso de Estructuras de Datos con JavaScript

Resumen

Aprende a implementar y depurar el método get en una hash table en JavaScript con seguridad y claridad. Verás cómo calcular la address a partir del key, recorrer el bucket correcto y devolver el value adecuado incluso cuando hay colisiones. Todo con ejemplos simples y código listo para usar.

¿Qué resuelve get en una hash table?

El método get permite recuperar el value asociado a un key. La idea central: el hash es determinista, por lo que un mismo key siempre genera la misma address. Con esa address accedemos al bucket (un array de arrays), donde cada elemento es una pareja [key, value].

  • Hash determinista: mismo key, misma address.
  • Buckets: listas internas donde pueden convivir varias parejas por colisión.
  • Búsqueda puntual: se recorre solo el bucket objetivo, no toda la estructura.

Así, get ubica el bucket correcto y hace una búsqueda lineal hasta encontrar el key y devolver su value.

¿Cómo implementar get con manejo de colisiones en JavaScript?

La implementación se basa en cinco pasos: calcular la address, obtener el bucket, validar su existencia, recorrer con for y comparar el key en cada sublista. Si no hay coincidencia, se retorna undefined.

class HashTable {
  constructor(size) {
    this.data = new Array(size);
  }

  hash(key) {
    // implementación existente del hash.
  }

  set(key, value) {
    // implementación existente del set.
  }

  get(key) {
    const address = this.hash(key);
    const currentBucket = this.data[address];

    if (currentBucket) {
      for (let i = 0; i < currentBucket.length; i++) {
        if (currentBucket[i][0] === key) {
          return currentBucket[i][1];
        }
      }
    }

    return undefined;
  }
}
  • Calcula la address con this.hash(key).
  • Toma el bucket con this.data[address].
  • Si el bucket existe, recórrelo con un loop for.
  • Compara currentBucket[i][0] === key en cada pareja [key, value].
  • Devuelve currentBucket[i][1] al encontrar coincidencia.
  • Si no hay coincidencia, retorna undefined.

¿Cómo recorre el loop for el bucket?

Cada bucket es una lista de listas. El índice i apunta a una sublista. En cada iteración se valida: si el elemento cero de esa sublista ([0]) es el key buscado, se regresa el elemento uno ([1]), que es el value. Si no, el loop continúa.

¿Qué retorna si el key no existe?

Si el bucket está vacío o no se encontró coincidencia durante el recorrido, la función regresa undefined. Esta señal es clara para indicar ausencia del elemento.

¿Cómo validar y probar con ejemplos usando set y get?

Primero, crea una instancia con un tamaño fijo para visualizar los buckets y posibles colisiones. Por ejemplo, 50 buckets para tener un espacio limitado y notar cuándo varios keys caen en la misma address.

const table = new HashTable(50);

table.set('Diego', 23);     // ejemplo ilustrativo.
table.set('Mariana', 98);   // puede colisionar con Diego.
table.set('Adriana', 2000); // otro par key-value.

console.log(table.get('Diego'));   // 23
console.log(table.get('Mariana')); // 98
console.log(table.get('Adriana')); // 2000
console.log(table.get('X'));       // undefined
  • Si hay colisión, el bucket tendrá varias parejas [key, value] y el for localizará la correcta.
  • La estructura interna luce así: [['Diego', 23], ['Mariana', 98]]. Cada sublista es una pareja.
  • La búsqueda es lineal dentro del bucket, lo que simplifica el manejo de colisiones.

¿Qué retos siguen: delete y keys?

  • Implementa delete(key): borra la pareja completa [key, value] al recibir un key.
  • Implementa keys(): devuelve todos los keys existentes en la hash table.

Comparte tu solución en comentarios: será útil ver distintos enfoques para estas operaciones y cómo optimizas el recorrido por buckets.