Академический Документы
Профессиональный Документы
Культура Документы
Diego Gutirrez
Tema 22. Mezcla binaria de ficheros y vectores
ordenados
3
Diego Gutirrez
Recorrido simultneo de dos ficheros
Ejemplo: Comparacin de dos ficheros secuenciales.
Dados dos ficheros de datos de tipo tpFichero, parmetros del
procedimiento, devolver a travs de un tercer parmetro un valor
lgico cierto si y slo si los contenidos de ambos ficheros son
idnticos.
Para ello es necesario que ambos ficheros tengan el mismo nmero
de datos almacenados y que sus elementos homlogos sean iguales.
4
Diego Gutirrez
algoritmo sonIguales (ES f,g:tpFichero; ES loSon:booleano)
{ Pre: ---
Post: El parmetro loSon toma un valor cierto si y slo los ficheros f y g
almacenan secuencias idnticas de datos }
variables
datoF,datoG: tpD;
iguales: booleano;
principio
iniciarLectura(f); iniciarLectura(g);
{ Resolucin del problema para dos secuencias vacas }
iguales:= cierto;
mientrasQue finFichero(f) Y finFichero(g) Y iguales hacer
{ Compara los siguientes elementos de f y g y actualiza la solucin del problema
(valor de iguales) }
leer(f,datoF); leer(g,datoG);
iguales:= (datoF=datoG);
finMQ
loSon:= (iguales Y finFichero(f) Y finFichero(g));
Fin.
5
Diego Gutirrez
Gestin
6
Diego Gutirrez
Mezcla de dos ficheros secuenciales ordenados
Mezcla de los datos almacenados en dos ficheros secuenciales
ordenados para obtener un tercer fichero secuencial que
almacene una secuencia de datos, tambin ordenados, que
integre los datos almacenados en los dos primeros ficheros y slo
stos.
7
Diego Gutirrez
La principal dificultad del algoritmo a disear radica en la forma
de acceso a los datos de los dos ficheros a mezclar:
Estos deben ser ledos y almacenados temporalmente en dos
variables que han sido denominadas dato1 y dato2.
El proceso de mezcla se desarrolla comparando los valores de estas
dos variables hasta que se alcanza el final de uno de los dos ficheros.
En ese momento no hay que olvidar que adems, de los datos que
restan de ser ledos en el otro fichero, quedan tambin por ser
aadidos al fichero f los datos almacenados temporalmente en las
variables dato1 y dato2.
8
Diego Gutirrez
9
Diego Gutirrez
dato1
dato2
10
Diego Gutirrez
dato1
dato2
11
Diego Gutirrez
dato1
dato2
12
Diego Gutirrez
dato1
dato2
13
Diego Gutirrez
dato1
dato2
14
Diego Gutirrez
dato1
dato2
15
Diego Gutirrez
dato1
dato2
16
Diego Gutirrez
dato1
dato2
17
Diego Gutirrez
dato1
dato2
18
Diego Gutirrez
dato1
dato2
19
Diego Gutirrez
dato1
dato2
20
Diego Gutirrez
dato1
dato2
21
Diego Gutirrez
dato1
dato2
22
Diego Gutirrez
dato1
dato2
Se alcanza el final de f2
23
Diego Gutirrez
dato1
dato2
Se comparan los valores de dato1 y dato2
(igual que antes). Una vez escrito dato2
24
Diego Gutirrez
dato1
se copia el resto del fichero que
an no ha terminado
25
Diego Gutirrez
El algoritmo realiza la mezcla en dos etapas:
En la primera itera copiando en el fichero f los datos
correspondientes de los otros dos ficheros f1 y f2 hasta llegar
al final de al menos uno de los dos
En cada iteracin se toma un dato de cada uno de estos ficheros
como candidato a ser copiado en f. Se copia el que presenta un
menor valor de su medida (segn el criterio de comparacin)
En la segunda etapa se contina el proceso de comparacin y
copia hasta copiar el ltimo dato de uno de los ficheros. Se
procede a continuacin a copiar en f los datos restantes que
an no han sido copiados del otro fichero.
26
Diego Gutirrez
algoritmo mezclarFicheros (ES f1,f2,f: tpFichero)
{ Pre: Los datos almacenados en f1 y en f2 estn ordenados en sentido creciente
segn
Post: f es un fichero cuyos datos estn ordenados en sentido creciente segn y
son el resultado de mezclar todos los datos almacenados en los ficheros f1 y f2 }
variables
dato1,dato2: tpD;
27
Diego Gutirrez
Si hay datos, se lee un dato de cada fichero
28
Diego Gutirrez
Si algn fichero no tiene datos, se copia
el otro
29
Diego Gutirrez
principio { de mezclarFicheros }
iniciarLectura(f1); iniciarLectura(f2); iniciarEscritura(f);
si finFichero(f1) entonces { el fichero f1 contiene, al menos, un dato }
leer(f1,dato1);
si finFichero(f2) entonces { el fichero f2 contiene, al menos, un dato }
leer(f2,dato2);
si_no { el fichero f2 no almacena ningn dato }
escribir(f,dato1); copiarResto(f1,f);
finSi
si_no { el fichero f1 no almacena ningn dato }
copiarResto(f2,f);
finSi
fin
Instrucciones de mezcla
30
Diego Gutirrez
Mientras queden datos en ambos ficheros,
leemos, escribimos, avanzamos
31
Diego Gutirrez