2. HISTORIA Y ORÍGENES
• El término hash proviene, aparentemente, de
la analogía con el significado de dicha palabra
en el mundo real: picar y mezclar.
• Se cree que H. P. Luhn, empleado de IBM, fue
el primero en utilizar el concepto en un
memorándum fechado en enero de 1953. Su
utilización masiva no fue hasta después de 10
años.
3. TABLAS HASH
• Una tabla hash es una estructura de datos que
asocia llaves o claves con valores.
• La operación principal que soporta de manera
eficiente es la búsqueda: permite el acceso a los
elementos almacenados a partir de una clave
generada
• Funciona transformando la clave con una función
hash en un hash, un número que la tabla hash
utiliza para localizar el valor deseado.
4. TABLAS HASH
• Comparada con otras estructuras de arrays asociadas,
las tablas hash son más útiles cuando se almacenan
grandes cantidades de información.
• Las tablas hash almacenan la información en
posiciones pseudo-aleatorias, así que el acceso
ordenado a su contenido es bastante lento. Otras
estructuras como árboles binarios auto-balanceables
son más rápidos en promedio (tiempo de búsqueda
O(log n)) pero la información está ordenada en todo
momento.
5.
6. TIEMPO DE EJECUCIÓN TABLAS HASH
• Las tablas hash se implementar sobre arrays de una
dimensión, aunque se pueden realizar
implementaciones multi-dimensionales.
• El tiempo es O(1)
• En casos particularmente puede ser O(n).
• Comparada con otras estructuras de arrays asociadas,
las tablas hash son más útiles cuando se almacenan
grandes cantidades de información.
7. FUNCIONAMIENTO
• Las operaciones implementadas en las tablas hash son:
– inserción(llave, valor)
– búsqueda(llave) que devuelve valor
• La mayoría de las implementaciones también incluyen
borrar. También se pueden ofrecer funciones como
iteración en la tabla, crecimiento y vaciado.
• Algunas tablas hash permiten almacenar múltiples
valores bajo la misma clave.
8. FUNCIONAMIENTO
• Para usar una tabla hash se necesita:
– Una estructura de acceso
– Una estructura de datos con una clave
– Una función (hash)
9. OPERACIONES BÁSICAS TABLAS HASH
• Inserción:
• Para almacenar un elemento en la tabla hash se ha de
convertir su clave a un número. Esto se consigue
aplicando la función resumen a la clave del elemento.
• El resultado de la función resumen ha de mapearse al
espacio de direcciones del array que se emplea como
soporte, lo cual se consigue con la función módulo.
• Tras este paso se obtiene un índice válido para la tabla.
10. OPERACIONES BÁSICAS TABLAS HASH
• El elemento se almacena en la posición de la
tabla obtenido en el paso anterior.
• Si en la posición de la tabla ya había otro
elemento, se ha producido una colisión. Este
problema se puede solucionar asociando una lista
a cada posición de la tabla, aplicando otra
función o buscando el siguiente elemento libre.
• Estas posibilidades han de considerarse a la hora
de recuperar los datos.
11. OPERACIONES BÁSICAS TABLAS HASH
• Búsqueda
• Para recuperar los datos, es necesaria la llave.
• El valor obtenido se mapea al espacio de direcciones de la
tabla.
• Si el elemento existente en la posición indicada en el paso
anterior tiene la misma clave que la empleada en la
búsqueda, entonces es el deseado. Si la clave es distinta, se
ha de buscar el elemento según la técnica empleada para
resolver el problema de las colisiones al almacenar el
elemento.
12. FUNCIONES HASH MÁS USADAS
• Hash de División:
• Dado un diccionario D, se fija un número m >=
|D|
• Debe ser primo no cercano a potencia de 2 o
de 10. Siendo k la clave a buscar y h(k) la
función hash, se tiene h(k)=k%m.
13. FUNCIONES HASH MAS USADAS
• Hash de Multiplicación
• Se escoge un tamaño de tabla m >= |D|.
• Número irracional φ (normalmente se usa
1+5^(1/2)/2 o 1-5^(1/2)/2). De este modo se
define h(k)= Suelo(m*Parte fraccionaria(k*φ))
14. RESOLUCIÓN DE COLISIONES
• Si dos llaves generan un hash apuntando al
mismo índice, los registros correspondientes
no pueden ser almacenados en la misma
posición.
15. RESOLUCIÓN DE COLISIONES
• En 1 millón de entradas, hay un 95% de
posibilidades de que al menos una colisión
ocurra antes de alcanzar los 2.500 registros.
• Técnicas Resolución de Colisiones
– Encadenamiento
– Direccionamiento Abierto.
16. RESOLUCIÓN DE COLISIONES
• ENCADENAMIENTO
• En la técnica más simple.
• Cada casilla en el array referencia una lista de los
registros insertados que colisionan en la misma casilla.
• La inserción consiste en encontrar la casilla correcta y
agregar al final de la lista correspondiente. El borrado
consiste en buscar y quitar de la lista.
17. • La técnica de encadenamiento tiene ventajas
sobre direccionamiento abierto. Primero el
borrado es simple y segundo el crecimiento de la
tabla puede ser pospuesto durante mucho más
tiempo dado que el rendimiento disminuye
mucho más lentamente incluso cuando todas las
casillas ya están ocupadas.
• De hecho, muchas tablas hash encadenadas
pueden no requerir crecimiento nunca, dado que
la degradación de rendimiento es lineal en la
medida que se va llenando la tabla.
18. • Las tablas hash encadenadas heredan las
desventajas de las listas ligadas. Cuando se
almacenan cantidades de información
pequeñas, el gasto extra de las listas ligadas
puede ser significativo. También los viajes a
través de las listas tienen un rendimiento de
caché muy pobre.
20. RESOLUCIÓN DE COLISIONES
• DIRECCIONAMIENTO ABIERTO
• Las tablas hash de direccionamiento abierto pueden almacenar los
registros directamente en el array. Las colisiones se resuelven mediante un
sondeo del array, en el que se buscan diferentes localidades del array
(secuencia de sondeo) hasta que el registro es encontrado o se llega a una
casilla vacía, indicando que no existe esa llave en la tabla.
• Las secuencias de sondeo más socorridas incluyen:
– sondeo lineal - en el que el intervalo entre cada intento es constante
(frecuentemente 1).
– sondeo cuadrático - en el que el intervalo entre los intentos aumenta
linealmente (por lo que los índices son descritos por una función cuadrática).
– doble hasheo - en el que el intervalo entre intentos es constante para cada
registro pero es calculado por otra función hash.
21. • El sondeo lineal ofrece el mejor rendimiento
del caché, pero es más sensible al
aglomeramiento
• Doble Hasheo tiene pobre rendimiento en el
caché pero elimina el problema de
aglomeramiento.
• El sondeo cuadrático se sitúa en medio.
22. • Una influencia crítica en el rendimiento de una tabla hash
de direccionamiento abierto es el porcentaje de casillas
usadas en el array.
• Conforme el array se acerca al 100% de su capacidad, el
número de saltos requeridos por el sondeo puede
aumentar considerablemente.
• Una vez que se llena la tabla, los algoritmos de sondeo
pueden incluso caer en un círculo sin fin. Incluso utilizando
buenas funciones hash, el límite aceptable de capacidad es
normalmente 80%.
• Con funciones hash pobremente diseñadas el rendimiento
puede degradarse incluso con poca información, al
provocar aglomeramiento significativo.
24. VENTAJAS E INCONVENIENTES DE LAS
TABLAS HASH
• Una tabla hash tiene como principal ventaja que
el acceso a los datos suele ser muy rápido si se
cumplen las siguientes condiciones:
• Una razón de ocupación no muy elevada (a partir
del 75% de ocupación se producen demasiadas
colisiones y la tabla se vuelve ineficiente).
• Una función resumen que distribuya
uniformemente las claves. Si la función está mal
diseñada, se producirán muchas colisiones.
25. • Necesidad de ampliar el espacio de la tabla si el volumen
de datos almacenados crece. Se trata de una operación
costosa.
• Dificultad para recorrer todos los elementos. Se suelen
emplear listas para procesar la totalidad de los elementos.
• Desaprovechamiento de la memoria. Si se reserva espacio
para todos los posibles elementos, se consume más
memoria de la necesaria; se suele resolver reservando
espacio únicamente para punteros a los elementos.