Tabla de picadillo


En informática , una tabla hash ( mapa hash ) es una estructura de datos que implementa un tipo de datos abstracto de matriz asociativa , una estructura que puede asignar claves a valores . Una tabla hash usa una función hash para calcular un índice , también llamado código hash , en una matriz de cubos o ranuras , a partir de los cuales se puede encontrar el valor deseado. Durante la búsqueda, se aplica un hash a la clave y el hash resultante indica dónde se almacena el valor correspondiente.

Idealmente, la función hash asignará cada clave a un cubo único, pero la mayoría de los diseños de tablas hash emplean una función hash imperfecta, lo que podría causar colisiones hash donde la función hash genera el mismo índice para más de una clave. Por lo general, estas colisiones se adaptan de alguna manera.

En una tabla hash bien dimensionada, el costo promedio (número de instrucciones ) para cada búsqueda es independiente del número de elementos almacenados en la tabla. Muchos diseños de tablas hash también permiten inserciones y eliminaciones arbitrarias de pares clave-valor , a un costo promedio constante ( amortizado [2] ) por operación. [3] [4]

En muchas situaciones, las tablas hash resultan ser, en promedio, más eficientes que los árboles de búsqueda o cualquier otra tabla de estructura de búsqueda. Por esta razón, se utilizan ampliamente en muchos tipos de software de computadora , particularmente para matrices asociativas , indexación de bases de datos , cachés y conjuntos .

La ventaja de usar hash es que la dirección de la tabla de un registro se puede calcular directamente desde la clave. El hash implica que una función , cuando se aplica a una clave , produce un hash . Sin embargo, dado que podría ser potencialmente grande, el resultado hash debe asignarse a entradas finitas en la tabla hash, o ranuras, se pueden usar varios métodos para asignar las claves al tamaño de la tabla hash . El método más común es el método de división, en el que se utiliza aritmética modular para calcular la ranura. [5] : 110 

Un requisito básico es que la función debe proporcionar una distribución uniforme de valores hash. Una distribución no uniforme aumenta el número de colisiones y el costo de resolverlas. La uniformidad a veces es difícil de asegurar por diseño, pero puede evaluarse empíricamente usando pruebas estadísticas, por ejemplo, una prueba de chi-cuadrado de Pearson para distribuciones uniformes discretas. [6] [7]


Una pequeña guía telefónica como tabla hash
Colisión de hash resuelta mediante encadenamiento independiente
Colisión de hash mediante encadenamiento independiente con registros principales en la matriz de cubos.
Colisión hash resuelta mediante direccionamiento abierto con sondeo lineal (intervalo = 1). Tenga en cuenta que "Ted Baker" tiene un hash único, pero sin embargo chocó con "Sandra Dee", que previamente había chocado con "John Smith".
Este gráfico compara el número medio de fallos de caché de CPU necesarios para buscar elementos en tablas hash grandes (que superan con creces el tamaño del caché) con el encadenamiento y el sondeo lineal. El sondeo lineal funciona mejor debido a una mejor localidad de referencia , aunque a medida que la tabla se llena, su rendimiento se degrada drásticamente.