Está en la página 1de 31

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)
1 80 K H(k)
2 25 6
3 43 4
4 43 56 7
5 54 35 6
6 25 54 5
7 56 13 4
8 35 80 1
9 13 104 5
10 104
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
1 80 ... K H(k)
2 25 6
3 43 4
4 43 13 56 7
5 54 104 35 6
6 25 35 54 5
7 56 13 4
8 80 1
9 104 5
10
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.
1 80 K H(k)
2 25 6
3 43 4
4 43 13 56 7
5 54 35 6
104
6 25 54 5
7 56 35
13 4
8 80 1
9 104 5
10
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.
1
2
3
4 Bloque 1 Bloque 2
5 Bloque 1 Bloque 2
6
7 Bloque 1
8
• 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.
fin

También podría gustarte