Hash - Sistemas

Download Report

Transcript Hash - Sistemas

Estructura de Datos II
Equipo 4
Equipo 7
Acosta Montiel Miguel A.
Barajas Pineda Diana J.
Cabanillas López Jesús D.
Hurtado Castillo Jacobo
Moreno Ayala Iván
Tristán Domínguez César A.
Vidal Trasviña Alejandrina
Búsqueda por transformación de claves
(HASH)
Características:
•
•
Velocidad de búsqueda
Tiempo de búsqueda
•
Forma de Trabajo
Por lo tanto es importante:
•
Elegir una función hash que sea fácil de calcular
•
Un método para resolver colisiones
Funciones Hash
• Función Modulo (Por División)
•
Función Cuadrado
• Función Plegamiento
• Función Truncamiento
Función Modulo (Por División)
•
Consiste en tomar el residuo de la división de la clave entre el numero de componentes
del arreglo.
•
Suponiendo que hay un arreglo de N elementos y K es la clave del dato a buscar.
H(k)=(K mod. N) + 1
Ejemplo:
K1=7259; K2=9359; N =100
H(K1)=(7259 mod. 100) + 1 = 60
H(K2)=(7259 mod. 100) + 1 = 60
*Como H(K1) = H(K2) y K1 diferente que K2 entoces estamos ante una colisión.
H(K1)=(7259 mod. 97) + 1 = 82
H(K2)=(7259 mod. 97) + 1 = 48
*Con N =97 eliminamos la colisión.
Función Cuadrado
•
Consiste en elevar al cuadrado la clave y tomar los dígitos centrales como dirección.
•
Sea K la clave del dato a buscar .
H(K)= dígitos_centrales (K2) + 1
Ejemplo:
K1=7259; K2=9359; N =100
K12=52 693 081
K22=87 590 881
H(K1)= dígitos_centrales (52 693 081) + 1= 94
H(K2)= dígitos_centrales (87 590 881) + 1= 91
* Como el rango de índices en nuestro ejemplo caria de 1 a 100, se toman solamente los dos
dígitos centrales del cuadrado de las claves.
Función Plegamiento
•
Consiste en dividir la clave en partes de igual numero de dígitos, tomando como
dirección los dígitos menos significativos.
•
Sea K la clave del dato a buscar.
H(K)= digmensig ((d1…di) + (di+1…dj) + … + (dl…dn)) + 1
Ejemplo:
K1=7259; K2=9359; N =100
H(K1)= digmensig ((72) + (59)) + 1= digmensig (131) + 1 = 32
H(K2)= digmensig ((93) + (59)) + 1= digmensig (152) + 1 = 53
* De la suma de las partes se toman solamente dos dígitos porque los índices del arreglo
varían de 1 a 100.
Función Truncamiento
•
Consiste en tomar algunos dígitos de la claves y formar con ellos una dirección.
•
Sea K la calve del dato buscar.
H(K)= elegirdatos (d1, d2, …, dn) + 1
Ejemplo:
K1=7259; K2=9359; N =100
H(K1)= elegirdatos (7259) + 1 = 76
H(K2)= elegirdatos (9359) + 1 = 96
* En el ejemplo se toman los datos 1 y 3 de la clave y se unen de izquierda a derecha.
Análisis del método por transformación
de claves
•
Según Lipschuts, la probabilidad de llevar a cabo una búsqueda con éxito (S) y la
probabilidad de llevar a cabo una búsqueda sin éxito (Z), quedan determinadas por las
siguientes formulas:
a) Búsqueda con éxito
b) Búsqueda sin éxito
S()= (1+1/ (1- ) )
S()= (1+1/ (1- ) )
2
2
Solución de Colisiones
•
•
•
•
Elegir el método correcto para resolver colisiones es tan importante como la
elección de una función hash.
Obtener una misma dirección para dos claves diferentes, es una colisión.
La manera mas natural de resolver el problema es reservar una casilla por
clave.
Métodos utilizados para resolver Colisiones
Reasignación
Arreglos anidados
Encadenamiento
Reasignación
•
•
•
•
Prueba lineal
Prueba cuadrática
Doble dirección Hash
Prueba Lineal
Detectada la colisión hay que recorrer el arreglo secuencialmente a partir del punto de
colisión, buscando al elemento, termina cuando el elemento es encontrado o se encuentra
una posición vacía.
• Prueba cuadrática
Similar a la prueba lineal, la diferencia consiste en que las direcciones
alternativas se generan como D+1, D+4, D+9 … D+i2.
La principal desventaja es que pueden quedar casillas de arreglo sin visitar.
• Doble Dirección Hash
Consiste en una vez detectada la colisión, generar otra dirección aplicando la
función hash a la dirección previamente obtenida.
Arreglos Anidados
•
Este método consiste en que cada elemento del arreglo tenga otro arreglo , en el
cual se almacenen los elementos colisionados. La solución parece ser sencilla, pero
claro que resulta ineficiente.
•
Al trabajar con arreglos se depende del espacio que se haya asignado a este, lo cual
conduce a un nuevo problema: elegir un tamaño adecuado de arreglo que permita
un equilibrio entre el costo de memoria y el numero de valores colisionados que
pudiera almacenar.
Encadenamiento
•
Consiste en que cada elemento de arreglo tenga un apuntador a una lista ligada, la
cual se ira generando e ira almacenando los valores colisionados a medida que se
requiera.
•
Una desventaja es que se ocupa espacio adicional al de la tabla y que exige manejo
de listas ligadas. Además si las listas crecen demasiado se perderá la facilidad de
acceso directo del método hash.
Búsqueda por transformación de claves
(HASH)
•
Los archivos normalmente están organizados en áreas llamadas cubetas. Las cubetas
están formadas por cero, uno o más bloques de registros. Por lo tanto, la función hash,
aplicada a una clave. Dará como resultado un valor que hace referencia a una cubeta en
la cual puede estar el registro buscado.
•
Si el número de bloques a recorrer en una cubeta es grande, el tiempo necesario para ello
será significativo y por lo tanto ya no se contará con la ventaja del acceso directo que
caracteriza al método por transformación de claves.
•
Debe elegirse una función hash que distribuya las claves a través de las cubetas, de tal
manera que se evita la concentración de numerosas claves en una cubera mientras otras
permanecen vacías.
Funciones HASH
•
Al aplicar una función hash a un clave resulta el número de cubeta en la cual puede
estar el registro con dicha clave.
•
La función debe transformar las claves para que la dirección resultante sea un
número comprendido entre los posibles valores de las cubetas.
•
Es importante que la función distribuya homogéneamente las claves entre los
números de cubetas disponibles.
•
Las funciones modulo, cuadrado, plegamiento y truncamiento para búsqueda
interna son validas también para búsqueda externa.
•
La función modulo es de las que ofrece mayor uniformidad.
Conversión de bases
•
Consiste en modificar de manera arbitraria la base de la clave obteniendo un número que
corresponda a una cubeta.
Solución de colisiones
•
Para evitar las colisiones se debe elegir un tamaño adecuado de cubetas, si se definen muy
pequeñas el numero de colisiones aumenta, mientras que si se definen muy grandes se
pierde eficiencia en cuanto al espacio de almacenamiento.
a) uso de áreas independientes para colisiones
• Consiste en definir áreas separadas (secundarias) de las áreas primarias de almacenamiento,
en las que se guardarán todos los registros que hayan colisionado.
•
El área de colisiones puede estar organizada de diferentes maneras. Una alternativa consiste
en tener el área común a todas las cubetas.
•
Otra forma de organizar el área de colisiones consiste en dividirla en bloques, asociando
cada uno de ellos a uno del área primaria
b) uso de áreas de colisiones entre los bloques de almacenamiento primario
Ventajas
•
Tiempo de búsqueda independiente del numero de elementos
•
Su búsqueda es rápida aunque los elementos no estén ordenados
•
Las tablas Hash nos van a ser muy útiles cuando necesitemos operaciones de
Inserción y Búsqueda en tiempos promedio de orden constante.
•
Acceso directo a los datos
Desventajas
•
Tendremos que elegir sabiamente la función hash que mejor distribuya
nuestros datos.
•
Se pueden presentar colisiones en las claves y tenemos que tener un metodo
para evitarlas.