Inicio > Cursos > Algoritmos > Hash Tables
AlgoritmosEstructuras de DatosLección 8 de 19

Hash Tables

Las tablas hash (HashMap, Dictionary, Object) son la estructura de datos más universalmente útil para optimizar algoritmos. Funcionan calculando un número hash de la clave y usando ese número como índice en un array interno. Resultado: buscar, insertar o eliminar toma O(1) promedio sin importar cuántos elementos haya.

El "promedio" es importante: en casos de colisión (dos claves con el mismo hash) puede degradarse, pero con buenas funciones hash esto es muy raro.

El patrón más poderoso con tablas hash es la memorización y el conteo de frecuencias. Para saber si un array tiene duplicados: guarda cada elemento en un Set mientras recorres; si ya existe, hay duplicado. Para el problema de la subsecuencia más larga sin duplicados, usa un Map con la posición del último carácter visto.

Para contar frecuencias de palabras en un texto, usa un Map de string a número. Estos patrones convirtentes problemas O(n²) en O(n).

// Hash Map en JavaScript = Map o {}
const frecuencia = new Map();
const palabras = ["hola", "mundo", "hola", "code", "hola"];

for (const p of palabras) {
  frecuencia.set(p, (frecuencia.get(p) || 0) + 1);
}
console.log(frecuencia.get("hola")); // 3

// Problema clásico: Dos Suma (Two Sum)
// Dado array, encuentra índices que sumen al objetivo
function dosSuma(nums, objetivo) {
  const visto = new Map(); // valor → índice
  
  for (let i = 0; i < nums.length; i++) {
    const complemento = objetivo - nums[i];
    if (visto.has(complemento)) {
      return [visto.get(complemento), i];
    }
    visto.set(nums[i], i);
  }
  return [];
}

// Solución naive O(n²) vs hash O(n)
console.log(dosSuma([2, 7, 11, 15], 9)); // [0, 1]

// Agrupar anagramas
function agruparAnagramas(palabras) {
  const grupos = new Map();
  
  for (const p of palabras) {
    const clave = p.split("").sort().join(""); // "eat" → "aet"
    if (!grupos.has(clave)) grupos.set(clave, []);
    grupos.get(clave).push(p);
  }
  
  return [...grupos.values()];
}

console.log(agruparAnagramas(["eat","tea","tan","ate","nat","bat"]));
// [["eat","tea","ate"],["tan","nat"],["bat"]]
Consejo🗝️ Cuando ves un algoritmo O(n²) con búsqueda nested, pregúntate: ¿puedo usar un Map para hacerlo O(n)? La respuesta suele ser sí.
← Heap y Priority QueueAlgoritmos de Ordenamiento →

Practica esta lección

Resuelve los ejercicios del curso de Algoritmos en la app, gratis y con corrección automática.

Empezar a practicar