Organizacion de Archivos: secuencial desordenado/ordenado + ...
Organizacion de Archivos: secuencial desordenado/ordenado + ...
Organizacion de Archivos: secuencial desordenado/ordenado + ...
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Almacenamiento y Recuperación <strong>de</strong> la<br />
Información<br />
Estructuras basicas <strong>de</strong> archivos<br />
<strong>Archivos</strong> Secuenciales<br />
2do Semestre 2005<br />
Wenceslao Palma M. <br />
www.inf.utfsm.cl/~wpalma/ari
Una estructura <strong>de</strong> archivos es una técnica para agrupar físicamente los registros <strong>de</strong> un archivo en<br />
dispositivos <strong>de</strong> almacenamieno secundario.<br />
Para escoger una estructura <strong>de</strong> archivo se consi<strong>de</strong>ran aspectos tales como:<br />
Características <strong>de</strong> los dispositivos <strong>de</strong> almacenamiento.<br />
Sistema operativo.<br />
Software para la administración <strong>de</strong> los archivos.<br />
Necesida<strong>de</strong>s <strong>de</strong>l usuario para almacenar y accesar datos.
Criterios importantes:<br />
Acceso rápido para la recuperación <strong>de</strong> datos.<br />
Alto rendimiento para las transacciones <strong>de</strong> procesamiento.<br />
Uso eficiente <strong>de</strong>l espacio en disco.<br />
Protección ante pérdida <strong>de</strong> datos y fallas.<br />
Minimización <strong>de</strong> la necesidad <strong>de</strong> reorganización <strong>de</strong> los datos.
Lógicamente, un archivo es una colección <strong>de</strong> registros estructurados, generalmente, en torno a una<br />
clave. Esta organización <strong>de</strong> datos consi<strong>de</strong>ra la visión <strong>de</strong>l programador <strong>de</strong> aplicaciones sobre el archivo,<br />
la cual es in<strong>de</strong>pendiente <strong>de</strong>l dispositivo; interesa más su uso que sus atributos físicos. Dicho<br />
programador <strong>de</strong> aplicaciones es la persona que visualiza un archivo como una colección <strong>de</strong> registros<br />
lógicos, aplicándoles las siguientes operaciones:<br />
Recorrer el archivo<br />
Agregar registros al archivo<br />
Eliminar registros <strong>de</strong>l archivo<br />
Modificar valores <strong>de</strong>l archivo<br />
Or<strong>de</strong>nar el archivo
En la organización lógica <strong>de</strong> una archivo, se distinguen dos conceptos importantes:<br />
a) Registro: correspon<strong>de</strong> a la <strong>de</strong>finición <strong>de</strong> cada uno <strong>de</strong> los registros <strong>de</strong> datos que serán usados <strong>de</strong>ntro<br />
<strong>de</strong> una aplicación, y cuya extensión <strong>de</strong>termina el tipo <strong>de</strong> archivo que lo contiene, el cual pue<strong>de</strong> ser:<br />
Archivo <strong>de</strong> Largo Fijo: el archivo se compone <strong>de</strong> registros <strong>de</strong>l mismo tipo.<br />
Archivo <strong>de</strong> Largo Variable:<br />
El archivo se compone <strong>de</strong> registros <strong>de</strong>l mismo tipo, pero al menos uno <strong>de</strong> los campos<br />
tiene un número <strong>de</strong> ocurrencias variable.<br />
El archivo se compone <strong>de</strong> registros <strong>de</strong>l mismo tipo, pero el largo <strong>de</strong> al menos uno <strong>de</strong> sus<br />
campos es variable.<br />
El archivo se compone <strong>de</strong> registros <strong>de</strong>l mismo tipo, pero uno <strong>de</strong> los campos es opcional<br />
en cuanto a su tipo.<br />
El archivo se compone <strong>de</strong> más <strong>de</strong> un tipo <strong>de</strong> registro.
) Campo o Atributo: ítem <strong>de</strong> dato que <strong>de</strong>scribe una característica <strong>de</strong> la entidad representada por un<br />
registro lógico. Este campo pue<strong>de</strong> tener nombres como:<br />
Clave Candidata: atributo(s) que no soporta(n) valores repetidos, y que por lo mismo, pue<strong>de</strong>(n)<br />
i<strong>de</strong>ntificar en forma única a un registro <strong>de</strong>ntro <strong>de</strong>l archivo.<br />
I<strong>de</strong>ntificador o Clave Primaria:clave candidata escogida como clave <strong>de</strong> acceso principal al archivo,<br />
dado su constante uso en los accesos al mismo.<br />
Clave Alternativa: clave candidata que no es escogida como i<strong>de</strong>ntificador.<br />
Clave Secundaria: atributo que permite valores repetidos.<br />
Clave Inteligente: atributo cuyo contenido permite <strong>de</strong>rivar información adicional <strong>de</strong> la entidad a la<br />
cual pertenece.<br />
Los registros, compuestos <strong>de</strong> diversos atributos, se van a organizar entre sí, para formar lo que se<br />
entien<strong>de</strong> por un archivo. En general, las tres estructuras <strong>de</strong> archivos más comunes son la <strong>secuencial</strong>, la<br />
directa, y el esquema jerárquico (o <strong>de</strong> árbol).
<strong>Archivos</strong> <strong>secuencial</strong>es<br />
Los registros son almacenados en secuencia, uno tras otro. Caracteristicas:<br />
Simple <strong>de</strong> usar.<br />
Conviene cuando se utilizan todos o la mayoria <strong>de</strong> los registros.<br />
El espacio <strong>de</strong> almacenamiento es minimo, solo se almacenan datos.<br />
El or<strong>de</strong>n fisico y logico es el mismo.<br />
Existen dos tipos <strong>de</strong> archivos <strong>secuencial</strong>es: <strong>de</strong>sor<strong>de</strong>nado y or<strong>de</strong>nado.
<strong>Archivos</strong> <strong>secuencial</strong>es <strong>de</strong>sor<strong>de</strong>nados<br />
Los registros se almacenan uno tras otro según or<strong>de</strong>n <strong>de</strong> llegada.<br />
Búsqueda: se realiza en forma lineal.<br />
Inserción: al final <strong>de</strong>l archivo, lo que hace que la operación sea rápida.<br />
Eliminación: se pue<strong>de</strong> realizar <strong>de</strong> dos formas; física y lógica. Si la eliminación es física, será<br />
necesario un corrimiento <strong>de</strong> los datos, lo cual perjudica el rendimiento. Por el contrario si la<br />
operación es lógica se utilizan marcas <strong>de</strong> borrado. Sin embargo, en ambos casos, es necesaria una<br />
reorganización <strong>de</strong> los registros.
<strong>Archivos</strong> <strong>secuencial</strong>es or<strong>de</strong>nados<br />
Los registros se almacenan en forma or<strong>de</strong>nada <strong>de</strong> acuerdo al valor <strong>de</strong> un campo (en la mayoria <strong>de</strong> los<br />
casos clave) <strong>de</strong> or<strong>de</strong>namiento.<br />
Favorece la búsisqueda y generación <strong>de</strong> listados or<strong>de</strong>nados.<br />
Búsqueda: se realiza en forma lineal y binaria .<br />
Inserción: requiere un corrimiento <strong>de</strong> los registros para mantener el or<strong>de</strong>n. Para evitar esto,<br />
existen varias técnicas:<br />
Incluir a cada bloque <strong>de</strong> datos un puntero que direccione a una lista enlazada <strong>de</strong> bloques <strong>de</strong><br />
overflow, don<strong>de</strong> se almacenan los registros en dicha situación.<br />
Utilizar un archivo <strong>de</strong> overflow, el cual en cierta medida se transforma en un archivo <strong>de</strong><br />
transacciones, para almacenar registros. Posteriormente se actualiza el archivo <strong>de</strong> datos<br />
mediante un or<strong>de</strong>namiento y mezcla con el archivo <strong>de</strong> overflow.<br />
Eliminación: al igual que en el caso <strong>de</strong> los archivos <strong>secuencial</strong>es <strong>de</strong>sor<strong>de</strong>nados la eliminación pue<strong>de</strong><br />
ser física o lógica.
Or<strong>de</strong>namiento externo<br />
Los métodos <strong>de</strong> or<strong>de</strong>namiento externo se aplican sobre archivos que no pue<strong>de</strong>n ser almacenados<br />
completamente en memoria principal para su or<strong>de</strong>namiento.<br />
Se habla <strong>de</strong> or<strong>de</strong>namiento externo cuando se utiliza un proceso <strong>de</strong> dos fases: una <strong>de</strong> or<strong>de</strong>namiento y<br />
otra <strong>de</strong> mezcla. La fase <strong>de</strong> or<strong>de</strong>namiento toma datos <strong>de</strong>l archivo (particiones) los <strong>de</strong>ja en memoria<br />
principal, los or<strong>de</strong>na y los retorna al disco. Los registros quedan or<strong>de</strong>nados en forma relativa a la<br />
particion en don<strong>de</strong> se encuentran.<br />
En la fase <strong>de</strong> mezcla se mezclan las particiones generando particiones mas gran<strong>de</strong>s hasta llegar a una<br />
sola: el archivo or<strong>de</strong>nado.
Una variedad <strong>de</strong> operaciones se benefician <strong>de</strong> un conjunto <strong>de</strong> registros or<strong>de</strong>nados.<br />
Por ejemplo:<br />
Una consulta SQL podría requerir una salida or<strong>de</strong>nada <strong>de</strong> los registros que cumplen con alguna<br />
condición.<br />
Select Rut, Nombre, Dirección, Region<br />
From alumnos<br />
Or<strong>de</strong>r BY Region<br />
Al eliminar explícitamente duplicados<br />
Select DISTINCT ciudad<br />
From alumnos<br />
Debido a que no resulta razonable limitar el tamaño <strong>de</strong> un archivo. Cómo es posible or<strong>de</strong>nar los<br />
registros <strong>de</strong> un archivo cuyo tamaño es superior al espacio disponible en memoria principal?
Para tal efecto se consi<strong>de</strong>ra un proceso <strong>de</strong> or<strong>de</strong>namiento y mezcla, mediante el cual el archivo a<br />
or<strong>de</strong>nar se divi<strong>de</strong> y cada una <strong>de</strong> sus partes se or<strong>de</strong>na y mezcla con alguna otra hasta obtener el<br />
resultado esperado.<br />
Es posible realizar lo anterior en una modalidad conocida como dos vías (twoway) siempre que se<br />
cuente con 3 buffers en memoria principal.<br />
Disk<br />
INPUT 1<br />
INPUT 2<br />
Main memory buffers<br />
OUTPUT<br />
Disk
La estrategia <strong>de</strong> solución es la siguiente:<br />
Paso 0.<br />
Se lee cada página <strong>de</strong>l archivo.<br />
Para cada página se realiza un or<strong>de</strong>namiento <strong>de</strong> sus registros.<br />
Se escribe cada página (run) or<strong>de</strong>nada hacia disco.<br />
Paso 1.<br />
.<br />
.<br />
.<br />
.<br />
Paso n.<br />
Seleccionar 2 runs y llevarlas a memoria.<br />
Mezclar sus registros con respecto al criterio <strong>de</strong> or<strong>de</strong>namiento.<br />
Escribir el resultado (run <strong>de</strong> 2 páginas) a disco.<br />
Seleccionar y leer 2 runs escritas en el paso n1<br />
Mezclar sus registros con respecto al criterio <strong>de</strong> or<strong>de</strong>namiento.<br />
Escribir el resultado (run <strong>de</strong> 2 n páginas) a disco.
En cada paso se leen/escriben las<br />
N páginas <strong>de</strong>l archivo.<br />
El número <strong>de</strong> pasos es<br />
1 + log 2 N<br />
Cada paso involucra operaciones<br />
<strong>de</strong> I/O. La cantidad <strong>de</strong> operaciones<br />
<strong>de</strong> I/O es:<br />
2N(1 + log 2 N), el or<strong>de</strong>n <strong>de</strong><br />
magnitud es O(NlogN)<br />
Si disponemos <strong>de</strong> una mayor<br />
cantidad <strong>de</strong> buffers se podría<br />
reducir el número <strong>de</strong> pasos. Qué<br />
suce<strong>de</strong> si se tienen B buffers?<br />
3,4 6,2 9,4 8,7 5,6 3,1 2<br />
3,4 2,6 4,9 7,8 5,6 1,3 2<br />
2,3<br />
4,6<br />
2,3<br />
4,4<br />
6,7<br />
8,9<br />
4,7<br />
8,9<br />
1,2<br />
2,3<br />
3,4<br />
4,5<br />
6,6<br />
7,8<br />
9<br />
1,3<br />
5,6 2<br />
1,2<br />
3,5<br />
6<br />
Input file<br />
PASS 0<br />
1page runs<br />
PASS 1<br />
2page runs<br />
PASS 2<br />
4page runs<br />
PASS 3
. . .<br />
Disk<br />
INPUT 1<br />
INPUT 2<br />
. . .<br />
INPUT B1<br />
OUTPUT<br />
. . .<br />
Consi<strong>de</strong>rando B buffers:<br />
Paso 0.<br />
Se generan N/B runs <strong>de</strong> B páginas cada una, excepto la última que podría tener<br />
menos.<br />
Paso 1....<br />
salida.<br />
Disk<br />
Seleccionar B1 runs <strong>de</strong>l paso anterior.<br />
Realizar una mezcla <strong>de</strong> B1 vías usando la Bésima página como buffer <strong>de</strong>
Al igual que en el caso <strong>de</strong> 2 vías se escriben y leen las N páginas <strong>de</strong>l archivo.<br />
En el paso 0 se escriben N/B runs.<br />
El número <strong>de</strong> pasos adicionales es log B1 N/B. Luego, el total <strong>de</strong> operaciones <strong>de</strong> I/O es 2N<br />
(1+log B1 N/B), el or<strong>de</strong>n <strong>de</strong> magnitud es O(NlogN) pero en base B1<br />
N B=3 B=5 B=9 B=17 B=129 B=257<br />
100 7 4 3 2 1 1<br />
1,000 10 5 4 3 2 2<br />
10,000 13 7 5 4 2 2<br />
100,000 17 9 6 5 3 3<br />
1,000,000 20 10 7 5 3 3<br />
10,000,000 23 12 8 6 4 3<br />
100,000,000 26 14 9 7 4 4<br />
1,000,000,000 30 15 10 8 5 4
Sin embargo, la forma en que se utilizan los buffers pue<strong>de</strong> ayudar a reducir el costo <strong>de</strong> las<br />
operaciones involucradas.<br />
Consi<strong>de</strong>re un disco <strong>de</strong> 10000 páginas y espacio <strong>de</strong> almacenamiento en memoria principal <strong>de</strong><br />
64 páginas. El disco posee una latencia <strong>de</strong> 5ms, seek <strong>de</strong> 10ms y pue<strong>de</strong> transferir una página<br />
en 1ms.<br />
Determine el tiempo requerido para or<strong>de</strong>nar el archivo consi<strong>de</strong>rando:<br />
Caso 1: 63 buffers <strong>de</strong> entrada <strong>de</strong> una página cada uno y un buffer <strong>de</strong> salida <strong>de</strong> una página.<br />
Caso 2: 3 buffers <strong>de</strong> entrada <strong>de</strong> 16 páginas cada uno y un buffer <strong>de</strong> salida <strong>de</strong> 16 páginas.<br />
Caso 3: 13 buffers <strong>de</strong> entrada <strong>de</strong> 4 páginas cada uno y un buffer <strong>de</strong> salida <strong>de</strong> 12 páginas.
Sol.:<br />
In<strong>de</strong>pendiente <strong>de</strong> cada caso en el Paso 0 se leen 10000 páginas en grupos <strong>de</strong> 64 y<br />
luego se escribe cada grupo. Al final <strong>de</strong> este paso se generan 10000/64=157 runs <strong>de</strong> 63<br />
páginas cada una.<br />
Caso 1:<br />
Paso 1: se generan 157/63=3<br />
Paso 2: genera 1 run<br />
tiempo <strong>de</strong> cada paso: (10 + 5 + 1)*10000*2=320 seg<br />
tiempo total: 2*320= 640 seg
Caso 2:<br />
Paso 1: 175/3=53<br />
Paso 2: 53/3=18<br />
Paso 3: 18/3=6<br />
Paso 4: 6/3=2<br />
Paso 5: 2/3=1<br />
tiempo por cada paso: (10+5+(1*16))*2*(10000/16)=38.75 seg<br />
tiempo total: 5*38.75=193.75 seg<br />
Caso 3:<br />
Cantidad <strong>de</strong> pasos: log 13 175=2 :)<br />
tiempo por cada paso: como el buffer <strong>de</strong> entrada es distinto es necesario calcular el<br />
tiempo <strong>de</strong> lectura y escritura por paso.<br />
t_lectura: (10+5+(1*4)*2*(10000/4)=47.5 seg<br />
t_escritura: (10+5+(1*12)*2*(10000/12)=22.52 seg<br />
tiempo total: 2(t_lectura+t_escritura)=140.04 seg
<strong>Archivos</strong> organizados como árboles<br />
Los registros se organizan en bloques los cuales se relacionan en forma jerárquica <strong>de</strong> acuerdo<br />
a un cierto or<strong>de</strong>n entre los valores que contiene cada registro.<br />
Arboles Binarios<br />
La gran ventaja es que permiten búsqueda binaria, pero los tiempos <strong>de</strong> recuperación se<br />
ven afectados por un eventual <strong>de</strong>sbalanceo.<br />
regclave<br />
clave<br />
+<br />
registro completo
Arboles Multiway<br />
P 0<br />
Correspon<strong>de</strong>n a una generalización <strong>de</strong> un árbol binario.<br />
En lugar <strong>de</strong> un registro y 2 punteros, un nodo contiene R registros y R+1 punteros.<br />
Los tiempos <strong>de</strong> recuperación mejoran, pero se requieren operaciones <strong>de</strong> balanceo al<br />
insertar y eliminar un registro.<br />
La estructura <strong>de</strong> un nodo:<br />
K 0<br />
P 1<br />
K 1<br />
K 2<br />
P 2 ................... P n1<br />
Don<strong>de</strong>: P 0 ........P n son apuntadores a nodos <strong>de</strong> subárboles.<br />
K 0 .........K n1 son los valores <strong>de</strong> las claves.<br />
Los valores <strong>de</strong> las claves en un nodo estan en or<strong>de</strong>n ascen<strong>de</strong>nte<br />
K i
Todos los valores <strong>de</strong> las claves que estan en los nodos <strong>de</strong>l subárbol apuntado por P i son menores<br />
al valor <strong>de</strong> la clave K i .<br />
Todos los valores <strong>de</strong> las claves que estan en los nodos <strong>de</strong>l subárbol apuntado por P n son<br />
mayores al valor <strong>de</strong> la clave K n1 .<br />
Los subárboles apuntados por P i también son árboles <strong>de</strong> búsqueda <strong>de</strong> mvías.<br />
Construya un árbol <strong>de</strong> 3 vías dada la siguiente secuencia<br />
501002040153070120140130136
Arboles B<br />
Correspon<strong>de</strong>n a árboles multiway con operaciones <strong>de</strong> balanceo, es <strong>de</strong>cir, son multiway<br />
balanceados.<br />
Se <strong>de</strong>fine un árbol B <strong>de</strong> or<strong>de</strong>n m a aquél árbol que cumple con las<br />
siguientes condiciones:<br />
● Ningún nodo tiene más <strong>de</strong> m hijos.<br />
● Un nodo interno con k hijos contiene k1 registros.<br />
● Todos los nodos terminales se encuentran en el mismo nivel.<br />
Ejercicio: Suponga un archivo <strong>de</strong> 40000 registros organizado como árbol B. El tamaño <strong>de</strong><br />
cada registro es 70 bytes.<br />
Si el disco don<strong>de</strong> se almacena utiliza bloques físicos <strong>de</strong> 1KB y punteros a bloque <strong>de</strong> 6 bytes.<br />
Cuál es el or<strong>de</strong>n <strong>de</strong>l árbol?<br />
Cuantos accesos a disco se necesitan como máximo para recuperar un registro si en<br />
promedio los nodos estan llenos en un 70%?<br />
Cuanto tiempo en i/o se necesitan para la operación anterior? Consi<strong>de</strong>re un disco con<br />
los siguientes parámetros; seek:18ms , latencia: 8.3ms, transferencia: 1229 bytes/ms
<strong>Archivos</strong> Directos<br />
Veremos los relacionados a Direccionamiento Indirecto.<br />
El Direccionamiento Directo es un direccionamiento algorítmico. La i<strong>de</strong>a general es alcanzar un<br />
registro usando una función <strong>de</strong> transformación (hashing) sobre una clave (que i<strong>de</strong>ntifica <strong>de</strong> manera<br />
única a cada registro), lo cual llevará a la posición <strong>de</strong>l registro en el medio <strong>de</strong> almacenamiento.<br />
El espacio <strong>de</strong> almacenamiento es dividido en secciones llamadas buckets.<br />
Un bucket almacena uno o más registros en casilleros <strong>de</strong> tamaño fijo llamados slots.<br />
slot<br />
Bucket<br />
registro1<br />
registro2<br />
registro3<br />
registro4<br />
La cantidad <strong>de</strong> registros en un Bucket <strong>de</strong>fine el factor <strong>de</strong> bloqueo (fb).<br />
La función hashing transforma la clave en una dirección <strong>de</strong> bucket relativa.
Se almacena una tabla en el encabezado <strong>de</strong>l archivo para mantener una correpon<strong>de</strong>ncia con los<br />
bloques físicos.<br />
Este enfoque posee 2 <strong>de</strong>sventajas:<br />
(a) Colisiones: para registros con distinta clave es posible que la función <strong>de</strong> transformación<br />
entregue un mismo valor. Es necesario resolver las colisiones ya que pue<strong>de</strong>n generar overflow.<br />
(b) Zona <strong>de</strong> áreas muertas: la función distribuye <strong>de</strong> forma no equitativa los datos entre los<br />
distintos buckets.<br />
Alternativas para resolver colisiones<br />
(a) Overflow Abierto: en este caso la i<strong>de</strong>a es almacenar el registro que está en colisión en el<br />
siguiente slot disponible.<br />
Ventaja: Minimización <strong>de</strong> áreas muertas.<br />
Desventaja: Búsqueda lineal <strong>de</strong> registros en colisión.
(b) Enca<strong>de</strong>namiento: en este caso un bucket sirve como nexo hacia un bucket <strong>de</strong> overflow cuando<br />
sea necesario. Existen dos tipos <strong>de</strong> enca<strong>de</strong>namiento:<br />
● Unificado: bucket <strong>de</strong> overflow es compartido por varios buckets que tienen overflow.<br />
● Exclusivo: cada bucket tiene potencialmente un bucket <strong>de</strong> overflow exclusivo.<br />
registro1<br />
registro2<br />
registro3<br />
registro4<br />
registro5<br />
registro6<br />
Overflow Unificado<br />
Overflow<br />
registro1<br />
registro2<br />
registro3<br />
registro4<br />
registro5<br />
registro6<br />
Overflow Exclusivo<br />
Overflow<br />
Overflow
Todo lo anterior implica:<br />
● Un espacio <strong>de</strong> direcciones fijo.<br />
● Lo normal es que los archivos cambien.<br />
I<strong>de</strong>a: Proponer un mecanismo que permita la expansión dinámica <strong>de</strong>l archivo.<br />
Hashing Dinámico<br />
i<strong>de</strong>a: llegar a los datos por medio <strong>de</strong> estructura <strong>de</strong> acceso jerárquica. Características:<br />
● El número <strong>de</strong> buckets no es fijo.<br />
● Se pue<strong>de</strong> partir con un solo bucket.<br />
● Cuando un bucket se encuentra en overflow se divi<strong>de</strong> en dos buckets consi<strong>de</strong>rando como<br />
criterio <strong>de</strong> división el valor <strong>de</strong>l bit más significativo <strong>de</strong> lo entregado por la función <strong>de</strong><br />
transformación. En este caso se crea una estructura <strong>de</strong> árbol o directorio.
Existen 2 tipos <strong>de</strong> nodo:<br />
nodo interno: guían la búsqueda.<br />
nodo hoja: apuntan hacia un bucket.<br />
0<br />
1<br />
nodo interno<br />
Ejemplo: Suponer buckets con fb=4. Crear un archivo directo en base a:<br />
7 000111<br />
41 101001<br />
21 010101<br />
48 110000<br />
43 101011<br />
6 000110<br />
16 010000<br />
15 001111<br />
42 101010<br />
25 011001<br />
18 010010<br />
20 010100<br />
nodo<br />
hoja
7 000111<br />
41 101001<br />
21 010101<br />
48 110000<br />
43 101011<br />
6 000110<br />
16 010000<br />
15 001111<br />
42 101010<br />
25 011001<br />
18 010010<br />
20 010100<br />
7<br />
41<br />
21<br />
48<br />
Al ingresar 43 el bucket entra en overflow. A<strong>de</strong>más, es<br />
posible ingresar 6 y 16 sin problemas.<br />
0<br />
1<br />
7<br />
21<br />
6<br />
16<br />
41<br />
48<br />
43
7 000111<br />
41 101001<br />
21 010101<br />
48 110000<br />
43 101011<br />
6 000110<br />
16 010000<br />
15 001111<br />
42 101010<br />
25 011001<br />
18 010010<br />
20 010100<br />
Al ingresar 15 hay overflow!!<br />
0<br />
1<br />
0<br />
1<br />
A<strong>de</strong>más, es posible ingresar 42, 25 y 18 sin problemas.<br />
41<br />
48<br />
43<br />
42<br />
7<br />
6<br />
15<br />
21<br />
16<br />
25<br />
18
7 000111<br />
41 101001<br />
21 010101<br />
48 110000<br />
43 101011<br />
6 000110<br />
16 010000<br />
15 001111<br />
42 101010<br />
25 011001<br />
18 010010<br />
20 010100<br />
Al ingresar 20 hay overflow!!<br />
0<br />
1<br />
0<br />
1<br />
41<br />
48<br />
43<br />
42<br />
0<br />
1<br />
7<br />
6<br />
15<br />
21<br />
16<br />
18<br />
20<br />
25
Hashing Extendido<br />
I<strong>de</strong>a: Consi<strong>de</strong>rar una estructura <strong>de</strong> acceso tipo arreglo.<br />
Características:<br />
● La estructura <strong>de</strong> acceso es un arreglo <strong>de</strong> 2^d direcciones <strong>de</strong> buckets.<br />
● d es la profundidad global <strong>de</strong>l directorio.<br />
● Se suponen buckets <strong>de</strong> tamaño fijo.<br />
● En caso <strong>de</strong> overflow es necesario doblar el tamaño <strong>de</strong>l directorio.<br />
● La estructura <strong>de</strong> acceso se construye consi<strong>de</strong>rando el bit menos significativo.
Ejercicio: Consi<strong>de</strong>rando las siguientes transformaciones <strong>de</strong> claves, Construya un archivo utilizando<br />
hashing extendido.<br />
ed 111010001010<br />
tom 001101101000<br />
sam 111100010100<br />
ann 010011010001<br />
kim 100111010100<br />
kely 011011011110<br />
mindy 110111000101<br />
mark 110001011001<br />
chris 111001110011<br />
laura 001011010101<br />
sue 101110001100<br />
jill 111000110010<br />
amy 111000011101<br />
Inicialmente<br />
d=0. fb=4.<br />
ed .....1010<br />
tom .....1000<br />
sam .....0100<br />
ann .....0001
ed 111010001010<br />
tom 001101101000<br />
sam 111100010100<br />
ann 010011010001<br />
kim 100111010100<br />
kely 011011011110<br />
mindy 110111000101<br />
mark 110001011001<br />
chris 111001110011<br />
laura 001011010101<br />
sue 101110001100<br />
jill 111000110010<br />
amy 111000011101<br />
Al agregar kim existe overflow. El tamaño <strong>de</strong>l directorio se <strong>de</strong>be doblar. d=1<br />
0<br />
1<br />
ed .....1010<br />
tom .....1000<br />
sam . ....0100<br />
kim .....0100<br />
ann .....0001
ed 111010001010<br />
tom 001101101000<br />
sam 111100010100<br />
ann 010011010001<br />
kim 100111010100<br />
kely 011011011110<br />
mindy 110111000101<br />
mark 110001011001<br />
chris 111001110011<br />
laura 001011010101<br />
sue 101110001100<br />
jill 111000110010<br />
amy 111000011101<br />
Al agregar kely hay overflow. Ahora d=2<br />
A<strong>de</strong>más, es posible agregar mindy, mark y chris sin problemas!!!<br />
00<br />
01<br />
10<br />
11<br />
tom .....1000<br />
sam .....0100<br />
kim .....0100<br />
ed .....1010<br />
kely .....1110<br />
ann .....0001<br />
mindy .....0101<br />
mark .....1001<br />
chris .....0011
ed 111010001010<br />
tom 001101101000<br />
sam 111100010100<br />
ann 010011010001<br />
kim 100111010100<br />
kely 011011011110<br />
mindy 110111000101<br />
mark 110001011001<br />
chris 111001110011<br />
laura 001011010101<br />
sue 101110001100<br />
jill 111000110010<br />
amy 111000011101<br />
Al agregar laura hay overflow. Sin<br />
embargo, no es necesario doblar el<br />
directorio sino crear un nuevo buket<br />
A<strong>de</strong>más, es posible agregar sue y jill<br />
sin problemas!!<br />
00<br />
01<br />
10<br />
11<br />
tom .....1000<br />
sam .....0100<br />
kim .....0100<br />
sue .....1100<br />
ed .....1010<br />
kely .....1110<br />
jill .....0010<br />
ann .....0001<br />
mindy .....0101<br />
mark .....1001<br />
laura .....0101<br />
chris .....0011
ed 111010001010<br />
tom 001101101000<br />
sam 111100010100<br />
ann 010011010001<br />
kim 100111010100<br />
kely 011011011110<br />
mindy 110111000101<br />
mark 110001011001<br />
chris 111001110011<br />
laura 001011010101<br />
sue 101110001100<br />
jill 111000110010<br />
amy 111000011101<br />
000<br />
001<br />
010<br />
011<br />
100<br />
101<br />
110<br />
111<br />
tom .....1000<br />
sam .....0100<br />
kim .....0100<br />
sue .....1100<br />
ed .....1010<br />
kely .....1110<br />
jill .....0010<br />
ann .....0001<br />
mark .....1001<br />
mindy .....0101<br />
laura .....0101<br />
amy .....1101<br />
chris.....0011
Hashing Lineal<br />
● No consi<strong>de</strong>ra una estructura <strong>de</strong> acceso tipo índice.<br />
● Su uso se basa en la existencia <strong>de</strong> M buckets, numerados <strong>de</strong>s<strong>de</strong> 0 hasta M1, los cuales<br />
van recibiendo registros <strong>de</strong> acuerdo a una función hashing h 0 .<br />
● En el momento en que alguno <strong>de</strong> los buckets se llena, se crea un bucket M en el cual se<br />
reparten los datos <strong>de</strong>l bucket 0, aplicando la función hashing h 1 . Este esquema se sigue<br />
repitiendo a medida que el archivo crece <strong>de</strong> tamaño.
Criterios para la selección <strong>de</strong> la estructura <strong>de</strong> un archivo<br />
En algunas aplicaciones es evi<strong>de</strong>nte cuál organización y método <strong>de</strong> acceso son los más<br />
a<strong>de</strong>cuados. Sin embargo conviene tener presente algunos criterios para hacer una selección más<br />
fundamentada.<br />
Actividad<br />
Número <strong>de</strong> registros <strong>de</strong>l archivo usados en un proceso. Cuando la actividad es alta se<br />
recomienda un archivo <strong>secuencial</strong>, en caso contrario acceso directo.<br />
Volatilidad<br />
Número <strong>de</strong> registros insertados o eliminados en un archivo. Si la tasa <strong>de</strong> volatilidad es alta<br />
se recomienda un archivo <strong>secuencial</strong> <strong>de</strong>sor<strong>de</strong>nado para que los nuevos registros vayan<br />
quedando almacenados al final.
Tipos <strong>de</strong> consultas<br />
Simple: <strong>de</strong>pto='informatica'<br />
Rango: sueldo>1000000<br />
Lógica: <strong>de</strong>pto='informatica' y sueldo>1000000<br />
Patrones: <strong>de</strong>pto='ing%'<br />
En consultas simples conviene un archivo <strong>secuencial</strong> or<strong>de</strong>nado sobre el atributo <strong>de</strong> la consulta,<br />
favorece búsqueda binaria, también pue<strong>de</strong> ser directo o <strong>de</strong> tipo árbol si la clave es única.<br />
Para rango es aconsejable <strong>secuencial</strong> or<strong>de</strong>nado sobre el atributo <strong>de</strong> consulta y esquemas<br />
directos que preserven el or<strong>de</strong>n.<br />
En consultas lógicas <strong>de</strong>pen<strong>de</strong>rá si los componentes son simples o rangos.<br />
Para búsqueda <strong>de</strong> patrones las posibilida<strong>de</strong>s son las mismas que para las consultas simples.
Volumen <strong>de</strong>l archivo<br />
Número <strong>de</strong> registros que componen el archivo. Si el número es alto entonces archivo directo, <strong>de</strong> lo<br />
contrario <strong>secuencial</strong>.