meskeIA

Hashing y Colisiones

Visualiza tablas hash, funciones hash y estrategias de resolución de colisiones

© 2026 meskeIA© 2026
Tamaño m (primo)
Función hash
Resolución de colisiones

Tabla hash — m = 11

0
1
2
3
4
5
6
7
8
9
10
Elementos (n)0
Tamaño (m)11
Colisiones0
Factor de carga α0.00
Factor de carga α = n/mα = 0.00
Vacía Ocupada Colisión Insertando

Guía de Tablas Hash y Colisiones

Funciones hash, resolución de colisiones y factor de carga

Una tabla hash almacena pares clave-valor en posiciones calculadas por una función hash h(k). Cuando dos claves producen el mismo índice ocurre una colisión, que se resuelve con encadenamiento (listas enlazadas en cada celda) o sondeo lineal (buscar el siguiente hueco disponible). Un buen factor de carga α < 0,75 garantiza O(1) promedio en búsquedas e inserciones.

Comparativa de Estrategias

ResoluciónVentajaDesventajaRendimiento promedioSensible a αUso real
Encadenamiento separadoSin límite de cargaMemoria extra por punterosO(1 + α)ModeradoJava HashMap, Python dict
Sondeo linealCaché-friendlyClustering primarioO(1/(1-α))AltoRedis, TablaHash C++
Sondeo cuadráticoMenos clusteringClustering secundarioO(1/(1-α))AltoPostgreSQL
Doble hashingDistribución uniformeMás costoso de calcularO(1/(1-α))Muy altoCuckoo hashing
Cuckoo hashingWorst-case O(1)Rehash frecuenteO(1) garantizadoExtremoRedes (packet lookup)
Árbol rojo-negro (alternativa)O(log n) garantizadoMás lento en promedioO(log n)NoJava TreeMap, std::map

Escenarios de Uso

Diccionario sin colisiones

m = 17, 8 palabras cortas, función djb2 → distribución casi perfecta, 0 colisiones. El factor de carga α ≈ 0,47 mantiene O(1) garantizado.

Prueba: set «programación» con m=17 y djb2.
Alta carga (α > 0,75)

m = 7, insertar 8 palabras → α ≈ 1,14 con sondeo lineal o cadenas largas. Las colisiones crecen exponencialmente y el tiempo de búsqueda se degrada.

Prueba: cualquier set con m=7, insertar todas.
Clustering en sondeo lineal

m = 11, palabras con hashes consecutivos → sondeo lineal agrupa elementos en bloques («clustering primario»), degradando búsquedas en esa zona.

Prueba: set «nombres» con m=11 y sondeo lineal.
Ventaja del encadenamiento

m = 7, insertar 10 palabras → con encadenamiento la tabla funciona aunque α > 1; con sondeo lineal se llena y necesitaría rehash para continuar.

Compara encadenamiento vs sondeo con m=7, todas las palabras.

Preguntas Frecuentes

¿Por qué usar números primos como tamaño de tabla?

Los tamaños primos reducen la periodicidad de las colisiones al aplicar mod. Si m tiene divisores comunes con los hashes generados, ciertos índices nunca se usan y otros se sobrecargan. Con m primo, la función mod distribuye los valores más uniformemente.

¿Qué ocurre cuando α > 1 con sondeo lineal?

La tabla está completamente llena: cualquier nueva inserción entraría en bucle infinito buscando un hueco que no existe. Por eso, las implementaciones reales hacen rehashing automático cuando α supera un umbral (típicamente 0,75), creando una tabla mayor y reinsertando todos los elementos.

¿Python usa tablas hash?

Sí. dict y set en Python son tablas hash con open addressing y sondeo cuadrático modificado. Desde Python 3.6, los dicts también preservan el orden de inserción gracias a una estructura auxiliar compacta.

¿Cómo afecta la función hash a las colisiones?

Una función hash pobre (como suma de caracteres para cadenas cortas) agrupa muchas claves en pocos índices. djb2 aplica multiplicaciones que dispersan mejor los valores. Una buena función hash hace que la distribución de índices sea aproximadamente uniforme.

¿Qué es el rehashing?

Cuando α supera un umbral (0,75 típico), se crea una tabla nueva de tamaño mayor (generalmente el siguiente primo después de 2×m) y se reinsertan todos los elementos usando la misma función hash con el nuevo m. Esta operación es O(n) pero amortizada resulta O(1) por inserción.

Cómo Usar el Simulador — Paso a Paso

1
Selecciona tamaño m y función hash

Empieza con m = 11 y djb2: es el tamaño y función más equilibrados para ver la distribución.

2
Elige un conjunto de palabras predefinido

El conjunto «nombres» o «programación» dan buen contraste de colisiones según la función elegida.

3
Pulsa «Insertar siguiente» y observa

Cada inserción muestra el cálculo paso a paso del índice hash debajo de la tabla. Las celdas se colorean según el estado.

4
Cambia a sondeo lineal y repite

Limpiar la tabla, cambiar a sondeo lineal e insertar el mismo conjunto revela diferencias de distribución.

5
Aumenta la carga hasta α > 0,75

Usa m = 7 e inserta todas las palabras para ver cómo crecen las colisiones y se degrada el rendimiento.

Consejos Prácticos

Elige siempre m primo

Un tamaño primo reduce colisiones porque ningún divisor común «agrupa» los hashes.

djb2 es rápido y fiable

Función hash simple y veloz usada en compiladores y shells UNIX. Buen equilibrio distribución/coste.

α es el indicador clave

El factor de carga α = n/m es el mejor indicador del rendimiento. Mantén α < 0,75.

Rehash antes de saturar

Las implementaciones reales hacen rehash automático al superar α = 0,75 para mantener O(1).

Errores frecuentes con tablas hash
  • Usar m potencia de 2 con hash mod — aumenta colisiones si la función no distribuye bien los bits bajos.
  • Olvidar que sondeo lineal puede quedar en bucle infinito con α = 1: siempre implementar un contador de intentos o rehash preventivo.
  • Comparar hashes directamente sin aplicar mod m — los valores raw son enormes y no corresponden a índices válidos de la tabla.
  • Asumir O(1) en worst case — solo es O(1) en caso promedio; con mala función hash o α elevado degenera a O(n).
  • No hacer rehash cuando α crece — la tabla se degrada progresivamente hasta ser O(n) en búsquedas, perdiendo la ventaja de la estructura.

Apps relacionadas