final de prácticas (enero 2001)

Anuncio
Apellidos:
Nombre:
Algoritmos y Estructuras de Datos II
Examen de Prácticas
Duración: 1.5 h
DNI:
EUI o FI?
grupos: 1K y 1L (EUI) y 1Z (FI)
17/1/2001
En cada unidad temática el alumno/a tendrá que obtener como mínimo el 40% de la puntuación del ejercicio correspondiente. Es decir,
las puntuaciones mínimas son: 1er ejercicio = 1.5 -> 0.4*1.5 = 0.6; puntuación 2do ejercicio = 2.5 -> 0.4*2.5 = 1; puntuación 3er
ejercicio = 5 -> 0.4*5 = 2.
La entrega de la(s) parte(s) evaluada(s) en el examen parcial supone la renuncia a la nota previa obtenida, y la nueva evaluación de la
misma.
Las notas de teoría y práctica obtenidas a partir de 4.5 se mantendrán para la convocatoria de junio, así como la(s) nota(s) del examen
parcial (de teoría y práctica).
Escribir sólo en los recuadros.
Ejercicio 1. En numerosos problemas de computación numérica (por ejemplo, en problemas de
interpolación) aparecen datos matriciales que tienen una estructura tridiagonal. Una matriz cuadrada Mnxn
se define tridiagonal si son ceros todos sus elementos que no pertenecen a la diagonal principal – desde
(1,1) a (n,n) – y a las diagonales secundarias inferior – desde (2,1) a (n,n-1) – y superior – desde (1,2) a (n1,n). Los dos ejemplos (con n=4) ilustran casos de matrices tridiagonal y no tridiagonal.
Se quiere hacer un análisis a posteriori, de la función tridiagonal que ha sido implementada en Pascal, a
través de la técnica de temporización (es decir, utilizando la primitiva de sistema clock) para medir el
tiempo consumido para tallas: 10, 20, 30, …, 100. Para obtener tiempos significativos se deberá repetir la
operación un número suficiente de veces repeticiones=100.
Se pide (puntuación: 1.5 puntos): rellenar el cuerpo del programa para obtener la tabla correspondiente y
cambiar la cabecera y el cuerpo de la subrutina tridiagonal y/ las subrutinas si necesario:
Talla
10
20
.
.
100
Tiempo
Program temporizacion_matriz_tridiagonal (input, output);
const n = 100;
talla_inicial = 10;
incremento = 10;
repeticiones = 100;
type
laMatriz = array [1..n,1..n] of real;
var indice_talla, indice_repeticiones, t1, t2: integer;
mg: laMatriz;
res:boolean;
1
2

M1 = 
0
0
4 0 0
7 4 0

6 1 0
0 0 6
1
0

M2 = 
0
2
0 8 0
6 1 0

