Examen de Prácticas de AD2. Convocatoria 22/6/2000

Anuncio
Examen de Prácticas de AD2. Convocatoria 22/6/2000
NOMBRE DEL ALUMNO:____________________________________________________________ GRUPO:_______
NOMBRE DEL PROFESOR___________________________________________________________________________
Ejercicio 1. Dada las siguientes declaraciones y la función recursiva Diag0:
Const n=3;
Type matriz = array [1..n,1..n] of integer;
function Diag0 ( Var m:matriz; i:integer): boolean;
var res: boolean;
* begin
if i=n+1 then res:=true
else if (m[i,i]=0) then res:=Diag0(m,i+1) else res:=false;
Diag0:=res
end;
Sabiendo que todos_cero es una variable del programa principal de tipo lógico, y que mg es una
matriz definida en el programa principal que contiene:
 0

mg =  0
 666
î
7 

−1
0 
1
0
13
Se pide: Describir la secuencia de registros de activación que se visualizarían desde el depurador,
cuando se sitúe un punto de ruptura en la línea donde está el asterisco y se realiza la llamada:
todos_cero := Diag0 (mg,1);
(2.5 puntos)
i=4; res=?
Diag0 = ?
m = @mg
i=3; res=?
Diag0 = ?
m = @mg
i=3; res=?
Diag0 = ?
m = @mg
i=2; res=?
Diag0 = ?
m = @mg
i=2; res=?
Diag0 = ?
m = @mg
i=2; res=?
Diag0 = ?
m = @mg
i=1; res=?
Diag0 = ?
m = @mg
i=1; res=?
Diag0 = ?
m = @mg
i=1; res=?
Diag0 = ?
m = @mg
i=1; res=?
Diag0 = ?
m = @mg
todos_cero=?
0 1 7


mg=  0 0 −1
666 13 0 
î

todos_cero=?
0 1 7


mg=  0 0 −1
666 13 0 
î

todos_cero=?
0 1 7


mg=  0 0 −1
666 13 0 
î

todos_cero=?
0 1 7


mg=  0 0 −1
666 13 0 
î

¿Cómo variaría el coste espacial del algoritmo si el paso de la matriz fuera por valor en lugar de por
referencia? Escribir el coste resultante de esta modificación en función de n.
(0,5 puntos)
Aumentará hasta orden cúbico (O(n3))
Página 1 de 4
Ejercicio 2. Se desea contrastar experimentalmente la eficiencia de los algoritmos de búsqueda
secuencial ascendente y de búsqueda binaria. En concreto, se está interesado en estudiar la cota
superior de coste temporal de los dos algoritmos.
type Vector=array[1..N] of integer;
function BuscaSec (var v:Vector; x:integer; talla:integer):integer;
Begin
...
...
{ Se supone ya implementado }
...
End;
function BuscaBin (var v:Vector; x:integer; talla:integer):Integer;
Begin
...
...
{ Se supone ya implementado }
...
End;
Una de las instancias que corresponden al caso peor de los dos algoritmos en consideración, se da
cuando se efectúa la búsqueda, en un vector ordenado ascendentemente, de un elemento cuyo valor sea
superior al máximo valor existente en el vector. Supongamos definido el siguiente procedimiento
genera un vector ordenado de tamaño n:
procedure GeneraInstancia (var v:Vector; n:integer);
Escribid el segmento de programa que realizaría el estudio de costes sobre vectores ordenados
ascendentemente, de tamaños: 200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000.
Además, para cada uno de los casos, el valor buscado debe ser superior al último valor (máximo) del
vector. Para ello se utilizará la función clock, cuyo perfil es el siguiente:
function clock: integer;
Para que las medidas de temporización del reloj sean apreciables, se repetirá 1000 veces el algoritmo
de búsqueda secuencial ascendente, y 100000 veces el algoritmo de búsqueda binaria. Al acabar la
misma, se dividirá el tiempo obtenido por 1000 y 100000, respectivamente.
La salida deberá ser tabulada, con un formato similar al siguiente:
# Tiempos de ejecución de la búsqueda (en microsegundos)
# Talla
Secuencial
Binaria
# ---------------------200
5.0E+01
4.4E+00
400
1.0E+02
4.9E+00
-----------
Página 2 de 4
const
TallaIni=200; TallaFin=2000; IncrTalla=200;
NrepBS= 1000; NrepBB=100000;
var
V:Vector;
x: integer;
talla, i :integer;
t1,t2,t3,t4: real;
writeln(‘# Tiempos de ejecución de la búsqueda (en microsegundos)’);
writeln(‘# Talla
Secuencial
Binaria ‘);
writeln(‘# -----------------------‘);
talla:=TallaIni;
while (talla<=TallaFin) do begin
write(talla:5);
GeneraInstancia(v,talla); x:=v[talla]+1;
t1:=clock;
for i:=1 to NrepBS do pos:=BuscaSec(v,talla,x);
t2:=clock;
write((t2-t1)/NrepBS:5);
t3:=clock;
for i:=1 to NrepBB do pos:=BuscaBin(v,talla,x);
t4:=clock;
writeln((t4-t3)/NrepBB:5);
talla:=talla+IncrTalla;
end;
Página 3 de 4
Ejercicio 3. Dada la siguiente estructura enlazada:
Type
prt =
nodo =
^nodo;
record
Dato: integer;
sig: ptr
end;
Lista = ptr;
1
2
3
4
4
3
2
1
var
l:lista
Se pide: Implementar un procedimiento o función tal que dada una lista retorne otra
los elementos de forma invertida (ver ejemplo)
que contenga
(3 puntos)
Procedimiento Inviertelista (l:lista; var l2:lista);
var aux1, aux2: ptr;
begin
l2
:= nil;
aux1 := l;
{ inicializamos aux1 para recorrer l }
while aux1 <> nil do
{ mientras no se nos acabe la lista l }
begin
new(aux2);
aux2^.dato :=aux1^.dato;
aux2^.sig := l2;
l2
:= aux2;
{inserción en cabeza}
aux1
:=aux1^.sig;
end;
end;
Página 4 de 4
Descargar