220 likes | 372 Views
Método para resolver colisiones. ¿Qué es le método de colisiones?. Dado que una función hashing mapea un espacio relativamente grande de valores de llave en un espacio de direcciones relativamente pequeños, es seguro que se producirán colisiones.
E N D
¿Qué es le método de colisiones? • Dado que una función hashing mapea un espacio relativamente grande de valores de llave en un espacio de direcciones relativamente pequeños, es seguro que se producirán colisiones. • Considere los dos valores de llave K1 y K2 los cuales son sinónimos con la función hash R. Si K1 es primero almacenado en el archivo y su dirección es R (K), entonces se dice que k1 esta almacenado en su dirección de su origen
Existen dos métodos básicos para determinar donde almacenarse K2 • Direccionamiento abierto: otra dirección distinta de la de origen es encontrada para K2 dentro del archivo relativo. • Separación de desborde: alguna dirección es encontrada para K2 fuera del área principal del archivo relativo en un área especial de desborde, que es utilizada exclusivamente para almacenar registros que no pueden ser asignados a su dirección de origen.
Técnicas para manejar colisiones • Sondeo lineal, que es una técnica de direccionamiento abierto • Doble hashing, que puede ser aplicado como cualquier direccionamiento abierto o técnica de separación de desborde
Sondeo lineal • Es un proceso de búsqueda secuencial desde la dirección de origen para encontrar la siguiente localidad vacía se conoce también como método de desbordamiento consecutivo . • Para instrumentar este método se necesita determinar si una dirección esta vacía, esto puede hacerse inicializando una bandera en cada localidad a medida que se valla llenando . • La lógica básica de almacenar un registro por hashing se muestra a continuación:
Algoritmo Lógico para almacenar por registro hashing con sondeo lineal • 1) inicio • 2)aplicar el hash ala llave, obteniendo la dirección de origen :dirección:=(key), dirección-origen:=origen • 3)preguntar ¿Esta ocupada esta dirección? Si la respuesta es si ir al paso 4 , si la respuesta es no ir la paso 6 • 4)aplicar sondeo lineal: dirección :=dirección+1 si dirección > tamaño del archivo entonces dirección :=1 se pregunta: ¿es dirección =dirección- origen? Si es si ir al paso 5 y si es no ir al paso 3 • 5)El archivo esta completamente lleno ir al paso 7 • 6)Almacenar la llave en esa dirección, cambiar la bandera para que indique ocupado ir al paso7 • 7)fin
El sondeo lineal deberá hacerse de tal forma que dirección no caiga fuera del limite del archivo ,en lugar de terminar cuando el limite del espacio de dirección se alcanza, regresamos al inicio del espacio y sondeamos desde ahí por lo tanto se es necesario detectar cuando la dirección de base origen (dirección – origen) ha sido encontrada de nuevo ,en cuyo caso el archivo esta completamente lleno y no habrá espacio para la llave. • Si el sondo lineal se usa para resolver colisiones cuando se almacenan los registros, a menos que el esquema de búsqueda en directorio se utilice en conjunción con el hashing. La lógica básica para recuperar los registros por hashing con sondeo lineal se muestra a continuación:
Algoritmo lógico para recuperar registros por hashing con sondeo lineal • 1)inicio • 2)aplicar la función hash, obteniendo la dirección de origen: dirección:=R(llave)dirección-origen:=origen preguntar ¿esta llena la dirección? si es si ir al paso 3 si es no ir al paso 5 • 3) ¿el valor de la llave en dirección =llave? Si es si ir al paso 4 si e no ir al paso 6 • 4)encontró el registro objetivo ir al paso 8 • 5)el registro con la llave dada no esta en el archivo ir al paso 8 • 6)aplicar sondeo lineal: dirección:=direccion+1 si dirección > tamaño del archivo entonces dirección :=1 preguntar ¿dirección=dirección-origen? Si es si ir al paso 7 y si es no ir al paso 2 • 7)el registro con la llave dada no esta en el archivo ir al paso 8 • 8)fin
Doble hashing • Se aplica para encontrar una localidad para un registro cuando este no puede quedar almacenado en su dirección, este aplica una segunda función hash para cambiar la llave original y el resultado del primer hash. El espacio del primer hash, el espacio de dirección objetivo del segundo hash puede ser el mismo archivo relativo o un archivo relativo de sobre flujo independiente : • El primer caso es el método de direccionamiento abierto. • El segundo caso es el método es de desborde. • Ambos casos serán necesarios si las colisiones ocurren durante el segundo hash.
Ventajas del método de desborde y abierto • El método de separación de desborde evita que un registro que no esta almacenado en su dirección de origen deslaza a otro registro el que después buscara en otra dirección de origen. • El método abierto mueve el registro extraño a otra localidad y almacenado al nuevo registro en la nueva dirección de origen ahora vacía.
Comparación del sondeo lineal y el doble hashing • El sondo lineal tiende agrupar los sinónimos mientras que el doble hashing tiende a dispersar los sinónimos mas ampliamente a través del espacio de direcciones • El sondeo lineal por lo general resulta tener un comportamiento terrible mientras que el doble hashing es bastante tolerable para búsquedas exitosas pero no así en búsquedas no exitosas
Ejemplos de los métodos • Considere un archivo muy pequeño de 9 registros en un espacio de direcciones para19 registros. suponga que los registros se hayan sido insertados en las ranuras 2,3,5,6,12,13,14,15,y17 • El siguiente registro deberá entrar en uno de los 10 espacios disponibles. Sin embargo no existe ni un 10% de probabilidad de que el registro entrara dentro de alguna de las ranuras. Por ejemplo si fuera 16 seria la localidad de nuevo registro si le fuera asignada la dirección 12,13,14,15,o16 por la función hash .la dirección seria 8 seria su localidad solo salía nuevo registro le fuera asignada la dirección 8 por la función hash .la probabilidad de recibir un nuevo registro para cada dirección es la siguiente:
Las cuales asumen que la función hash produce una distribución uniforme de direcciones. • El resultado de este afecto de agrupamiento es que la búsquedas largas tienden hacer muchos mas largas. Inclusive con moderados factores de carga de archivos, existen relativamente una alta probabilidad de que el nuevo registro extienda aun agrupamiento en lugar de comenzar un agrupamiento
Métodos para mejorar la resolución de colisiones • Encadenamiento de sinónimos • Direccionamiento por cubetas
Encadenamiento de sinónimos • Es la manera de mejorar la eficiencia de un archivo relativo que utiliza calculo de direcciones, sin directorio auxiliar para guiar la recuperación de registros ,mantiene una lista de registros, con la misma dirección de origen, no reduce el numero de colisiones, pero reduce los tiempos de acceso para recuperar los registros que no se encuentran en su localidad de origen. • Se puede utilizar con el método abierto y de desborde • Siempre trabaja mejor que la solución de colisiones sin encadenamiento de sinónimos al menos que se use el método de búsqueda en el directorio para registrar donde están realmente almacenados los registros
Ejemplo del encadenamiento de sinónimos cuando el sondeo lineal y el doble hashing, respectivamente se usan para resolver el problema de colisiones a)Sondeo lineal con encadenamiento separado Los conjuntos de equivalencia son (2),(3),(5,6),(12,14),(13,15),y(17) B) Doble hashing encadenados separados. Los conjuntos de equivalencia son (2,6),(3,15),(5),(12,17),(13)y (14)
Algoritmo lógico para recuperar registros por hashing con encadenamiento de sinónimos • 1)inicio • 2) aplicar la funcion hash, obteniendo la dirección base: dirección:=R(llave), preguntar ¿la llave en dirección es igual a la llave? Si es si ir a la paso 3 si es no ir al paso 4 • 3)el registro objetivo fue encontrado ir al paso 6 • 4)seguir la lista ligada de sinónimos dirección:=siguiente(dirección) preguntar ¿ La dirección es nula? Si es si ir al paso 5 y si es no ir al paso 2 • 5)el registro con el valor de llave no existe ir al paso 6 • 6)fin
Direccionamiento por cubeta • Es un bloque de espacio o cubetas que pueden acomodar ocurrencias múltiples de registros, en lugar de asignar celdas individuales a registros. • Cuando una cubeta es desbordada, alguna nueva localización deberá ser encontrada para el registro ,cada cubeta principal generalmente tendrá un apuntador a una cadena de registros, en el área de sobrecupo ,que tendrían que hacer almacenados en la cubeta principal, pero que terminaron ,en su lugar, en una cubeta de sobrecupo. • Una cubeta de sobrecupo podría acomodar registros que fueran direccionados hacia diferentes cubetas principales
Los registros almacenados en una cubeta se pueden manejare de dos formas: • 1) Pueden insertarse en el mismo orden de cómo llegan a la cubeta • 2) pueden mantener en orden según el valor de sus llaves • Cuando se recupera un registro de un archivo relativo utiliza el direccionamiento de cubetas con un manejo de sobrecupo de cubetas mediante sondo lineal como se muestra en el siguiente algoritmo
Algoritmo lógico para recuperar registros por sondeo de hashing con direccionamiento por cubetas, con sobre flujo manejado por sondeo lineal • 1)inicio • 2)aplicar la función hash obteniendo el numero de cubeta dirección:=R(llave),buscar en la cubeta la dirección para el registro con la llave dada y preguntar ¿encontró el registro? si es si ir al paso 5 y si es no ir al paso 3 • 3) preguntar ¿esta llena la cubeta? Si es si ir al paso 4 y si es no ir al paso 6 • 4)aplicar sondeo lineal sobre la siguiente cubeta dirección:= dirección +1 ir al paso 2 • 5) termina con éxito • 6)termina sin éxito
Algoritmo para recuperar registros por hashing con direccionamiento por cubetas, con cubetas de desborde de áreas de desborde y encadenamiento de sinónimos en el área de desborde • 1)inicio • 2)aplicar la función hash obteniendo el numero de cubetas dirección –R(llave) y buscar en la cubeta el numero de direccionamiento en el registro con el valor de la llave dada y pregunatar¿encontro registro ? Si es si ir al paso 5 y si es no ir al paso 3 • 3) pregunatar ¿la cadena de sinonimos apunta a nil? Si es si ir al paso 6 y si es no ir al paso 4 • 4) comparar llave con el valor de la llave siguiente registro en la cadena de sinónimos si es igual ir paso 5 y si no es igual ir al paso 3 • 5)termina exitosamente • 6)termina su éxito • Nota :Este algoritmo se utiliza cuando un registro es recuperado de un archivo relativo que usa direccionamiento por cubetas, con sobrecupos colocados en una área de sobrecupo y encadenamiento de sinónimos dentro de cubetas de sobrecupo
Ventajas de usar cubetas • Pueden contener múltiplos registros es que se pueden acomodar registros de longitud de variable. Con direccionamiento de cubetas y de registros de longitud de variable ,el proceso de encontrar espacios disponibles en una cubeta para un nuevo registro es mas complicado que la simple búsqueda secuencial de la primer ranura abierta . El espacio encontrado debe ser suficiente grande para acomodar el nuevo registro ,el espacio es manejado en estas circunstancias manteniendo una lista ligada de huecos en la cubeta .