5 1 0
0 0 8
{cambiar / corregir la cabecera y/o el cuerpo si necesario}
function tridiagonal (var m: laMatriz): boolean;
⇒ function tridiagonal (var m: laMatriz;
talla: integer) : boolean;
var i,j: integer;
tridiag: boolean;
begin
tridiag:=true;
(COMENTARIO)
i:=1;
while (i < n-1) and tridiag do begin
j:=i+2;
while (j ≤ n) ∧ tridiag do begin
if ( m[i,j] <> 0 ) or ( m[j,i] <> 0 )
then tridiag:= false
else j:=j+1
end;
i:=i+1
end;
tridiagonal:= tridiag
end;
⇒ while (i < talla - 1) ∧ ...
⇒ while (j ≤ talla) ∧ ...
{COMENTARIO se comprueba si todos los elementos en la parte triangular superior a las
diagonales (secundarias) de la matriz son ceros y al mismo tiempo si los elementos de la
parte triangular inferior son también ceros}
begin {del programa principal}
{se supone la matriz mg inicializada invocando un procedimiento generaMatriz(mg,n); }
indice_talla := talla_inicial;
while (indice_talla ≤ n) do begin
t1:=clock;
for indice_repeticiones:=1 to repeticiones do res:=tridiagonal (mg, indice_talla);
t2:=clock;
writeln (indice_talla:5, (t2-t1)/repeticiones:5);
indice_talla:=indice_talla + incremento
end;
end.
Ejercicio 2. La función recursiva TD (acrónimo de Tri-Diagonal) , resuelve el mismo problema del bucle
“mientras” más interno del primer ejercicio con la misma complejidad. Es decir, que dada la matriz y un
índice "i" compruebe que:
los elementos de la fila
i-esima desde la columna i+2 hasta n sean iguales a 0 y
los elementos de la columna
i-esima desde la fila
i+2 hasta n sean iguales a 0
function TD (var m:LaMatriz; i,j:integer): boolean;
begin
*
if (j =n+1 ) then
TD := true
else if (m[i,j] <> 0) or (m[j,i] <> 0) then TD := false else TD:= TD(m,i,j+1)
end;
Se pide (puntuación: 2.5 puntos):
a) Puntuación: 2 puntos
Describir la secuencia de registros de activación que se visualizarían en la pila desde el depurador, cuando
se han situado el punto de ruptura en la línea señalada con un asterisco y realiza la llamada:
tridiag:=TD( mg, 1,3);
donde mg es la matriz M1 del ejemplo del ejercicio anterior
?
5
1
@mg
TD
j
i
m
?
3
1
@mg
?
4
1
@mg
?
4
1
@mg
?
3
1
@mg
?
3
1
@mg
b) Puntuación: 0.5 puntos
Escribir el coste espacial de TD, en función de la talla del problema por resolver cuando se invoca
como en el apartado anterior. Justificar la respuesta.
Talla: n
Coste espacial: Θ(n)
lineal con la talla
(tamaño_registro * no_max_registros_simultáneamente_en_memoria)
Ejercicio 3.
a) Puntuación: 3 puntos
Dentro de las necesidades de transmisión masiva de información (cualquier transmisión de imágenes por
internet puede ser un buen ejemplo) resulta fundamental la compresión y encriptación de datos para ahorrar
el máximo de espacio. Por ejemplo, una imagen de cierta bandera de cierto país podría almacenarse en la
siguiente estructura:
1
Azul
1
K
Rojo
K+1
m
NIL
Azul
1
K
Blanco
K+1
m
NIL
Azul
1
K
Rojo
K+1
m
NIL
Azul
1
K
Blanco
K+1
m
NIL
Rojo
1
m
NIL
Blanco
1
m
NIL
.
.
K
.
.
.
.
.
n
Const n= ...; m= ...;
Rojo
1
m
NIL
Blanco
1
m
NIL
Rojo
1
m
NIL
Type
Enlace = ^nodo
Bandera = array [1..n] of enlace;
Nodo = Record
Color:String[10];
col_ini, col_fin:integer;
Sig_col:enlace;
end;
La estructura sería similar a la del recuadro, y cada nodo representaría zonas contiguas del mismo color, se
interpretaría como que desde la columna col_ini hasta la columna col_fin todos los píxeles contiguos tienen
el color color y si hay más colores en esa fila, vendrán representados en los nodos siguientes.
Una imagen sería pues un vector de listas de la forma ya comentada, que representarían las filas de píxel de
la imagen.
Un avispado forofo de cierto equipo de fútbol, desea enviar la imagen de la bandera de su equipo a todos
sus amigos por internet. Navegando por el ciberespacio ha encontrado esta imagen codificada de cierta
bandera similar a la de su equipo, pero no igual. La bandera tiene N filas y M columnas de colores alternos
Rojo y Blanco, y un cuadrado azul en la esquina superior izquierda, con k filas y k columnas. Para que la
dicha del forofo sea completa, debe transformar la bandera de ese país en la de su equipo de fútbol,
eliminando el cuadrado azul y dejando sólo las bandas rojas y blancas en toda la bandera.
Implementad el procedimiento Transforma, que dada una imagen como la representada por el tipo bandera
y de la forma ya descrita, la modifique eliminando los nodos azules y modificando adecuadamente el resto.
procedure Transforma (var b: bandera);
var
aux: enlace;
i,k: integer;
begin
k:=b[i] ^.col_fin;
for i:=1 to k do begin
aux:=b[i];
b[i]:= b[i] ^.sig_col;
b[i] ^.col_ini:=1;
dispose(aux)
end
end;
b) Puntuación: 2 puntos
Los mensajes en un terminal de telefonía móvil se almacenan en una lista con punto de interés (con variable
dinámica). Los elementos de la lista son tuplas con dos campos, remitente y texto. Sin embargo el tipo lista
visto en clase no se corresponde con la funcionalidad de las listas que aparecen en los móviles. En la base
de datos de un móvil es posible encontrar el último mensaje de un cierto remitente de forma eficiente, y
cuanto mayor es la capacidad de almacenamiento de un terminal más importante resulta que dicha
búsqueda sea eficiente.
¿Qué modificaciones deben hacerse sobre la lista para que dicha búsqueda sea eficiente?
type
enlace
lista
= ^nodo;
= record
pri, ult, ant: enlace;
end;
nodo
= record
dato: elemento;
sig: enlace;
end;
elemento= record
remitente:integer;
mensaje : string[145]
end;
nodo
= record
dato: elemento;
⇒ sig, prev: enlace
end;
Implementa la operación busca_ult tal que dada una lista y un cierto remitente, muestre el último
mensaje de dicho remitente (si lo hay).
procedure busca_ult (l:lista; rmte;integer);
var
encontrado: boolean;
aux: enlace;
begin
encontrado:=false; aux:=l.ult;
{*}
while (not encontrado) and (aux <> l.pri) do
if (aux^.dato.remitente = rmte) then begin
encontrado:=true; write(aux^.dato.mensaje)
end
else aux:=aux^.prev
end;
{*
Si consideramos la lista sin nodo ficticio, la segunda parte de la guarda del while sería
(aux <> nil)
}
Descargar