Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
Copyright Cenfotec S.A. 2003 Prof. María Eugenia Ucrós, Julia Espinoza G.
BISOFT-28Estructuras de Datos 2
Hashing
Instructor Esteban Meneses
Copyright Cenfotec S.A. 2003
• Las estructuras de datos lineales y jerárquicas tienen diferencias en la eficiencia de las operaciones básicas: insertar, eliminar, buscar.
• Por ejemplo:– Listas enlazadas desordenadas: insertar O(1),
eliminar O(n), buscar O(n).– Vector ordenado: insertar O(log n), eliminar
O(log n), buscar O(log n).– Árbol binario de búsqueda: insertar O(log n),
eliminar O(log n), buscar O(log n).• Sería ideal encontrar una estructura donde todas esas
funciones fueran casi constantes.
Introducción
Copyright Cenfotec S.A. 2003
• Una tabla hash es una estructura de datos que intenta hacer eficientes todas las operaciones básicas, de manera que su comportamiento sea casi constante.
• Los elementos que se insertan en una tabla hash se denominan llaves.
• A cada llave le corresponde una posición en la tabla hash.
Tabla hash
Copyright Cenfotec S.A. 2003
• Asocia una llave con una entrada de la tabla.
Función hash
x
0123456789
hash(x)
Copyright Cenfotec S.A. 2003
• Tamaño de la tabla: N• Usar la función modulo (residuo de la división
entera).•
Ejemplo 1: Tabla con elementos enteros
hash x =xmod N0123456
X=19
X=50
Copyright Cenfotec S.A. 2003
int hash(int key, int tableSize){ return key % tableSize;}
int hash2(int key, int tableSize){ return (key+2) % tableSize;}
Ejemplo 1: Código C++
[Tomado de Data Structures and Algorithm Analysis in C++, Mark Allen Weiss]
Copyright Cenfotec S.A. 2003
Ejemplo 2: Tabla con elementos hilera
• Tamaño de la tabla: N• Usar el valor entero de los caracteres: código ASCII.• Representar la hilera como un vector de caracteres.
• hash x =∑i=0
N−1
x [i ]mod N0123456
X=¨amigos¨
X=¨hola¨
Copyright Cenfotec S.A. 2003
int hash(string &key, int tableSize){ int hashVal = 0; for(int i=0; key.length(); i++) hashVal += key[i]; return hashVal % tableSize;}
int hash2(string &key, int tableSize){ return (key[0] + 27*key[1] + 729*key[2])
% tableSize;}
Ejemplo 2: Código C++
int hash(string &key, int tableSize){ int hashVal = 0; for(int i=0; key.length(); i++) hashVal += key[i]; return hashVal % tableSize;}
int hash2(string &key, int tableSize){ return (key[0] + 27*key[1] + 729*key[2])
% tableSize;}[Tomado de Data Structures and Algorithm Analysis in C++, Mark Allen Weiss]
Copyright Cenfotec S.A. 2003
int hash(string &key, int tableSize){ int hashVal = 0; for(int i=0; key.length(); i++) hashVal += key[i]; return hashVal % tableSize;}
int hash2(string &key, int tableSize){ return (key[0] + 27*key[1] + 729*key[2])
% tableSize;}
Ejemplo 2: Código C++
int hash3(string &key, int tableSize){ int hashVal = 0; for(int i=0; key.length(); i++) hashVal = 37*hashVal + key[i]; hashVal %= tableSize; if(hashVal < 0) hashVal += tableSize; return hashVal;}
[Tomado de Data Structures and Algorithm Analysis in C++, Mark Allen Weiss]
Copyright Cenfotec S.A. 2003
• Cada llave se asocia a una entrada 0..TamTabla-1.• Factor de carga: razón de elementos en la tabla
entre el tamaño de la tabla.• Colisión: dos llaves son asociadas a la misma
entrada de la tabla hash.
• Resolución de colisiones: algoritmo para resolver el problema de la colisión.
Colisiones
0123456
X=17
X=10
Copyright Cenfotec S.A. 2003
• Cada entrada de la tabla hash tiene una lista enlazada con todos los elementos que colisionan en esa entrada.
Encadenamiento Separado
0123456
17 1011
Copyright Cenfotec S.A. 2003
• Si hay una colisión, entonces se aplica nuevamente una función de hash para determinar un posible lugar donde se colocará el elemento conflictivo.
•
• Se aplica h0, h
1,h
2,... hasta que se encuentre un lugar
disponible.
Direccionamiento Abierto
hi x=hash x f i mod N
Copyright Cenfotec S.A. 2003
•
Prueba Lineal
f i =i
0123456
X=17
X=10
X=11
Orden de las inserciones: 11, 10, 17
Copyright Cenfotec S.A. 2003
•
Prueba Cuadrática
f i =i2
0123456
X=17
X=10
X=11
Orden de las inserciones: 11, 10, 17
Copyright Cenfotec S.A. 2003
•
Doble Hashing
f i =hash2 i
0123456
X=17
X=10
X=11
Orden de las inserciones: 11, 10, 17
hash2i =i∗3i
Copyright Cenfotec S.A. 2003
• ¿Qué sucede cuando no se puede insertar un elemento debido a que todas las posiciones colisionan?– Duplicar el tamaño de la tabla y volver a asociar los
elementos.
Rehashing
Tabla Hash Inicial Tabla
HashFinal
Llaves
Copyright Cenfotec S.A. 2003
• La función de hash se va modificando de acuerdo al número de elementos y al comportamiento de la tabla.
• Hashing extendible.– Uso de un directorio con M registros.– Concatenación de múltiples tablas hash.
Hashing dinámico
Copyright Cenfotec S.A. 2003
Directorio
00 01 10 11
000100
001000
001010
001011
010100
011000
100000
101000
101100
101110
111000
111001
Copyright Cenfotec S.A. 2003
• Ejercicio 1 Inserte en una tabla hash de tamaño 10, los elementos: 89,18,49,58,69,50,21,35. Utilice la prueba lineal, prueba cuadrática y el doble hashing con la función f(i)=i*3i.
• Ejercicio 2 Muestre el resultado de insertar las llaves: 10111101, 00000010, 10011011, 10111110, 01111111,01010001, 10010110, 00001011, 11001111, 10011110, 11011011, 00101011, 01100001, 11110000, 01101111 en una tabla con hashing dinámico y M = 4.
Ejercicios
Copyright Cenfotec S.A. 2003
• Ejercicio 3 Dadas las siguientes inserciones: 4371, 1323, 6173, 4199, 4344, 9679, 1989 en una tabla con 10 elementos y función de hash modular, muestre el resultado usando:a) Encadenamiento separado.b) Prueba lineal.c) Prueba cuadrática.d) Doble hashing con hash2(x)=7-(x mod 7)
Ejercicios (cont.)
Copyright Cenfotec S.A. 2003
FIN