You are on page 1of 9

UAQ

FACULTAD DE INFORMTICA
Campus Juriquilla

Algoritmos y Estructuras de datos ALUMNOS: Erik Ren Jurez Vargas Adrian Prez

Investigacin : METDOS Y RESOLUCIN DE COLISIONES.

RESOLUCIN DE COLISIONES. Un aspecto importante a estudiar en el hasing es la resolucin de colisiones entre sinnimos y sus tres mtodos basicos de resolucin de colisiones, uno de ellos depende de la idea de mantener listas enlazadas de sinnimos, y los otros dos del clculo de una secuencia de localizaciones en la tabla hash hasta que se encuentre que se encuentre una vaca. El anlisis comparativo de los mtodos se har en base al estudio del nmero de localizaciones que han de examinarse hasta determinar donde situar cada nueva clave en la tabla. Para los ejemplos el tamao de la tabla ser M=13 y la funcin hash h1(k) que utilizaremos ser: HASH = Clave Mod M y los valores de la clave k que consideraremos son los expuestos en la siguiente tabla:

Suponiendo que k=0 no ocurre de forma natural, podemos marcar todas las localizaciones de la tabla, inicialmente vacas, dndoles el valor 0. Finalmente y puesto que las operaciones de bsqueda e insercin estn muy relacionadas, se presentaran algoritmos para buscar un item insertndolo si es necesario (salvo que esta operacin provoque un desbordamiento de la tabla) devolviendo la localizacin del item o un -1(NULL)en caso de desbordamiento. Encadenamiento separado o Hasing Abierto. La manera ms simple de resolver una colisin es construir, para cada localizacin de la tabla, una lista enlazada de registros cuyas claves caigan en esa direccin. Este mtodo se conoce normalmente con el nombre de encadenamiento separado y obviamente la cantidad de tiempo requerido para una bsqueda depender de la longitud de las listas y de las posiciones relativas de las claves en ellas. Existen variantes dependiendo del mantenimiento que hagamos de las listas de sinnimos (FIFO, LIFO, por valor Clave, etc), aunque en la mayora de los casos, y dado que las listas individuales no han de tener un tamao excesivo, se suele optar por la alternativa ms simple, la LIFO. En cualquier caso, si las listas se mantienen en orden esto puede verse como una generalizacin del mtodo de bsqueda secuencial en listas. La diferencia es que en lugar de mantener una sola lista con un solo nodo cabecera se mantienen M listas con M nodos cabecera de forma que se reduce el nmero de comparaciones de la bsqueda secuencial en un factor de M (en media) usando espacio extra para M punteros. Para nuestro ejemplo y con la alternativa LIFO, la tabla quedara como se muestra en la siguiente figura:

A veces y cuando el nmero de entradas a la tabla es relativamente moderado, no es conveniente dar a las entradas de la tabla hash el papel de cabeceras de listas, lo que nos conducira a otro mtodo de encadenamiento, conocido como encadenamiento interno. En este caso, la unin entre sinnimos est dentro de la propia tabla hash, mediante campos cursores (punteros) que son inicializados a -1 (NULL) y que irn apuntando hacia sus respectivos sinnimos. Direccionamiento abierto o Hasing Cerrado. Otra posibilidad consiste en utilizar un vector en el que se pone una clave en cada una de sus casillas. En este caso nos encontramos con el problema de que en el caso de que se produzca una colisin no se pueden tener ambos elementos formando parte de una lista paraesa casilla. Para solucionar ese problema se usa lo que se llama rehashing. El rehashing consiste en que una vez producida una colisin al insertar un elemento se utiliza una funcin adicional para determinar cual ser la casilla que le corresponde dentro de la tabla, aesta funcin la llamaremos funcin de rehashing,rehi(k). A la hora de definir una funcin de rehashing existen mltiples posibilidades, la ms simple consiste en utilizar una funcin que dependa del nmero de intentos realizados para encontrar una casilla libre en la que realizar la insercin, a este tipo de rehashing se le conoce como hashing lineal. De esta forma la funcin de rehashing quedaria de la siguiente forma: rehi(k) = (h(k)+(i-1)) mod M i=2,3,... En el ejemplo, despus de insertar las 7 primeras claves nos aparece la tabla A, (ver la tabla siguiente). Cuando vamos a insertar la clave 147, esta queda situada en la casilla 6, (tabla B) una vez que no se han encontrado vacas las casillas 4 y 5. Se puede observar que antes de la insercin del 147 haba agrupaciones de claves en las localizaciones 4,5 y 7,8, y despus de la insercin, esos dos grupos se han unido formando una agrupacin primaria mayor, esto conlleva que si se trata de insertar un elemento al que le corresponde algunas de las casillas que estn al principio de esa agrupacin el proceso de rehashing tendr de recorrer todas esas casillas con lo que se degradar la eficiencia de la insercin. Para solucionar este problema habr que buscar un mtodo de rehashing que distribuya de la forma ms aleatoria posible las casillas vacas.

