Una tabla hash almacena pares clave-valor aplicando una función hash a cada clave para convertirla en un índice de un arreglo. Eso permite que la tabla salte cerca de la ubicación correcta en lugar de recorrer uno por uno todos los elementos almacenados.
Por eso las tablas hash suelen estar cerca de para búsqueda, inserción y eliminación en promedio. La condición importa: la función hash debe distribuir las claves razonablemente bien, y la tabla aún necesita una regla para manejar colisiones.
Qué hace una tabla hash
Una tabla hash almacena pares clave-valor como "name" -> "Ada" o 42 -> "blue". Tiene dos partes principales:
- un arreglo de posiciones o cubetas
- una función hash que asigna cada clave a una de esas posiciones
Si el arreglo tiene posiciones, puedes pensar en la función hash como algo que produce un índice de a .
Para un ejemplo pequeño con enteros, la regla podría ser
Entonces la clave va a la posición porque .
Las funciones hash reales se diseñan con más cuidado, especialmente para cadenas y conjuntos de datos más grandes. Pero la idea central sigue siendo la misma: calcular un índice rápidamente y luego revisar el elemento almacenado allí.
Por qué las colisiones hash son inevitables
Una colisión ocurre cuando dos claves distintas se asignan a la misma posición.
Eso es normal porque la tabla suele tener menos posiciones que la cantidad de claves posibles. Con
las claves , y se asignan todas a la posición . Así que, aunque la función esté funcionando exactamente como fue definida, la tabla igual tiene un conflicto que resolver.
Por lo tanto, una tabla hash no promete una posición única para cada clave. Promete una forma rápida de acotar la búsqueda, siempre que las colisiones se manejen bien.
Ejemplo resuelto: una tabla, una colisión
Supón que una tabla tiene posiciones y usa
Inserta las claves , y .
Primero, va a la posición porque .
Después, también se asigna a la posición , así que ocurre una colisión.
Luego, va a la posición , así que esa inserción no colisiona.
El patrón útil es siempre el mismo:
- Aplica hash a la clave.
- Ve a la posición sugerida.
- Si ya hay allí una clave diferente, aplica la regla de colisión.
Una vez que ese patrón queda claro, las dos estrategias principales para colisiones son más fáciles de entender.
Encadenamiento vs. direccionamiento abierto
El encadenamiento mantiene una cubeta en cada posición
En el encadenamiento, cada posición almacena una pequeña colección de entradas en lugar de solo una.
Si y se asignan ambos a la posición , la cubeta podría almacenar
Para encontrar la clave , la tabla salta a la cubeta y compara solo las entradas de esa cubeta.
El encadenamiento es conceptualmente simple, y la eliminación suele ser más fácil que en el direccionamiento abierto. La desventaja es que las cubetas largas hacen que las operaciones sean más lentas.
El direccionamiento abierto se mantiene dentro del arreglo
En el direccionamiento abierto, cada posición del arreglo contiene como máximo una entrada. Si la posición inicial está ocupada, la tabla prueba otras posiciones según una regla fija.
Una regla común es el sondeo lineal: si la posición está ocupada, prueba la , luego la , luego la , volviendo al inicio si hace falta.
Esto evita listas de cubetas separadas, pero las posiciones ocupadas cercanas pueden acumularse en grupos. Otro detalle es que la búsqueda y la eliminación deben respetar la misma regla de sondeo usada durante la inserción.
Cuándo es una afirmación razonable
Las tablas hash suelen describirse como estructuras con búsqueda, inserción y eliminación en en promedio. Esa afirmación sobre el caso promedio depende de ciertas condiciones:
- la función hash distribuye las claves razonablemente bien
- el factor de carga se mantiene bajo control
- la estrategia de colisiones está implementada correctamente
El factor de carga es la razón
Si la tabla se llena demasiado, las colisiones se vuelven más frecuentes y el rendimiento empeora. Por eso muchas implementaciones redimensionan el arreglo a medida que se llena.
El rendimiento en el peor caso aún puede degradarse hacia si demasiadas claves se acumulan en la misma zona.
Errores comunes con las tablas hash
Suponer que las colisiones significan que la función hash falló
No es así. Las colisiones son esperadas. La verdadera pregunta es si la tabla las maneja de forma eficiente.
Tratar como si fuera incondicional
suele ser una afirmación sobre el caso promedio, no una promesa para toda entrada y en todo momento.
Confundir este hashing con el cifrado
Una función hash en el contexto básico de estructuras de datos trata principalmente de indexación rápida, no de secreto. Son objetivos distintos.
Olvidar comparar la clave real
Dos claves pueden compartir el mismo resultado hash. Después de llegar a la cubeta correcta o a la posición de sondeo, la tabla todavía tiene que comprobar si la clave realmente coincide.
Cuándo se usan las tablas hash
Las tablas hash se usan siempre que importa una búsqueda rápida basada en claves. Algunos ejemplos comunes incluyen diccionarios, tablas de símbolos, cachés, indexación y conteo de frecuencias en datos.
Son una muy buena opción cuando la búsqueda exacta por clave es más importante que mantener los elementos en orden. Si necesitas recorrido ordenado, consultas por rango o valores más cercanos, puede ser mejor otra estructura.
Prueba un ejemplo similar de colisiones
Toma un arreglo pequeño con posiciones y usa . Inserta algunas claves como , , y . Luego resuelve las colisiones una vez con encadenamiento y otra con sondeo lineal.
Ese único ejercicio vuelve concreta la idea principal muy rápido: las colisiones son inevitables, y la regla de colisión cambia cómo se comporta la tabla. Si quieres un siguiente paso útil, prueba tu propia versión con un tamaño de tabla distinto y observa cómo cambian las colisiones.
¿Necesitas ayuda con un problema?
Sube tu pregunta y obtén una solución verificada, paso a paso, en segundos.
Abrir GPAI Solver →