Aloritmos

Solo disponible en BuenasTareas
  • Páginas : 5 (1013 palabras )
  • Descarga(s) : 0
  • Publicado : 15 de marzo de 2011
Leer documento completo
Vista previa del texto
Archivo Secuencial Indexado Andrés Arcia Un archivo secuencial indexado esta básicamente compuesto de una estructura secuencial, que se llamará archivo maestro y uno o más archivos índices. Los archivos índices, se encargarán de dar un acceso más rápido a los datos almacenados en el archivo secuencial. La rapidez del archivo depende, comparativamente con otros archivos, del numero de registros.Cada registro de un archivo índice se corresponde con un bloque de otro archivo índice o con un bloque en el archivo principal. Esto implica que cuando se quiere extraer información precedida por un índice, tiene que cargarse toda la información a la que el índice apunta. El tamaño de esta información es el tamaño del bloque. Estructuras y variables necesarias: registro_maestro bool disponible;long proximo; Registro_Data data; registro_indice Registro_Data::Clave clave; long tamaño_bloque; Estructura del índice maestro (primer índice) registro_indice * indice_maestro (será un arreglo de registros índice) long tamaño_ppal; long tamaño_desb; string nombre_ppal; string nombre_desb; string * archivos_indice; // vector de nombres de archivos índice. int niveles; // numero de archivos índice.Calculos internos: long elem_indices; // numero de elementos en indices. long tam_reg_ppal; long tam_reg_indice; long num_bloques_ppal; long num_reg_blq; long num_reg_blq_ind; long num_reg_ppal;

long num_reg_desb; long num_reg_disp_desb; long tam_indice_maestro; Existen algunos métodos que nos ayudarán a llevar a cabo esta tarea: int crear_indice(string &) int subir_indice_maestro() Por otrolado están las rutinas de acceso público para operar sobre los archivos: Constructor() crear() abrir() vaciar() buscar() Por último están un conjunto de rutinas que sirven de soporte a las anteriores para poder extraer y depositar información en los archivos en forma de bloques.

El método crear se encarga de crear un archivo maestro para la organización ISAM a partir de otro archivo de entrada.Podemos llamar entonces al archivo de entradas como: entrada y nuestro archivo maestro: maestro. De aquí salen un archivo maestro, un archivo de desborde y un archivo de índices. crear() 1. abrir entrada 2. num_reg_ppal = 0 3. R.M. (!entrada.eof()) 3.1 LEER_SEC(entrada, R) 3.2 reg_ppal.data = R, reg_ppal.disp=falso, reg_ppal.prox=-1 3.3 r = ESCRIBIR_PPAL(maestro, num_reg_ppal, ®_ppal, 1) 3.4 Si(r = Verdadero) 3.4.1 num_reg_ppal ++ 4. tam_ppal = num_reg_ppal 5. cerrar entrada 6. num_blq_ppal = techo(num_reg_ppal/num_reg_blq) 7. abrir desborde 8. reg_desb.disp = verdadero 9. num_reg_desb = num_reg_ppal * 0.20 10. R.P. (n_disp = 0; n_disp < num_reg_desb; disp++) 10.1 r=ESCRIBIR_PPAL(desborde, n_disp, reg_desb, 1) 10.2 Si (r == Verdadero) 10.2.1 pila_disponible.push(n_disp) 11.cerrardesborde 12.crear_indices(maestro)

crear_indices() Son necesarios: reg_indice reg_maestro 1. niveles = techo (log (num_blq_ppal) / log (tam_buffer / tam_reg_indice)) ? 2. Construir un arreglo de nombres de índices (nom_indices) 3. R.P. (i=0, j=0; i=0; i--) 5.1 reg_leidos = LEER_REG_IND(nom_indice[i], iblq, vec_reg_ind, num_reg_blq_ind) 5.2 j=0 5.3 encontro = falso 5.4 R.M. ((j < reg_leidos -1) &&encontro == falso) 5.4.1 Si (dato < vec_reg_ind[j+1].clave) 5.4.1.1 encontro = verdadero 5.4.1.2 iblq = vec_reg_ind[j].ind_bloque si no 5.4.1.3 j++ 5.5 Si (encontro = falso) 5.5.1 iblq = vec_reg_ind[j].ind_bloque En este punto obtenemos el indice en el Archivo Maestro. // Preparación del Registro para ser almacenado 7. Crear arreglo de registros del tamaño del bloque (v_reg). 8. reg_leidos =leer(maestro, iblq, v_reg, num_reg_blq) // Verificar si hay una localidad disponible en el area principal // También se determina el sitio donde va almacenado i=0; encontro = falso; num_disp = 0; pos = reg_leidos – 1; libre = -1; band = falso

R.M. (i < reg_leidos) 9.1Si (v_reg[i].disp = verdadero ^ libre = -1) 9.1.1 libre = i 9.2Si (dato.clave < v_reg[i].data.clave ^ band = falso) 9.2.1 pos = i – 1...
tracking img