Despues de llevar a cabo la insercin de las claves consideradas en nuestro ejemplo, el estado de la tabla hash ser el que se puede observar en la tabla (C) en la que admas aparece el nmero de intentos que han sido necesarios para insertar cada una de las claves.

Para intentar evitar el problema de las agrupaciones que acabamos de ver podramos utilizar la siguiente funcin de rehashing: rehi(k) = (h(k)+(i-1)*C) mod M C>1 y primo relativo con M pero aunque esto evitara la formacin de agrupaciones primarias, no solventara el problema de la formacin de agrupaciones secundarias (agrupaciones separadas por una distancia C). El problema bsico de rehashing lineal es que para dos claves distintas que tengan el mismo valor para la funcin hash se irn obteniendo exactamente la misma secuencia de valores al aplicar la funcin de rehashing, cunado lo interenante seria que la secuencia de valores obtenida por el proceso de rehashing fuera distinta. As, habr que buscar una funcin de rehashing que cumpla las siguientes condiciones: Sea fcilmente calculable (con un orden de eficiencia constante), que evite la formacin de agrupaciones, que genere una secuencia de valores distinta para dos claves distintas aunque tenga el mismo valor de funcin hash, y por ltimo que garantice que todas las casillas de la tabla son visitadas. si no cumpliera esto ltimo se podra dar el caso de que an quedaran casillas libres pero no podemos insertar un determinado elemento porque los valores correspondientes a esas casillas no son obtenidos durante el rehashing. Una funcin de rehashing que cumple las condiciones anteriores es la funcin de rehashing doble. Esta funcin se define de la siguiente forma: hi(k) = (hi-1(k)+h0(k)) mod M i=2,3,... con h0(k) = 1+k mod (M-2) y h1(k) = h(k).

Existe la posibilidad de hacer otras elecciones de la funcin h0(k) siempre que la funcin escogida no sea constante. Esta forma de rehashing doble es particularmente buena cuando M y M-2 son primos relativos. Hay que tener en cuenta que si M es primo entonces es seguro que M-2 es primo relativo suyo (exceptuando el caso trivial de que M=3). El resultado de aplicar este mtodo a nuestro ejemplo puede verse en las tablas siguientes. En la primera se incluyen los valores de h para cada clave y en la segunda pueden verse las localizaciones finales de las claves en la tabla as como las pruebas requeridas para su insercin.

Direccionamiento Cerrado o Encadenamiento separado o Hashing abierto En la tcnica ms simple de encadenamiento, cada casilla en el array referencia una lista de los

registros insertados que colisionan en la misma casilla. La insercin consiste en encontrar la casilla correcta y agregar al final de la lista correspondiente. El borrado consiste en buscar y quitar de la lista. Ejemplo de encadenamiento. La tcnica de encadenamiento tiene ventajas sobre direccionamiento abierto. Primero el borrado es simple y segundo el crecimiento de la tabla puede ser pospuesto durante mucho ms tiempo dado que el rendimiento disminuye mucho ms lentamente incluso cuando todas las casillas ya estn ocupadas. De hecho, muchas tablas hash encadenadas pueden no requerir crecimiento nunca, dado que la degradacin de rendimiento es lineal en la medida que se va llenando la tabla. Por ejemplo, una tabla hash encadenada con dos veces el nmero de elementos recomendados, ser dos veces ms lenta en promedio que la misma tabla a su capacidad recomendada. Las tablas hash encadenadas heredan las desventajas de las listas ligadas. Cuando se almacenan cantidades de informacin pequeas, el gasto extra de las listas ligadas puede ser significativo. Tambin los viajes a travs de las listas tienen un rendimiento de cach muy pobre. Otras estructuras de datos pueden ser utilizadas para el encadenamiento en lugar de las listas ligadas. Al usar rboles auto-balanceables, por ejemplo, el tiempo terico del peor de los casos disminuye de O(n) a O(log n). Sin embargo, dado que se supone que cada lista debe ser pequea, esta estrategia es normalmente ineficiente a menos que la tabla hash sea diseada para correr a mxima capacidad o existan ndices de colisin particularmente grandes. Tambin se pueden utilizar vectores dinmicos para disminuir el espacio extra requerido y mejorar el rendimiento del cach cuando los registros son pequeos. [editar]Direccionamiento abierto o Hashing cerrado Las tablas hash de direccionamiento abierto pueden almacenar los registros directamente en el array. Las colisiones se resuelven mediante un sondeo del array, en el que se buscan diferentes localidades del array (secuencia de sondeo) hasta que el registro es encontrado o se llega a una casilla vaca, indicando que no existe esa llave en la tabla. Ejemplo de direccionamiento abierto. Las secuencias de sondeo ms socorridas incluyen: sondeo lineal en el que el intervalo entre cada intento es constante (frecuentemente 1). sondeo cuadrtico en el que el intervalo entre los intentos aumenta linealmente (por lo que los ndices son descritos por una funcin cuadrtica), y doble hasheo en el que el intervalo entre intentos es constante para cada registro pero es calculado por otra funcin hash. El sondeo lineal ofrece el mejor rendimiento del cach, pero es ms sensible al aglomeramiento, en tanto que el doble hasheo tiene pobre rendimiento en el cach pero elimina el problema de aglomeramiento. El sondeo cuadrtico se sita en medio. El doble hasheo tambin puede requerir ms clculos que las otras formas de sondeo. Una influencia crtica en el rendimiento de una tabla hash de direccionamiento abierto es el porcentaje de casillas usadas en el array. Conforme el array se acerca al 100% de su capacidad, el nmero de saltos requeridos por el sondeo puede aumentar considerablemente. Una vez que se llena la tabla, los algoritmos de sondeo pueden incluso caer en un crculo sin fin. Incluso utilizando buenas funciones hash, el lmite aceptable de capacidad es normalmente 80%. Con funciones hash pobremente diseadas el rendimiento puede degradarse incluso con poca informacin, al provocar aglomeramiento significativo. No se sabe a ciencia cierta qu provoca que las funciones hash generen aglomeramiento, y es muy fcil escribir una funcin hash que, sin querer, provoque un nivel muy elevado de aglomeramiento.

