Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
FACULTAD DE INGENIERIA
INGENIERIA EN SISTEMAS
LICENCIATURA EN ANLISIS DE SISTEMAS
(75.41 / 75.04)
ALGORITMOS Y PROGRAMACION II
Tener aprobada la materia correlativa- segn el programa de estudios vigente a la fecha que la ctedra y/o
facultad lo determine
Aprobar el parcial - en alguna de sus 3(tres) instancias y el examen integrador. Cada uno contendr una parte
terica y una parte practica. Los alumnos debern aprobar la parte terica y la parte practica para que el parcial o
el examen integrador se considere aprobado.
Aprobar los 2(dos) trabajos prcticos en fecha y forma segn lo disponga la ctedra.
CONTENIDO
UNIDAD 1: PARADIGMA DE PROGRAMACION: ABSTRACCION
Nocin de tipos de datos abstractos. Encapsulamiento. Niveles de abstraccin. Concepto de Primitivas. Pre y Post
Condiciones. Implementaron de tipos de datos en Pascal: Array, Records, Punteros, Archivos. Funciones y
Procedimientos. Compiladores. Almacenamiento
Bibliografa:
"Pascal para Estudiantes" - Coleccin Ciencia Informtica (Biblioteca FIUBA)
"Data Structures with abstract data types and Pascal" D. Stubbs. Brooks/Cole
"Estructuras de Datos. Algoritmos, Abstraccin, Objetos" J Aguilar. Mc Graw Hill
"Diseo de Compiladores" Aho Hopcroft. Ullman- Cap. 1
UNIDAD 2: ESTRUCTURAS DE DATOS Y TIPO DE DATOS
Diseo e implementaron de estructuras de datos. Cursores. Conocimiento de estructuras dinmicas. Listas . Pilas. Colas.
Arboles. B-tree, AVL. Grafos. Implementacin con punteros y con arreglos. Recursividad. Concepto de prioridad.
Bibliografa:
"Estructuras de datos y Diseo de Programas" R. Kruse. Printice Hall
"Estructuras de datos en C" D. Tenenbaun. Printice Hall
"Estructuras de Datos y Pascal" N. Dale- S. Lilly. Mc Graw Hill
"Data Structures with abstract data types and Pascal" D. Stubbs. Brooks/Cole
"Estructuras de Datos. Algoritmos, Abstraccion, Objetos" J Aguilar. Mc Graw Hill
ii
INDICE
COMPILADORES............................................................................................................................................................................................................................ 1
TIPOS DE DATOS ........................................................................................................................................................................................................................... 2
ARCHIVOS ....................................................................................................................................................................................................................................... 3
RECURSIVIDAD ............................................................................................................................................................................................................................. 5
PUNTEROS....................................................................................................................................................................................................................................... 6
EJERCITACIN - SOLUCIONES ................................................................................................................................................................................................ 8
SORT INTERNO ............................................................................................................................................................................................................................ 13
SORT EXTERNO ........................................................................................................................................................................................................................... 18
MERGE............................................................................................................................................................................................................................................ 21
RBOLES B-TREE........................................................................................................................................................................................................................ 25
EJERCITACIN - SOLUCIONES .............................................................................................................................................................................................. 28
EJERCITACIN ADICIONAL .................................................................................................................................................................................................... 30
PROGRAMACIN ORIENTADA A OBJETOS ....................................................................................................................................................................... 32
EJERCITACION ............................................................................................................................................................................................................................ 36
CASO RESUELTO ......................................................................................................................................................................................................................... 36
iii
A L G O R I T M O S
P R O G R A M A C I N
I I
Captulo 1
T E O R I A
COMPILADORES
program identificador
uses identificadores
label lista de etiquetas
const
definiciones de constantes
type
declaracin de tipos de datos definidos por el usuario
var
declaracin de variables
procedure
definiciones de procedimientos
function
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
definiciones de funciones
begin
(cuerpo del programa)
sentencias
end.
Las cinco secciones de declaracin -label, const, type, var y procedure y/o function-, as como
la clusula uses, no tienen que existir en todos los programas. Sin embargo, Turbo Pascal
presenta flexibilidad a la hora de escribirlas -se puede hacer en cualquier orden-, mientras que
Pascal estndar (ISO Pascal) requiere la escritura en el orden de la Figura 3.1 (con la excepcin
de uses que no existe en ISO Pascal). Las secciones de declaraciones estn seguidas por el
cuerpo del programa o programa principal que siempre existir y que constar de un nmero
determinado de sentencias. No obstante, y pese a la facilidad de Turbo Pascal de permitirle
mezclar en cualquier orden las declaraciones, le recomendaremos seguir siempre el orden
establecido, le evitan en el futuro numerosos problemas.
TIPOS DE DATOS
Todos los datos tienen un tipo asociado a ellos, lo cual permite trabajar con los datos. Si el compilador
no conoce el tipo de datos asociado a un dato, es decir si es entero o real, carcter o bolean, no podr
ejecutar correctamente las operaciones realizadas al dato. La asignacin de tipos a los datos tiene dos
objetivos principales: detectar errores de operaciones en programas y determinar como ejecutar las
operaciones. Pascal se conoce como lenguaje fuertemente tipificado que significa que los datos
utilizados deben tener sus tipos declarados explcitamente y el lenguaje limita la mezcla de tipos en
las expresiones. Pascal detecta muchos errores de programacin antes que el programa se ejecute. El
tipo de dato determina la naturaleza del conjunto de valores que puede tomar una variable y el espacio
de memoria ocupado por una variable del tipo dado.
Clasificacin
Datos estticos
o
Tipos simples: byte, integer, longint, shortint, word, real, char, boolean, definidos
por el usuario (enumerado, subrango) .
Datos dinmicos
o
Tipos puntero.
Estructuras de Control
Selectivas:
Repetitivas
Sentencia if
Sentencia case
Sentencia while
Sentencia repeat
Sentencia for
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
Captulo 2
ARCHIVOS
Tipo : FILE
Componentes
Los componentes de un FILE son todos del mismo tipo. Como un ARRAY, un FILE es una
estructura homognea de datos almacenados en memoria secundaria. A diferencia de un
ARRAY, el tamao de un FILE es variable del modo que puede cambiar durante la ejecucin
de un programa y la existencia de un FILE puede ser independiente de cualquier programa.
Los componentes de un FILE pueden ser de cualquier tipo excepto File o un tipo estructurado
que contenga el tipo File. Pascal automticamente reserva un buffer por cada declaracin del
tipo File. Un programa no sabe con exactitud el lugar donde residirn los datos, es decir donde
residir el archivo fsico. El programa enva y recibe informacin desde y hacia el archivo,
apoyndose en el Sistema Operativo. El programa referencia indirectamente al archivo fsico
utilizando para ello un nombre lgico que denominamos archivo lgico
Estructura
Los componentes de un FILE tienen una estructura linear y pueden ser accedidos
secuencialmente (un registro y luego otro) y de forma directa. (se accede a un registro sin
necesidad de acceder a su predecesor)
Declaracin
Type
tipo_de_datos =
archivo = file of tipo_de_datos;
Var
arch : archivo
Operaciones
1. Vincular el archivo fsico (que est en memoria secundaria) con el nombre lgico que se
utilizar dentro del algoritmo.
PROCEDURE ASSIGN (var F : FILE; FF: STRING);
Asigna el nombre de un archivo externo(fsico) FF a una variable F del tipo file(lgico)
2. Apertura y creacin de un archivo para su procesamiento
PROCEDURE RESET (VAR F: FILE);
Abre un archivo existente para lectura y escritura
PROCEDURE REWRITE (VAR F: FILE);
Crea y Abre un nuevo archivo slo para escritura
PROCEDURE APPEND(VAR F: TEXT);
Abre un archivo de texto para escritura
3. Cerrar un archivo luego de operar con el mismo
PROCEDURE CLOSE (VAR F: FILE);
Cierra el archivo F y coloca la marca que indica su finalizacin.
4. Leer los elementos contenidos en un archivo
PROCEDURE READ (F: FILE; V1[,V2,...,VN] );
Lee de un archivo f las variables v1 hasta vn
PROCEDURE READLN (F: TEXT; V1[,V2,...,VN] );
Ejecuta el procedimiento read hasta la marca de fin de lnea
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
Captulo 3
RECURSIVIDAD
Un subprograma (procedimiento o funcin) recursivo es aquel que se llama as mismo. En
Pascal los procedimientos y las funciones pueden ser definidos de modo recursivo. La
recursividad es una alternativa a la iteracin o repeticin. y aunque en tiempo de computadora y
en ocupacin en memoria es la solucin recursiva menos eficiente que la solucin iterativa,
existen numerosas situaciones en las que la recursividad es una solucin simple y natural a un
problema que en caso contrario ser difcil de resolver. Por esta razn se puede decir que la
recursividad es una herramienta potente y til en la resolucin de problemas que tengan
naturaleza recursiva y, por ende, en la programacin.
Existen numerosas definiciones de recursividad, algunas de las ms importantes o sencillas son
stas:
Un objeto es recursivo si figura en su propia definicin.
Una definicin recursiva es aquella en la que el objeto que se define forma parte de la
definicin (recuerde la regla gramatical: lo definido nunca debe formar parte de la definicin)
La caracterstica importante de la recursividad es que siempre existe un medio de salir de la
definicin, mediante la cual se termina el proceso recursivo. En Pascal los procedimientos y
funciones pueden ser definidos de modo recursivo, es decir, pueden llamarse a si mismos.
Un ejemplo sencillo es la definicin de factorial n!
N! = { 1 si n = 0 ; n*(n-1)*(n-2)* ... * 1 si n > 0 }
Para el caso de n= 5
5! = 5*(5-1)*(5-2)*(5-3)*(5-4)*(5-5)= 5*4*3*2*1 = 120
o tambin puede expresarse como
5! = 5 *4!
Generalizando
N! = { 1 si n=0 ; n*(n-1)! Si n > 0 }
As podemos establecer
condicin de salida como n=0
la parte recursiva como n! = n*(n-1)!
function factorial (n : integer) : integer
pre: n est definida y n>=0
post: factorial (n) = n!
begin
if (n= 0 ) then factorial :=1
else factorial := n * factorial (n-1);
end;
Tipos de recursividad
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
Captulo 4
PUNTEROS
Todas las variables y estructuras de datos pueden clasificarse en
estticas y dinmicas. Con una variable esttica la cantidad de
memoria ocupada debe ser declarado por anticipado y no puede
ser incrementado durante la ejecucin del programa si se necesitara ms espacio de memoria.
Un array de requisitos es esttico dado que la cantidad exacta de memoria se fija por la
declaracin del tamao del array. Esta falta de flexibilidad puede ser una desventaja notable.
As, por ejemplo, si en un array de registros se declara para un tamao mximo de 1.000
registros, el programa no funcionar si se deben almacenar ms de 1.000 registros en ese array.
Por otra parte, si el tamao mximo declarado para un array es mucho mayor que el total de
espacio de memoria requerido, el programa utilizar ineficientemente la memoria, dado que la
cantidad de memoria especificada en la declaracin se reservar. incluso aunque solo se utilice
una pequea parte.
Los punteros (apuntadores) permiten la creacin de estructuras de datos dinmicas:
estructuras de datos que tienen capacidad de variar en tamao y ocupar tanta memoria como
utilicen realmente. Las variables que se crean y se destruyen durante la ejecucin se llaman
variables dinmicas (tambin annimas). As durante la ejecucin de un programa puede haber
una posicin de memoria especifica asociada con una variable dinmica y posteriormente
puede no existir ninguna posicin de memoria asociada con ella.
Pascal proporciona los mtodos para asignar y liberar espacio de memoria utilizando
punteros y los procedimientos predefinidos new y dispose.
Al contrario que las estructuras de datos estticas, tales como arrays cuyos tamaos y
posiciones de memoria asociados se fijan en tiempo de compilacin, las estructuras dinmicas
de datos se amplan (expanden)o reducen (contraen) a medida que se requiera durante la
ejecucin y cambia sus posiciones de memoria asociada
Una estructura de datos dinmica es una coleccin de elementos llamados nodos de la
estructura - normalmente de tipo registro - que se enlazan o encadenan juntos. Este enlace se
establece asociando con cada nodo un puntero que apunta al nodo siguiente.
Existen diferentes tipos de estructuras dinmicas de datos, siendo las ms notables y
significativas las listas enlazadas, los rboles y los grafos.
Las estructuras de datos dinmicas son tiles especialmente para almacenar y procesar
conjuntos de datos cuyos tamaos cambian durante la ejecucin del programa, por ejemplo el
conjunto de trabajo que se han introducido en una computadora y estn esperando su ejecucin
o el conjunto de nombres de pasajeros y asignacin respectiva de asientos de un vuelo de avin
determinado.
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
Captulo 5
EJERCITACIN - SOLUCIONES
Archivos
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
begin
read(alumnos,alumno.padron);
read(alumnos,alumno.nombre);
readln(alumnos,alumno.carrera);
total :=0; cant :=0; p :=0;
if padronaux < alumno.padron then read(materias,padronaux);
while not eof(materias) and (padronaux = alumno.padron) do
begin
read(materias,materia.materia);
read(materias,materia.nota);
readln(materias);
total := total + materia.nota;
cant := cant + 1;
read(materias,materia.padron);
padronaux := materia.padron;
end;
if total <> 0 then p := total div cant;
promedio.padron := alumno.padron;
promedio.nombre := alumno.nombre;
promedio.promedio := p;
write(promedios,promedio.padron);
write(promedios,promedio.nombre);
write(promedios,promedio.promedio);
writeln(promedios);
end;
close(alumnos);
close(materias);
close(promedios);
readln;
end.
Punteros
type
puntero = ^ nodo;
nodo = record
info
: char;
arriba,abajo
: puntero;
end;
var
p,q,r
: puntero;
Mostrar con diagramas lo que escribe el siguiente segmento de cdigo:
new(p); new(q); new(r);
p^.info :='B';
p^.abajo :=q;
q^.abajo := r;
q^.info := 'C';
r^.info := 'A';
r^.abajo := p;
r^.arriba := q;
9
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
q^.arriba := p;
p^.arriba := r;
p^.abajo^.abajo := p;
q^.info := q^.abajo^.info;
p := q ;
p^.arriba^.info := 'D';
writeln (p^.info,q^.info, r^.info);
Resultado: BBA
Tabla de Direcciones:
Estado inicial p = 0; q = 1; r = 2;
Estado final p = 1; q = 1; r = 2; *cambio por la sentencia p := q;
Tabla de informacin
Estado inicial
Dir
Nodo Arriba
0
B
2
1
C
0
2
A
1
Estado final
Dir
Nodo Arriba
0
D
2
1
B
0
2
A
1
Abajo
1
2
0
Abajo
1
0
0
Recursividad
Realizar un procedimiento recursivo para obtener el mximo comn divisor
function mcd(x,y : integer): integer;
begin
if y = 0 then mcd:= x
else mcd := mcd(y,x mod y);
end;
Dado el siguiente procedimiento recursivo, hacer el seguimiento y mostrar la salida.
Procedure IMPRYPERM(X,Y,Z: char; N:integer)
Begin
if N>0 then
begin
write(Z);
IMPRYPERM(Y,Z,X,N-1);
write(X);
IMPRYPERM(Z,X,Y,N-2);
write(Y);
end
End;
Mostrar la salida producida para las siguientes llamadas:
IMPRYPERM('A','B','C',2);
10
A L G O R I T M O S
N
2
1
0
-1
0
X
AP
BP
C
B
A
P R O G R A M A C I N
Y
BP
CP
A
C
B
I I
T E O R I A
Z
CP
AP
B
A
C
Resultado: CABCAB
Compiladores
registro = record
A : integer;
B: boolean;
C: real;
case TIPO : char of
X: ( D: array [1..5, 1..15] of char; E: 1..100; F: boolean);
Y: ( G: packed_array[1..20] of char; H : integer);
Z : ( I: array [1..30] of char; J : integer);
end;
var
RE1 , RE2 : registro;
registros : array [1..20] of registro;
y suponiendo que la tabla de variables del programa se carga en la posicin 100 de la memoria,
decir como se resuelve en tiempo de ejecucin la direccin de memoria donde realizar la
asignacin:
RE1.D [2,10] := 'T';
Resolucin
La longitud del integer, char, boolean se considera 1. Del real 4
La longitud de un packet array se la divide por 4 y se toma el entero superior.
El offset de la tabla de registros de coloca en 0 por cada registro nuevo.
Id Interno
E1
Id Pascal
-
Base
Integer
Tabla de enumerados
Limite inferior
1
Id Interno
Id Pascal
Base
Tabla de arrays
Dimensin
A1
Char
A2
A3
A4
Packet char
Char
R1
2(1)
2(2)
1
1
1
11
Limite superior
100
Limite
inferior
1
1
1
1
1
Limite
superior
5
15
20
30
20
Longitud
1
Longitud
1*15*5=75
1*20/4=5
1*30=30
84*20=1680
A L G O R I T M O S
Id Interno
R1
Id Interno
V1
V2
V3
P R O G R A M A C I N
Id Pascal
Registro
Id Pascal
RE1
RE2
REGISTROS
I I
T E O R I A
Tabla de registros
Id Dato
Base
A
Integer
B
Boolean
C
Real
Tipo
Char
D
A1
E
E1
F
Boolean
G
A2
H
Integer
I
A3
J
Integer
Tabla de variables
Base
R1
R1
A4
Off set
0
1
2
6
7
82
83
7
12
7
37
Off set
0
84
168
12
Longitud
1
1
4
1
75
1
1 =84
5
1 = 13
30
1 = 38
Longitud
84
84
1680
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
Captulo 6
SORT INTERNO
Implica ordenar por una clave o varias, en forma ascendente o descendente una secuencia de
datos.
X1,X2,...,Xn
X1 <= X2 <= .... <= Xn
X1 >= X2 >= .... >= Xn
Empezaremos por los mtodos tradicionales. Son fciles de entender pero ineficientes,
especialmente para juegos de datos grandes. Luego prestaremos ms atencin a los ms
eficientes: heapsort y quicksort
Clasificacin de sorts
Seleccin: La idea bsica es hacer un nmero de pases a la lista o a una parte de esta de manera
de seleccionar un elemento que quede correctamente posicionado. En cada paso tomamos una
sublista y el menor elemento es seleccionado y movido a su correcta posicin.
Intercambio: Intercambia pares de elemento contiguos que no estaban en orden hasta que no
hay ms. Luego de cada intercambio avanza un elemento. Esto garantiza que al final de cada
recorrida, el elemento ms grande (o el ms chico), quede bien ubicado, reducindose la lista a
ordenar a una ms chica.
Insercin: similar a algoritmos de insercin en listas ordenadas.
Heap y HeapSort
4
3
La nica razn por la que no es un heap es porque la raz es menor que uno (o dos como en
este caso subrboles)
El primer paso es intercambiar la raz con el mayor de los dos hijos:
9
13
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
2
4
1 5 3
Esto garantiza que la nueva raz sea mayor que ambos hijos, y que uno de estos siga siendo un
heap (en este caso el derecho) y que el otro pueda ser o no. Si es, el rbol entero lo es, sino
simplemente repetimos el swapdown en este subrbol.
SWAPDOWN
1. Done := false
2. c:= 2 ** r
3. While not Done and c<=n Do
a. if c < n and Heap[c] < Heap[c+1] then c := c+1;
b. if Heap[r] < Heap[c] then
i. Swap Heap[r] y Heap[c]
II. r := c
iii. c := 2 ** c
else Done := true
Heapify
Recibe un rbol binario completo almacenado en un arreglo desde posicin 1 a posicin n.
Convierte el rbol en un heap.
SwapDown (rbol cuya raz esta en r)
Ejemplo : 35,15,77,60,22,41
El arreglo contiene los tem como un ABC.
35
15
77
60 22
41
Usamos Heapify para convertirlo en Heap.
77
60
41
15 22
35
Esto pone al elemento ms grande en la raz, es decir la posicin 1 del vector. Ahora usamos la
estrategia de sort de seleccin y posicionamos correctamente al elemento ms grande y
pasamos a ordenar la sublista compuesta por los otros 5 elementos
35
60
41
15 22
77 -------------------35,60,41,15,22,77
En trminos del rbol estamos cambiando, la raz por la hoja ms a la derecha. Sacamos ese
elemento del rbol. El rbol que queda no es un heap. Como solo cambiamos la raz, los
subrboles son heaps, entonces podemos usar swapdown en lugar del Heapify que consume
ms tiempo.
60
35
15 22
41
Ahora usamos la misma tcnica de intercambiar la raz con la hoja ms a la derecha que
podamos.
14
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
22
35
41
15 60 ------------------------------------------------- 35,22,41,15,60,77
Volvemos a usar SwapDown para convertir en un Heap
41
35
15
22
35
15
22
QuickSort
15
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
La idea bsica es elegir un elemento llamado pvot, y ejecutar una secuencia de intercambios
tal que todos los elementos menores que el pvot queden a la izquierda y todos los mayores a
la derecha.
Ejemplo
75,70,65,84,98,78,100,93,55,61,81,68
Supongamos que por simplicidad elegimos el primero como pvot, quedarn a la izquierda:
70,65,55,61,68 y a la derecha: 84,98,78,100,93,81
Lo nico que requiere este proceso es que todos los elementos a la izquierda sean menores que
el pvot y que todos los de la derecha sean mayores luego de cada paso, no importando el
orden entre ellos, siendo precisamente esta flexibilidad la que hace eficiente al proceso.
Hacemos dos bsquedas, una desde la izquierda y otra desde la derecha, comparando el pvot
con los elementos que vamos recorriendo, buscando los menores o iguales y los mayores
respectivamente. En el ejemplo el primer elemento seleccionado a izquierda es el 84, y el
primero a derecha el 68.
75,70,65,84,98,78,100,93,55,61,81,68
Los intercambiamos y repetimos la bsqueda
75,70,65,68,98,78,100,93,55,61,81,84
intercambiamos y seguimos
75,70,65,68,61,78,100,93,55,98,81,84
i
d
intercambiamos y seguimos
75,70,65,68,98,55,100,93,78,61,81,84
i
d
si seguimos la bsqueda desde la derecha encontraremos el 55, es decir que los punteros se
encontrarn. Esto seala el fin de la bsqueda. Intercambiamos el pvot con el 55.
55,70,65,68,98,75,100,93,78,61,81,84
Ahora todos los elementos de la izquierda del 75 con menores y los de la derecha mayores.
Por lo tanto esto me determina dos sublistas que si con ordenadas la lista completa queda
ordenada.
Pueden ser ordenadas independientemente utilizando cualquier esquema de sort. Quicksort
usa el mismo esquema, posicionando el pvot en el primer elemento de cada una.
procedure Split (var X:tipo_arreglo; prim, ult : integer; var Pos : integer);
var izquierdo, derecho : integer;
pvot : tipo_elem;
begin
pivot := X[prim];
izquierdo := prim;
derecho := ult;
while izquierdo < derecho do
begin
while x[derecho] > pvot do derecho := derecho 1;
while x[izquierdo] <= pvot and izquierdo < derecho do
izquierdo := izquierdo +1;
if izquierdo < derecho then Swap (x[izquierdo], x[derecho])
16
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
end;
Pos := derecho;
X[primero] := X[Pos];
X[Pos] := pivot
End;
Procedure Quicksort (var X:tipo_arreglo; prim, ult : integer);
var Pos : integer;
begin
if prim < ult then
begin
Split (X,prim,ult,Pos);
Quicksort (X,prim,Pos - 1);
Quicksort (X,Pos + l,ult)
end
(* en else la lista tiene 0 1 elemento, no necesita sort *)
end;
Este procedimiento es llamado : Quicksort(X,l,n);
Radixsort
17
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
Captulo 7
SORT EXTERNO
La diferencia con el sort interno es que en este la mayora de los datos estn en memoria en
el momento de ejecutar los procesos. En cambio, en el externo por tratarse de volmenes
ms grandes que en general residen en otros dispositivos de almacenamiento, los datos estn en
su mayora en estos dispositivos. Por lo tanto a diferencia del interno los tiempos de
ejecucin estn dominados por la entrada/salida, por lo tanto un objetivo es minimizar las
transferencias desde y hacia la memoria.
Debemos seleccionar entre las alternativas de realizar el ordenamiento in situ, es decir en su
lugar original o usando mtodos que requieren almacenamiento adicional. Una ventaja del
ordenamiento in situ es que esta permite ordenar grandes archivos en el almacenamiento
disponible. Una desventaja es que si el proceso aborta puede dejar el archivo distinto. Esto
puede solucionarse con una copia off-line.
Si elegimos el sort in situ, podemos utilizar los algoritmos de sort interno y tratar nuestros
archivos como arrays de bloques. Esto requiere archivos de acceso directo. Quicksort es uno
de los mejores algoritmos. Six y Wegner describieron Exquisit, un algoritmo basado en
Quicksort, que ordena archivos de acceso directo.
Los algoritmos que veremos son clasificados como sort-merge. Ordenan los archivos por la
tcnica de divide-and-conquer, en la cual pequeas partes del archivo son ordenadas y luego
apareadas en conjunto. Entonces tenemos dos etapas.
1. Sort: Los registros son ledos desde un archivo de entrada (desordenado) y son ordenadas
particiones de registros, como archivos de salida. Los registros de una particin estn en el
mismo orden que los de las otras.
2. Merge. Las particiones con apareadas hasta tener una nica.
El sort-merge puede ser adaptado a la memoria disponible. El merge necesita en memoria solo
el espacio necesario para un registro por cada una de las partes a ser apareadas. Cuanto ms
memoria tengamos para ordenar las particiones, necesitaremos menos de stas. El mtodo
puede funcionar hasta en el caso extremo, de disponer solo de dos registros. Por supuesto que
demandar mucho tiempo.
Generacin de particiones ordenadas
Hay varios mtodos. Veremos 3.
Sort interno
Reemplazo
Seleccin Natural
Para comparar los tres algoritmos veremos como trabajan con el siguiente lote.
109 49 34 68 45 2 60 38 28 47 16 19 34 55 98 78 76 40 35 86 10 27
61 92 99 72 11 2 29 16 80 73 18 12 89 50 46 36 67 93 22 14 83 44
52 59 10 38 76 16 24 85
Suponemos que la memoria principal puede almacenar M registros.
18
A L G O R I T M O S
P R O G R A M A C I N
T E O R I A
Sort interno
Reemplazo
I I
19
A L G O R I T M O S
Seleccin Natural
P R O G R A M A C I N
I I
T E O R I A
20
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
Captulo 8
MERGE
Supongamos que en la etapa de Sort hemos generado R particiones. El mtodo optimo de
aparearlos es que cada particin est en un archivo separado y realizar un merge de R vias. Sin
embargo en la prctica tenemos restricciones operacionales. La ms comn es que solo un
nmero mximo de archivos pueden estar abiertos simultneamente. Por lo tanto el proceso
requiere una serie de fases.
Durante cada una los registros con ledos de un set de archivos, generando otro set de salida.
Hay varias estrategias de merge, teniendo algunos distintos requerimientos en la distribucin
de las partidas originales.
F : mximo nmero de archivos que ce pueden tener abiertos
Cuanto ms grande mejor. Muchas veces es restriccin del sistema operativo.
Consideraremos tres estrategias de Merge:
Balanceado de N caminos
Optimal Merging
Polyphas merging
Balanceado N caminos
21
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
base := 1
(* ejecutar una fase*)
outfilenum := 0;
partitioncount := 0;
repeat merge particin de cada archivo de entrada numerado
(bace + outfilenum) incrementando en i
outfilenum := (outfilenum +1) mod outsetsize
until EOF on all input files
rewind input and output files
until partitioncount = 1
if input-set-first
then sorted file is N + 1
else sorted file is 1
Inicio
Despus fase 1
Despus fase 2
Despus fase 3
Despus fase 4
Despus fase 5
10 x 1
10 x 1
3x4
2x4
5x2
1 x 8,1 x 4
1x4
1 x 16
5x2
1x8
1 x 20
Ntese que si bien el mtodo es simple esta lejos de ser el mejor. Estamos ejecutando solo F/2
caminos de apareos en lugar de F - 1 caminos, que seria lo mejor.
Por otra parte dependiendo de F y de la distribucin inicial de particiones en ciertas fases es
probable que alguna particin sea copiada directamente de un archivo a otro sin ser apareada.
Se mantiene un registro con la longitud de cada particin. No es
absolutamente optimo porque la longitud de los archivos en una
fase puede ser bastante diferente
Optimal Merge
Polyphase Merge
A1
1:1
4:1
7:1
10:1
13:1
16:1
19:1
22:3
25:3
28:9
A2
2:1
5:1
8:1
11:1
14:1
17:1
20:1
22:3
26:3
29:11
A3
3:1
6:1
9:1
12:1
15:1
18:1
21:3
23:3
27:5
OUT
21:3
22:3
23:3
24:3
25:3
26:3
27:5
28:9
29:11
30:20
LECTURAS
3
3
3
3
3
3
5
9
11
20
63
22
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
13 x 1
6x1
2x1
1 x 17
11 x 1
4x1
2x9
1x9
7x1
7x3
3x3
1x3
4x5
2x5
1x5
1 x 31
=21
=20
=18
= 17
=31
=107
Mtodo
Dadas 20 particiones y 4 archivos (siendo 3 de entrada y 1 de salida) se realizan los siguientes
pasos:
Paso 1: Clculo de la distribucin de las particiones
Siguiendo la formula de la serie de Fibonacci
A
a+b
1
1(1+0)
2(1+1)
4(2+2)
7(4+3)
13(7+6)
B
a+c
0
1(1+0)
2(1+1)
3(2+1)
6(4+2)
11(7+4)
C
A
0
1
1
2
4
7
total (a+b+c)
(del paso anterior)
=1
=3
=5
=9
=17
=31 (llego hasta que iguale o supere el nro de
particiones(en este caso 20)
23
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
13
4
11
4
7
3
=31
=11
=20
PASO 2
genero el archivo de
salida con los de
entrada hasta que
alguno de entrada
no tenga datos.
A1(ENTRADA)
D
D
D
D
1
4
7
10
13
15
17
19
20
A2(ENTRADA)
D
D
D
D
2
5
8
11
14
16
18
10
13
15
17
19
20
11
14
16
18
PASO 3
repito paso 2 pero 19
ahora el de salida es 20
el archivo vaco del
paso anterior
PASO 4
Idem
PASO 5
Idem
(SALIDA)
1-2-6-7-8-10-11-1215-16-19
A3(ENTRADA)
D
D
D
3
6
9
12
(SALIDA)
D
D
D
3
1-2-6
4-5-9
7-8-12
(SALIDA)
10-11
13-14
15-16
3-17-18
(SALIDA)
1-2-6-10-11-19
4-5-9-13-14-20
15-16
3-17-18
4-5-9-13-14-20
3-17-18
PASO 6
Idem hasta que todo
que en un slo
archivo.
A4(SALIDA)
1-2-6
4-5-9
7-8-12
7-8-12
(SALIDA)
1-2-3-4-5-6-7-89-10-11-12-1314-15-16-17-1819-20
24
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
Captulo 9
RBOLES BB-TREE
Son tipos especiales de rboles que los hacen adecuados para almacenar y recuperar
informacin. Como en un rbol binario de bsqueda buscar informacin requiere recorrer un
solo camino desde la raz a una hoja. Como en un rbol balanceado el ms largo camino de
la raz a una hoja es O(log n) A diferencia de un rbol binario cada nodo puede contener varios
elementos y tener varios hijos. Debido a esto y a que es balanceado, permite acceder a grandes
conjuntos de datos por caminos cortos.
Insercin y Eliminacin
Orden 2
1 nodo 3 elementos
(32 38 40 41)
(44 50 56)
Ahora si insertamos algn valor entre 30 y 42 (ej. 34) se parte el nodo del medio y el elemento
central pasa para arriba
25
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
(30 38 42)
(10 20 25) (32 34) (40 41) (44 50 56)
Ahora agregamos 58
(30 38 42)
(10 20 25) (32 34) (40 41) (44 50 56 58)
Ahora agregamos 60,52,54
(30 38 42 56)
(10 20 25) (32 34) (40 41) (44 50 52 54) (58 60)
Ahora agregamos 46
(42)
(30 38)
(50 56)
(10 20 25) (32 34) (40 41) (44 46) (52 54) (58 60)
Descripcin de insercin
Descripcin de Eliminacin
(30 38 42)
(10 20 25) (32 34) (40 41) (44 50 56 58)
26
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
Ahora borramos 32
(25 38 42)
(10 20) (30 34) (40 41) (44 50 56 58)
Ahora borramos 34
(25 42)
(10 20)
27
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
Captulo 10
EJERCITACIN - SOLUCIONES
105,12,79,43,116,348,126,11,81,83,21,36,123,35,56,29,14
Explique como ordena de menor a mayor utilizando
1er PASO:
0
1
2
3
4
011
012
043
014
081
083
021
123
2do Paso:
0
1
105
011
012
014
116
3er Paso:
0
011
012
014
021
029
035
036
043
053
079
081
083
1
105
116
123
126
radixsort
5
105
035
6
116
126
056
8
348
9
079
029
2
021
123
126
029
3
035
036
4
043
348
5
056
7
079
8
081
083
3
348
=>11,12,14,21,29,35,36,43,53,79,81,83,105,116,123,126,348
Utilizando el mtodo de seleccin de reemplazo (sort externo- particiones ordenadas)
describir la generacin de particiones con m=4
P1: 12,43,79,105,116,126,348
P2:11,21,36,81,83,123
P3:14,29,35,56
Considerando la lista 105,12,79,43,116,348,126,11,81,83,21,36,123,35,56,29 como un grupo
de particiones ordenadas de 1 registro cada una, desarrollar el mtodo de merge polifsico con
4 archivos. ( 3 de entrada y 1 Salida). Cantidad de particiones =16
1er. Paso: Clculo de distribucin de particiones segn Fibonacci obtenindose a=7 b=6 c=4
con un total de 17.
2do. Paso: clculo de dumies
28
A L G O R I T M O S
total
7
dumies 1
partic. 6
P R O G R A M A C I N
6
0
6
4
0
4
A2
12
116
11
21
35
29
83
123
56
I I
T E O R I A
=17
=1
=16
A3
79
348
81
36
35
29
A4
d,12,79
105,116,348
11,43,81
21,36,126
56
12,35,79,83
29,105,116,123,348
11,43,81
21,36,126
11,12,35,43,56,79,81,83 29,105,116,123,348
21,36,126
11,12,21,29,35,36,43,
56,79,81,83,105,116,
123,126,348
rboles B
308,418,422,332,171,437,132,187,514,328,451,277,493,117,97,511,530,504,386,217,407,294,
202
BORRAR 217
BORRAR 294
INSERTAR 500
INSERTAR 400
Solucin:
(308)
(308,418)
(308,418,422)
(308,332,418,422)
(332)
/
\
(171,308)
(418,422)
(332)
/
\
(132,171,187,308) (418,422,437,514)
(187,332)
29
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
/
|
\
(132,171) (308,328) (418,422,437,514)
(187,332,437)
/
|
\
\
(132,171) (308,328) (418,422) (451,514)
(187,332,437)
/
|
\
\
(97,117,132,171) (277,308,328) (418,422) (451,493,511,514)
(187,332,437,511)
/
|
\
\
\
(97,117,132,171) (217,277,308,328) (386,407,418,422) (451,493,504) (514,530)
(332)
/
\
(187,294)
(437,511)
/
|
\
/
\
\
(97,117,132,171) (202,217,277) (308,328) (386,407,418,422) (451,493,504) (514,530)
(187,332,437,511)
/
|
\
\
\
(97,117,132,171) (202,277,308,328) (386,407,418,422) (451,493,504) (514,530)
EJERCITACIN ADICIONAL
Punteros y Recursividad
Puntero = ^nodo;
Nodo = record
Coeficiente, exponente : integer;
Sig: puntero;
End;
Var p: puntero;
Procedure Armar(var p:puntero; x,y: integer);
Begin
If p=nil and x>0 then begin
New(p);
p^.sig := nil;
p^.coeficiente := x;
p^.exponente := y;
armar(p^.sig,x-1,x*y);
p^.coeficiente := p^.coeficiente * x;
p^.exponente := p^.exponente + y;
30
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
end;
End;
Dado el siguiente lista de nmeros: 15, 54, 25, 63, 45, 85, 97, 86,
12, 9, 785, 2, 67, 99, 458, 657, 999, 125, 35 y considerando la
lista dada como un grupo de particiones ordenadas de 1 registro
Sort
cada una, desarrollar:
rboles B
35, borrar 45.
Construir el b-tree de orden 2 (nodos hasta 4) que resulta de ingresar los siguientes nmeros en
el orden dado: 252-372-376-286-125-391-86-141-468-282-405-231-447-71-16-465-484-458340-171-361-248-156 y borrar 171,248
Construir el b-tree de orden 2 (nodos hasta 4) que resulta de ingresar los siguientes nmeros en
el orden dado: 43-49-48-47-46-45-2-41-7-23-47-49-43-100-8-1-3-4 y borrar 41, insertar 50,75
31
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
Captulo 11
Objeto
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
Mtodos y mensajes
Clase
33
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
Herencia
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
35
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
Captulo 12
EJERCITACION
1. Se tienen las clases Humano y Perro. Atributos de Humano: edad, estado civil,
nombre, nmero de documento, sexo. Atributos de Perro: edad, nombre,
raza, sexo.
a. Idear una clase abstracta que permita evitar repetir cdigo.
b.
c.
2. Se tienen las clases Libro y Revista. Atributos de Libro: Ao, Autor, Cantidad de
pginas, Nombre, Tema. Atributos de Revista: Ao, Cantidad de pginas,
Nombre, Nmero, Tema.
a. Idear una clase abstracta que permita evitar repetir cdigo.
b.
c.
CASO RESUELTO
Qu es un objeto?
Definiciones rpidas:
atributos caractersticas, propiedades, valores (marcar analoga con las
variables)
mtodos acciones, cosas que pueden hacer (marcar analoga con los
procedimientos)
Ejemplo - Televisor
Atributos: Canal en el que est, volumen, brillo, boolean que indica si est prendido, etc.
Mtodos: Prender, Apagar, Subir volumen, bajar volumen, subir canal, bajar canal, etc.
Type
Televisor =
Object
Canal:Integer;
End;
Var
Tel1:Televisor;
Begin
Tel1.Canal:=5;
End.
Todos los televisores tienen caractersticas comunes
36
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
Type
Televisor =
Object
Canal:integer;
Procedure CambiarCanal(NuevoCanal:integer);
End;
Var
Tel1:Televisor;
Tel2:Televisor;
Begin
Tel1.Canal:=5;
Tel2.Canal:=26;
Tel2.CambiarCanal(26);
End.
Pero en realidad en un televisor nosotros no tenemos acceso a las variables.
Slo podemos usar los mtodos (los botones)
Entonces las variables que tiene el televisor son PRIVADAS
Y los botones que sirven para cambiar el valor de esas variables son PBLICOS
Pblico = se puede ver desde afuera
Privado = no se puede ver desde afuera
Cuando se le pide a un objeto que ejecute uno de sus mtodos, se le est dando un MENSAJE.
Type
Televisor =
Object
Private
Canal:integer;
Volumen:integer;
Encendido:boolean;
Public
Procedure CambiarCanal(NuevoCanal:integer);
Procedure SubirVolumen;
Procedure BajarVolumen;
Procedure Encender;
Procedure Apagar;
End;
37
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
Var
Tel1:Televisor;
Begin
Tel1.Canal:=26;
Tel1.CambiarCanal(26);
Tel1.Volumen:=Tel1.Volumen + 1;
Tel1.SubirVolumen;
Tel1.Encendido:=true;
Tel1.Encender;
End.
mal
bien
mal
bien
mal
bien
No necesariamente SIEMPRE es que los procedimientos son pblicos y los atributos privados,
pero que en este caso si.
Una version mejorada de la implementacin seria asi:
Unit Televisor;
Interface
Type
Televisor =
Object
Private
Canal:integer;
Volumen:integer;
Encendido:boolean;
Public
Procedure CambiarCanal(NuevoCanal:integer);
Procedure SubirVolumen;
Procedure BajarVolumen;
Procedure Encender;
Procedure Apagar;
End;
Implementation
Procedure Televisor.CambiarCanal(NuevoCanal:integer);
begin
Canal:=NuevoCanal;
end;
Procedure Televisor.SubirVolumen;
begin
Volumen:=Volumen + 1;
end;
Procedure Televisor.BajarVolumen;
begin
Volumen:=Volumen - 1;
end;
Procedure Televisor.Encender;
38
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
begin
Encendido:=true;
end;
Procedure Televisor.Apagar;
begin
Encendido:=false;
end;
Object
Private
Canal:integer;
Volumen:integer;
Encendido:boolean;
Procedure CambiarCanal(NuevoCanal:integer);
Public
Procedure SubirCanal;
Procedure BajarCanal;
Procedure SubirVolumen;
Procedure BajarVolumen;
Procedure Encender;
Procedure Apagar;
End;
39
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
Con lo cual obtengo el valor que necesito sin violar la abstraccin del objeto.
Anlogamente: GetVolumen, GetEncendido, etc.
Entonces habamos quedado en:
Televisor
Volumen
Canal
Encendido
ahora pensemos en una radio:
Radio
Volumen
Encendido
FM
Pero podemos observar que hay caracteristicas repetidas. Cmo lo podemos evitar?
Podemos crear una clase llamada Aparato y que nos quede as:
Aparato
Televisor
Aparato
Encendido
Volumen
Televisor
Canal
Radio
Radio
FM
Entonces cuando declaremos un objeto como Televisor, vamos a tener disponibles Canal, y
adems Encendido y Volumen que los heredamos de la clase Aparato
Type
Aparato =
Object
Encendido:boolean;
Volumen:integer;
End;
Televisor =
Object(Aparato);
Canal:integer;
End;
Radio =
Object(Aparato);
FM:boolean;
End;
Y si despus hacemos:
40
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
Var
Rad1:Radio;
As, vamos a poder hacer Rad1.Encendido y Rad1.Volumen porque Radio los HEREDA de
Aparato.
Y lo que se hereda no es solamente los atributos. Los mtodos tambin se heredan. Es decir que
si yo declaro el procedimiento SubirVolumen en Aparato, entonces tambin voy a poder hacer
Rad1.SubirVolumen.
Nosotros no vamos a declarar ningn objeto de clase Aparato. Lo podramos hacer, pero no lo
vamos a hacer, porque lo que queremos no es aparatos sino concretamente televisores y radios.
Entonces vamos a tener objetos que van a ser de la clase Televisor, y vamos a tener objetos de
la clase Radio. Pero de la clase Aparato no vamos a tener ningn objeto. Recuerden que la
clase Aparato solo la creamos para no tener que poner dos veces volumen y encendido. La
clase Aparato solo nos sirve para eso. Ese tipo de clase se llama Clase Abstracta.
Unit Cosas;
Interface
Type
Aparato =
Object
Private
Encendido:boolean;
Volumen:integer;
Public
Procedure Encender;
Procedure Apagar;
Procedure SubirVolumen;
Procedure BajarVolumen;
End;
Televisor =
Object(Aparato);
Private
Canal:integer;
Public
Procedure CambiarCanal(NuevoCanal);
End;
Radio =
Object(Aparato);
Private
FM:boolean;
Public
Procedure PonerFM;
Procedure PonerAM;
End;
Implementation
Procedure Aparato.Encender;
Begin
Aparato.Encendido:=true;
41
A L G O R I T M O S
P R O G R A M A C I N
I I
T E O R I A
End;
Procedure Aparato.Apagar;
Begin
Aparato.Encendido:=false;
End;
Procedure Aparato.SubirVolumen;
Begin
Volumen:=Volumen + 1;
End;
Procedure Aparato.BajarVolumen;
Begin
Volumen:=Volumen - 1;
End;
Procedure Televisor.CambiarCanal(NuevoCanal:integer);
Begin
Canal:=NuevoCanal;
End;
Procedure Radio.PonerFM;
Begin
FM:=true;
End;
Procedure Radio.PonerAM;
Begin
FM:=false;
End;
Notar que como todas las dems cosas, los objetos tambin tienen que ser inicializados. (sus
variables, etc.). Para eso se usa un mtodo que se llama CONSTRUCTOR, que se ejecuta cada
vez que se crea un objeto.
Procedure Televisor.Constructor;
Tambin es necesario tener un mtodo que se encargue de destruir al objeto, liberar el espacio
en memoria que ste ocupaba, etc. Para eso se usa el mtodo llamado DESTRUCTOR.
Procedure Televisor.Destructor;
42