310 likes | 495 Views
Indices. Almacenamiento y Recuperación de Información. Método por transformación de claves (hash). Permite aumentar la velocidad sin necesidad de tener los elementos ordenados El tiempo de búsqueda es prácticamente independiente del número de componentes del arreglo
E N D
Indices Almacenamiento y Recuperación de Información
Método por transformación de claves (hash) • Permite aumentar la velocidad sin necesidad de tener los elementos ordenados • El tiempo de búsqueda es prácticamente independiente del número de componentes del arreglo • Trabaja basándose en una transformación de claves, que convierte una clave en una dirección (índice) dentro del arreglo.
Dirección H (clave) • Permite accesar directamente los elementos. • Pongamos que deseamos clasificar a 100 alumnos con su matricula. • Si los clasificamos con un identificador del 1 al 100 tenemos necesidad de un arreglos de 100 elementos para almacenar sus datos. • Si los clasificamos por matrícula, resulta ineficiente almacenarlos en un arreglo de tamaño 999 999 999, sólo para 100 elementos.
La función hash debe contar con las siguientes propiedades • Simple de calcular • Asignar direcciones de manera uniforme • Si esto no ocurre se genera una colisión (asignación de una misma dirección a dos o más claves distintas) • Cuando se trabaja con este método debe elegirse previamente: • Una función hash que sea fácil de calcular y que distribuya uniformemente las claves • Un método para resolver colisiones
Funciones hash • Módulo • Cuadrado • Plegamiento • Truncamiento
Solución de colisiones • Normalmente resulta caro tratar las colisiones • Es por ello que debe hacerse un esfuerzo por encontrar la función que ofrezca mayor uniformidad en la distribución de las claves. • Lo mas fácil es reservar una casilla por clave. Pero esta solución puede tener un alto costo de memoria. • Reasignación • Arreglos anidados • Encadenamiento
Reasignación • Prueba lineal: consiste en que una vez detectada la colisión se debe recorrer el arreglo secuencialmente a partir del punto de colisión, buscando al elemento. • Se trata el arreglo como una estructura circular (el siguiente elemento después del último es el primero)
Reasignación • Prueba cuadrática: este método es similar al de la prueba lineal, la diferencia consiste en que en el cuadrático las direcciones alternativas se generan como D + 1, D + 4, D + 9, …, D + i2; en vez de D + 1, D + 2, D + 3, …, D + i . Esta variación permite una mejor distribución de las claves colisionadas.
Reasignación • Doble dirección hash: consiste en que una vez detectada la colisión se debe generar otra dirección, aplicando la función hash a la dirección previamente obtenida.
Reasignación • Arreglos anidados: este método consiste en que cada elemento del arreglo tenga un arreglo en el cual se almacenen los elementos colisionados. Esta solución aunque atractiva a primera vista, resulta ser ineficiente. • Arreglos implica un espacio previamente asignado • Elegir un tamaño adecuado de arreglo que permita un equilibrio entre el costo de memoria y el número de valores colisionados que pudiera almacenar
Reasignación • Encadenamiento: consiste en que cada elemento del arreglo tenga un apuntador a una lista ligada, la cual se irá generando e irá almacenando los valores colisionados a medida que se requiera. • Es el método mas eficiente debido al dinamismo propio de las listas. • Cualquiera que sea el número de las colisiones, siempre se podrá tratar una más.
Reasiganción • Desventajas: • Ocupa espacio adicional a la tabla • Exige el manejo de listas ligadas, que si crecen demasiado, implica la pérdida de acceso directo.
Reasignación • TODOS los procesos de búsqueda concluyen cuando el elemento es hallado, o bien cuando se encuentra una posición vacía.
Búsqueda externa • Existen casos en los cuales no se puede manejar toda la información en memoria principal, se necesita trabajar con información almacenada en archivos. • Estos implican la permanencia de los datos, aun después de que termine de ejecutarse la aplicación. • Los archivos se encuentran almacenados en dispositivos secundarios (cintas, discos) • Las operaciones de escritura y lectura tienen un alto costo en cuanto a tiempo. • Una forma de hacerlo es trabajar con archivos ordenados.
La búsqueda por transformación de claves tiene básicamente las mismas características del método interno. • En este caso los archivos están organizadas en áreas llamadas cubetas. • Formadas por cero, uno o más bloques de registros. • De aquí que la función hash da como resultado el valor de una dirección de cubeta donde puede estar el registro buscado. • Continúa siendo válido el cuidado en la elección de la función hash y el método que resuelva las colisiones.
Los bloques contienen un número fijo de registros. • Con respecto a las cubetas no se establece un límite en cuanto al número de bloques que pueden almacenar. • Las cubetas permiten solucionar el problema de las colisiones. • Si el número de bloques es muy grande, el tiempo para recorrerlas será significativo se perderá la ventaja del acceso directo.
Dada la clave de un registro buscado, • Se aplica una función hash, que da como resultado la posición de una cubeta • Se localiza la cubeta, • Se recorren los bloques hasta encontrar el registro o hasta llegar a un bloque con puntero nulo.
Las funciones de hash vistas para el método interno son validas igual. • Función conversión de bases: consiste en modificar de forma arbitraria la base de la clave, obteniendo un número que corresponda a una cubeta. Si el número resultante excede el orden de las direcciones entonces se suprimirán los dígitos mas significativos
Se tienen 100 cubetas, cada una de ellas referenciada por un entero entre 1 y 100. • Sea k = 7259 y se elige 9 como base • H (7259) = (7*93) + (2*92) + (5*91) + (9*90) • H (7259) = 5319 • Se toma como dirección 19
Soluciones de colisiones • Existen archivos donde cada cubeta tiene asociado un bloque • Cada cubeta tiene una capacidad máxima determinada por el tamaño del bloque asociado a ella • Una vez saturada la capacidad de la cubeta, cualquier registro asignado a ella produce una colisión.
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 secundaria puede ser común a todas las cubetas con lo que cada vez que se produzca una colisión, habrá que buscar en toda el área secundaria.
Otra forma de organizar esta área es dividiéndola en bloques asociando cada uno a otro del área primaria. Esta alternativa optimiza el tiempo de búsqueda en caso de colisiones, pero podrían saturarse ocasionando nuevas colisiones.
Uso de áreas de colisiones entre los bloques de almacenamiento primario (se parece al de reasignación). Una vez detectada una colisión, se debe buscar en el área de colisiones inmediata a dicho bloque. • Si el elemento buscado no se encuentra se continúa buscando en las siguientes áreas de colisiones hasta que se encuentre o se encuentren espacios vacíos.
Búsqueda dinámica por transformación de claves • Se varía el número de cubetas en función de la densidad de ocupación de las mismas (%). • Se comienza con un determinado número de cubetas y a medida que se llenan se asignan nuevas cubetas al archivo. • La asignación dinámica de cubetas: • Por medio de expansiones totales • Por medio de expansiones parciales
Expansiones totales • Consiste en duplicar el número de cubetas a medida que se supera la densidad de ocupación. • El número inicial es de N, la primera expansión 2N, , la siguiente 4N… • El dinamísmo de este método también se da en sentido contrario, si disminuye la población en las cubetas, disminuye el número de cubetas.
Expansiones Parciales • Este método consiste en incrementar el número de cubetas en el 50%, haciendo que dos expansiones parciales equivalgan a una total.