EVALUACIN DE LOS MTODOS DE RESOLUCIN. El aspecto ms significativo de la bsqueda por hashing es que si eficiencia depende del denominado factor de almacenamiento = n/M con n el nmero de items y M el tamao de la tabla. El nmero medio de pruebas para cada uno de los mtodos que hemos visto de resolucin de colisiones, en trminos de BE (bsqueda con xito) y BF (bsqueda sin xito). Las demostraciones de las frmulas resultantes pueden encontrarse en Knuth. Encadenamiento separado. Aunque puede resultar engaoso comparar este mtodo con los otros dos, puesto que en este caso puede ocurrir que >1, las frmulas paroximadas son:

Estas expresiones se aplican incluso cuando >>1, por lo que para n>>M, la longitud media de cada lista ser , y deberia esperarse en media rastrear la mitad de la lista, antes de encontrar un determinado elemento. Hasing Lineal. Las frmulas aproximadas son:

Como puede verse, este mtodo, aun siendo satisfactorio para pequeos, es muy pobre cuando -> 1, ya que el lmite de los valores medios de BE y BF sin respectivamente:

En cualquier caso, el tamao de la tabla en el hash lineal es mayor que en el encadenamiento separado, pero la cantidad de memoria total utilizada es menor al no usarse punteros. MTODOS PARA RESOLVER EL PROBLEMA DE LAS COLISIONES Considere las llaves K1y K2 que son sinnimas para la funcin hash R. Si K1 es almacenada primero en el archivo y su direccin es R(K1), entonces se dice que K1 esta almacenado en su direccin de origen. Existen dos mtodos bsicos para determinar donde debe ser alojado K2:

Direccionamiento abierto.-Se encuentra entre direccin de origen para K2dentro del archivo. Separacin de desborde (Area de desborde).-Se encuentra una direccin para K2fuera del
rea principal del archivo, en un rea especial de desborde, que es utilizada exclusivamente para almacenar registro que no pueden ser asignados en su direccin de origen Los mtodos mas conocidos para resolver colisiones son:

Sondeo lineal Que es una tcnica de direccionamiento abierto. Este es un proceso de bsqueda secuencial desde la direccin de origen para encontrar la siguiente localidad vaca. Esta tcnica es tambin conocida como mtodo de desbordamiento consecutivo. Para almacenar un registro por hashing con sondeo lineal, la direccin no debe caer fuera del limite del archivo, En lugar de terminar cuando el limite del espacio de direccin se alcanza, se regresa al inicio del espacio y sondeamos desde ah. Por lo que debe ser posible detectar si la direccin base ha sido encontrada de nuevo, lo cual indica que el archivo esta lleno y no hay espacio para la llave. Para la bsqueda de un registro por hashing con sondeo lineal, los valores de llave de los registros encontrados en la direccin de origen, y en las direcciones alcanzadas con el sondeo lineal, deber compararse con el valor de la llave buscada, para determinar si el registro objetivo ha sido localizado o no.

El sondeo lineal puede usarse para cualquier tcnica de hashing. Si se emplea sondeo lineal para almacenar registros, tambin deber emplearse para recuperarlos.

Bibliografa: http://decsai.ugr.es/~jfv/ed1/tedi/cdrom/docs/tablash.html http://webdiis.unizar.es/asignaturas/EDA-Tardes/TADs_funcionales_v4.pdf http://sistemas.itlp.edu.mx/tutoriales/estructdatos2/tema5_3.htm

You might also like