Una tabla hash es una estructura de datos que permite realizar operaciones de recuperación, eliminación e inserción de elementos de forma rápida mediante el uso de funciones hash que mapean claves a posiciones de una tabla. Las tablas hash son útiles para implementar diccionarios y otras estructuras asociativas, pero pueden sufrir colisiones cuando múltiples claves son mapeadas a la misma posición.
2. Introducción
Una tabla hash es una estructura de datos
que soporta la recuperación, eliminación e
inserción de elementos de forma muy
rápida.
Mtl Lourdes Cahuich 2
3. Tabla hash
Una tabla hash que está apropiadamente
configurada para los elementos que
contiene, puede realizar estas
operaciones en un tiempo fijo, a diferencia
de otras estructuras de datos y algoritmos
que ya hemos examinado
Mtl Lourdes Cahuich 3
4. Tabla hash
Una tabla hash es un tipo de mapa y los
mapas son estructuras asociativas.
Conceptualmente, las estructuras de
datos asociativas almacenan datos en
pares de valor-clave.
Mtl Lourdes Cahuich 4
5. Tabla hash
Esto significa que por cada valor
almacenado existe una clave
correspondiente usada para acceder el
valor.
Un ejemplo real de una estructura de
datos asociativa es un diccionario.
En un diccionario, los datos están
almacenados en pares de valor-clave.
Mtl Lourdes Cahuich 5
6. Tabla hash
Las claves son las palabras, y los valores
son las definiciones.
Para acceder a una definición, debemos
usar la clave correspondiente
Mtl Lourdes Cahuich 6
7. Diferencia entre mapas y conjuntos
hash
Los mapas hash y los conjuntos hash son
dos tipos diferentes de tablas hash.
Los mapas hash son estructuras
asociativas que almacenan pares de
valores-clave, mientras que los conjuntos
hash son estructuras que mantienen el
registro de la pertenencia de elementos
dentro de una colección
Mtl Lourdes Cahuich 7
8. Los conjuntos hash no asocian claves a
los valores, simplemente almacenan un
colección de claves.
Por ejemplo, una lista de palabras
comúnmente mal deletreadas, puede ser
almacenada usando un conjunto hash.
Mtl Lourdes Cahuich 8
9. En este ejemplo, no hay un mapeo o
asignación de una clave a un valor como
en el ejemplo del diccionario.
Cada palabra sirve solamente como una
clave.
Por lo tanto, un conjunto hash es usado
para reportar si existe o no una palabra en
la lista.
Mtl Lourdes Cahuich 9
10. Funciones Hash
Las operaciones que usan tablas hash
son eficientes porque la posición de un
valor almacenado puede ser calculada
usando la clave.
Las tablas hash son implantadas por lo
general, como un arreglo de valores.
Mtl Lourdes Cahuich 10
11. Funciones hash
Una función hash es usada para asignar
una clave a un índice dentro de este
arreglo.
Este índice está donde está almacenado
el valor correspondiente a la clave.
Mtl Lourdes Cahuich 11
12. Tablas hash
Otros algoritmos de búsqueda, como la
búsqueda lineal o binaria, no pueden
asignar una clave a la posición de su valor
tan rápidamente como las tablas hash.
Mtl Lourdes Cahuich 12
13. Usos tablas hash
Estos algoritmos deben desarrollar más
comparaciones para encontrar el índice
del valor almacenado.
El tiempo que toma esta búsqueda
aumenta conforme aumenta el número de
elementos almacenados.
Mtl Lourdes Cahuich 13
15. Función hash
En esta figura, la función hash genera un
índice basado en el dígito colocado en el
extremo derecho del valor ASCII de la
segunda letra del apellido de la persona.
Mtl Lourdes Cahuich 15
16. Función y tabla hash
Por ejemplo, en el nombre quot;Hanson, Bobquot;,
la segunda letra es una quot;aquot;.
El valor ASCII de quot;aquot; es 97.
El dígito colocado en el extremo derecho
de 97 es 7.
Por lo tanto, el registro para quot;Hanson,
Bobquot; es almacenado en el índice 7 de la
tabla hash.
Mtl Lourdes Cahuich 16
18. Función y tabla hash
La tabla hash en la figura anterior muestra
cada nombre en su posición asignada.
La ventaja de una tabla hash es que para
encontrar una entrada, uno sólo tiene que
aplicar la función hash a la clave
Mtl Lourdes Cahuich 18
19. Función y tabla hash
Un método popular usado para implantar
una función hash es el método de división.
Como todas las funciones hash, el método
de división asigna una clave a un índice
dentro de la tabla hash.
Mtl Lourdes Cahuich 19
20. La implantación del método de división
involucra la conversión de una clave a una
variable de tipo unsigned int.
Luego, este valor es dividido entre el
tamaño de la tabla hash.
Mtl Lourdes Cahuich 20
21. class hash_function {
public:
unsigned int mm;
hash_function(unsigned int m = 6151)
: mm(m) {}
unsigned int operator()(const string& s)
const {
unsigned int res = 0;
for (int i = 0; i < s.size(); i++) {
res = res * mm + s[i];
}
return res;
}
};
Mtl Lourdes Cahuich 21
22. Desventajas tablas hash
Cuando consideramos que existen
muchas más claves que posiciones dentro
de una tabla hash, surge un problema.
Esto significa que una función hash puede
potencialmente asignar dos o más claves
distintas al mismo índice.
Mtl Lourdes Cahuich 22
23. Colisiones en tablas hash
Las implantaciones de tablas hash son
complicadas por el hecho de que deben
manejar colisiones potenciales.
Estos mecanismos para manejar
colisiones se discuten a detalle en el
capítulo 20 del libro de texto de Weiss.
Básicamente, las colisiones decrementan
el desempeño de las operaciones de la
tabla hash
Mtl Lourdes Cahuich 23
24. Colisiones en tablas hash
La mejor manera de reducir el número de
colisiones, y por ende, incrementar la
eficiencia de la tabla hash, es usar una
buena función hash.
Una buena función hash distribuye
equitativamente la asignación de claves a
través de las posiciones de la tabla hash.
Mtl Lourdes Cahuich 24
25. Memoizing: Una Aplicación de las
Tablas Hash
Cuando es computacionalmente costoso
calcular el valor de una función y = f(x),
puede ser una buena idea almacenar el
valor para un uso futuro.
Mtl Lourdes Cahuich 25
26. Memorizing
En otras palabras, calculamos f(x) sólo la
primera vez que el valor de la función de
esta entrada particular x es requerida, y
luego almacenamos ( x, f(x) ) en una tabla
hash.
Cualquier solicitud futura para f(x)
resultará en una búsqueda en la tabla y
será mucho más rápido el recálculo.
Mtl Lourdes Cahuich 26
27. Memorizing
Esta técnica es llamada memoizing
Aquí se muestra la estructura de una
función memoized
Mtl Lourdes Cahuich 27
28. int f_memo(int x) {
if ( there is an entry (x,y) in
hash table ) {
return y;
}
else {
compute y = f(x) directly
store (x,y) in table
return y;
}
}
Mtl Lourdes Cahuich 28
29. Memorizing
Debido a que la tabla hash tiene que
persistir entre las llamadas a la función,
sería natural organizarla como una clase
que sobrecarga el operador ().
Mtl Lourdes Cahuich 29