170 likes | 373 Views
Estructura de Datos II . Equipo 4 Acosta Montiel Miguel A. Barajas Pineda Diana J. Cabanillas López Jesús D. Hurtado Castillo Jacobo. Equipo 7 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:
E N D
Estructura de Datos II Equipo 4 Acosta Montiel Miguel A. Barajas Pineda Diana J. Cabanillas López Jesús D. Hurtado Castillo Jacobo Equipo 7 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 H(K1)= dígitos_centrales (52 693 081) + 1= 94 K22=87 590 881 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úsquedaen 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.