4. 4
Conceptos básicos
La idea…
• Tener una estructura de datos con una
complejidad temporal de O(1) en el acceso a
los datos
▫ Insertar Tablas Hash
▫ Buscar
▫ Borrar
• Las demás operaciones pueden ser O(n)
▫ Recorrer
▫ Comparar
▫…
5. 5
Conceptos básicos
Función hash
• Es una operación que consiste en transformar
una clave en una posición dentro de la tabla
Hash
▫ Enteros 0 elemento1
▫ Cadenas de texto 1 elemento2
2 elemento3
f(clave):
3 elemento4
4 elemento5
¿Cuál es el problema?
Que es posible que diferentes claves apunten a la
misma posición de la tabla provocando COLISIONES
7. 7
Protección activa. Función hash básica
Función hash para claves enteras
• Buena opción: f(c) = c % B, siendo c la clave y B el
tamaño de la tabla
• Colisiones: n / B, siendo n el número de elementos y B el tamaño de la
tabla
Ejercicio 1: ¿Cuál podría ser un buen tamaño para una tabla hash cuyos
elementos van a tener las siguientes claves?
2, 3, 1, 0
8. 8
Protección activa. Función hash para cadenas I
Función hash básica para claves cadena
• Hay que convertir la cadena a un valor numérico
y luego aplicarle la función hash para claves
enteras
▫ P.e., utilizando el código ASCII de cada carácter
Ejercicio 2: Si la clave utilizada en una tabla hash tiene una longitud de 10
caracteres codificados en código ASCII extendido, ¿cuál es el rango de
valores que puede tener la clave numérica de la función f?
¿Cuál es el problema?
9. 9
Protección activa. Función hash para cadenas I
Función hash básica para claves cadena
Ejercicio 3: Si se introduce una clave “Puerta”, utilizando la tabla de
códigos ASCII anterior, ¿cuál sería la clave numérica correspondiente?
Ejercicio 4: Para una tabla hash de tamaño 8009 (nº primo), ¿en qué
posición de la tabla se colocaría el elemento de clave “Puerta”?
10. 10
Protección activa. Función hash para cadenas II
Asignación de pesos para incrementar el rango
• Una ponderación típica es 272 i
• siendo i la posición del carácter en la cadena
Letra Código ASCII Código ponderado
P 80 80 * 272 = 58320
u 117 117 * 271 = 3159
¿Cuál es el problema?
e 101 101 * 270 = 101
r 114
t 116
a 97
TOTAL: 625 61580
11. 11
Protección activa. Función hash para cadenas III
Asignación de pesos para incrementar el rango
• Se puede optimizar la multiplicación utilizando como peso 32
Letra Código ASCII Código ponderado Código ponderado (32)
P 80 80 * 272 = 58320 80 * 325 = 2684354560
u 117 117 * 271 = 3159 117 * 324 = 122683392
e 101 101 * 270 = 101 101 * 323 = 3309568
r 114 114 * 322 = 116736
t 116 116 * 321 = 3712
a 97 97 * 320 = 97
TOTAL: 625 61580 2810468065
12. 12
Protección activa. Función hash para cadenas IV
Asignación de pesos para incrementar el rango
• Se puede minimizar el nº de multiplicaciones utilizando la
Regla de Horner
P*325 + u*324 + e*323 + r*322 + t*321 + a*320
Ejercicio 5: ¿Cómo se representaría el polinomio correspondiente al
código ponderado con peso 32 para convertir la clave “Puerta” mediante la
Regla de Horner?
14. 14
Protección pasiva. Tablas hash abiertas
Concepto
• Varios elementos comparten la misma posición de la tabla
hash
▫ P.e., cada posición de la tabla es a su vez una lista o un árbol
• Factor de carga (Load Factor) = n / B, siendo n el número
de elementos y B el tamaño de la tabla
▫ Lo recomendable es que FC <= 1
Ejercicio 6: ¿Cuál es el factor de carga de la siguiente tabla hash?
15. 15
Protección pasiva. Tablas hash abiertas
Ejercicio 7: Suponiendo que tenemos una tabla hash abierta (cada
posición de la tabla es una lista) de 13 elementos, muestra gráficamente
cómo evolucionaría la tabla si se introducen en ella elementos con las
siguientes claves:
1, 10, 15, 20, 7, 13, 3, 2, 4, 6, 8, 18, 11, 12, 14, 26, 65, 39, 40
¿Cuál es el factor de carga de la tabla? ¿Es bueno?
16. 16
Protección pasiva. Tablas hash cerradas
Concepto
• Cada posición sólo tiene cabida para un
elemento
▫ Si se detecta una colisión, se buscan posiciones
próximas
• Técnicas de búsqueda de posiciones próximas
▫ Exploración lineal
▫ Exploración cuadrática
▫ Dispersión doble
17. 17
Protección pasiva. Tablas hash cerradas
Exploración lineal
• Se modifica la función de dispersión
▫ f(c) = c % B pasa a ser f(c) = (c + i) % B, siendo i = 0, 1,
2, 3, 4,…
Ejercicio 8: Suponiendo que tenemos una tabla hash cerrada de 7
elementos, muestra gráficamente cómo evolucionaría la tabla si se
introducen en ella elementos con las siguientes claves:
4, 10, 12, 3, 17, 15, 14
▫ Lo recomendable es que FC <= 0,5 debido a los agrupamientos
18. 18
Protección pasiva. Tablas hash cerradas
Exploración lineal
• La existencia de agrupamientos provoca problemas
▫ Cuando se busca un elemento que está en un agrupamiento hay que
recorrer todos los elementos del agrupamiento hasta que se encuentra
▫ Lógicamente, cuando se encuentra una posición vacía no se sigue
buscando (podría ser una complejidad O(n)) y se detiene el algoritmo
Buscando elemento con clave 17
0 17
1 15 (17 + 0) % 7 = 3
2 14 (17 + 1) % 7 = 4
3 10 (17 + 2) % 7 = 5
4 4
(17 + 3) % 7 = 6
5 12
6 3 (17 + 4) % 7 = 0
…pero, ¿y si se hubiera borrado algún elemento del agrupamiento?
19. 19
Protección pasiva. Tablas hash cerradas
Exploración lineal – borrado perezoso
• No eliminar un elemento hasta que se introduce otro
• Simplemente, se marca
▫ Para insertar se considera que la posición está libre
▫ Para buscar se considera que la posición está ocupada
20. 20
Protección pasiva. Tablas hash cerradas
Exploración cuadrática
• Se modifica la función de dispersión
▫ f(c) = (c + i) % B pasa a ser f(c) = (c + i2) % B,
siendo i = 0, 1, 2, 3, 4,…
Ejercicio 9: Suponiendo que tenemos una tabla hash cerrada de 7
elementos, muestra gráficamente cómo evolucionaría la tabla si se
introducen en ella elementos con las siguientes claves (exploración
cuadrática):
4, 10, 12, 17, 3
▫ Soluciona el problema de los agrupamientos primarios pero…
21. 21
Protección pasiva. Tablas hash cerradas
Dispersión doble
• Se modifica la función de dispersión
▫ f(c) = (c + i2) % B pasa a f(c) = (c + i * h2(c)) % B, siendo i = 0, 1, 2,
3, 4,…
▫ h2(c) es la función de cálculo de salto. Se recomienda h2(c) = R – c % R, siendo R el número
primo antecesor de B
Ejercicio 10: Suponiendo que tenemos una
tabla hash cerrada de 7 elementos, muestra
gráficamente cómo evolucionaría la tabla si se
introducen en ella elementos con las siguientes
claves (dispersión doble):
4, 10, 12, 17, 3, 5, 7
▫ Soluciona los agrupamientos y el nº
de intentos es bajo pero…
23. 23
Redispersión
Concepto
• Aumentar el tamaño en función del FC
▫ Tablas hash abiertas rendimiento decrece si FC > 1
▫ Tablas hash cerradas se paraliza si FC > 0,5
• Se busca un nuevo valor B
▫ El primo inmediatamente superior al tamaño doble del original
▫ Se recorren los elementos y se añaden a la nueva tabla
Ejercicio 11: Suponiendo que tenemos una tabla hash cerrada de 5
elementos, muestra gráficamente cómo evolucionaría la tabla si se
introducen en ella elementos con las siguientes claves:
4, 10, 21, 9, 15, 3, 17, 1, 8, 26
Utiliza dispersión doble para insertar elementos y exploración cuadrática
en caso que sea necesario redispersar elementos en función del FC
24. 24
Redispersión inversa
Ejercicio 12: Suponiendo que tenemos una tabla hash cerrada de 23 elementos, y que
Concepto
inicialmente en la tabla hay los elementos con clave: 1, 2, 10, 11, 12, 13, 15, 16, 17, 19, muestra
gráficamente cómo evolucionaría la tabla (y el FC) si se produce lo siguiente:
-Se saca el elemento con clave: 2
• Reducir el tamaño en función del FC para ahorrar memoria
-Se saca el elemento con clave: 13
-Se saca el elemento con clave: 19
▫ el elemento con clave: 16
-Se saca Tablas hash abiertas si FC < 0,33
-Se saca el elemento con clave: 10
▫ Tablas hash cerradas
-Se introduce el elemento con clave: 21 si FC < 0,16
-Se introduce el elemento con clave: 9
• Se busca un nuevo valor B
-Se introduce el elemento con clave: 33
-Se saca El elemento con clave: 1
▫ el primo inmediatamente superior la mitad del tamaño del original
-Se saca el elemento con clave: 33
▫ el recorren secuencialmente los elementos y se añaden a la nueva
-Se saca Seelemento con clave: 21
-Se saca tabla
el elemento con clave: 9
-Se saca el elemento con clave: 11
-Se introduce el elemento con clave: 3
-Se introduce el elemento con clave: 9
-Se introduce el elemento con clave: 4
-Se saca el elemento con clave: 12
-Se saca el elemento con clave: 17
-Se saca el elemento con clave: 15
-Se saca el elemento con clave: 4
Utiliza dispersión doble para insertar elementos y exploración cuadrática en caso que sea
necesario redispersar elementos en función del FC
26. 26
Ejercicios
Ejercicio 13: Realiza el pseudocódigo de una clase “TablaHash” que:
1) Ofrezca una buena protección activa
2) Permita elegir entre trabajar con la aproximación abierta o cerrada
como protección pasiva
3) Cuando se trabaja con la aproximación cerrada deberá permitir elegir
entre exploración lineal con borrado perezoso, exploración cuadrática, o
dispersión doble
4) Realice redispersión y redispersión inversa en función del factor de
carga que se tenga en un determinado momento
27. 27
Bibliografía
• WEISS, Mark Allen; (2000) Data Estructures & Problem Solving Using Java.
Addison Wesley. ISBN 03-2154-140-5.
• JAIME SISA, Alberto; (2002) Estructuras de Datos y Algoritmos con énfasis en
programación orientada a objetos. Pearson Educación. ISBN 958-699-044-3.
• JOYANES AGUILAR, LUIS (2007) Estructuras de Datos en Java. McGraw Hill. ISBN:
9788448156312.
• STANDISH, Thomas A (1998). Data structures in Java. Addison Wesley ISBN 0-201-
30564-X.
• WEISS, Mark Allen; (2000) Estructuras de Datos en Java. Addison Wesley. ISBN 84-
7829-035-4.
• WIRTH, Niklaus (1992). Algoritmos + Estructuras de Datos = Programas. Prentice-
Hall. ISBN: 84-219-0172-9.