Solución Primer Parcial Semestre A

Anuncio
Solución Primer examen parcial de AD2.
Grupos de trabajo 1er cuatrimestre. 24/11/2001
Ejercicio 1 (prácticas). Puntuación: 0.5 puntos (en caso de respuesta incorrecta se resta 0.15).
En el siguiente fragmento de código, se ha medido el tiempo consumido por la función SumaVec que suma los t primeros
elementos de un vector de 100 números reales:
…
const
type
talla_max = 100;
vector = array [1..talla_max] of real;
talla = 10..talla_max;
i,t1,t2: integer;
res: real; vec: vector;
var
…
function SumaVec (var v: vector; t: talla):real;
var i: integer; suma: real;
begin
suma:=0;
for i:=1 to t do suma:=suma+v[i];
SumaVec:=suma
end;
…
begin {programa principal}
… {el vector vec ha sido inicializado}
{línea 1} writeln (‘Talla Tiempo’);
{2}
for i:=1 to 10 do begin
{3}
t1:=clock;
{4}
res:=SumaVec(vec, i*10);
{5}
t2:=clock-t1;
{6}
writeln (i*10:5, t2:7:2);
end;
end. {programa principal}
Los resultados obtenidos han sido:
Talla
10
20
.
.
100
Tiempo
0
0
.
.
0
Se quiere modificar adecuadamente el código anterior
para evaluar correctamente el tiempo consumido por la
función SumaVec. Hay que modificar:
SOLUCIÓN:
for k:=1 to rep do res:=SumaVec(vec, i*10);
la línea 4:
writeln(i*10:5, t2/rep:7:2);
y la línea 6:
con k variable entera y rep = número de repeticiones
necesarias para obtener tiempos significativos
Ejercicio 2 (teoría). Puntuación: 1 punto (en caso de respuesta incorrecta se resta 0.3).
Considérense las siguientes declaraciones y el siguiente algoritmo:
const
type
var
n = 8;
vector = array[1..n] of real;
vec: vector;
rango = 1..n;
procedure averquehace (var v: vector; izq, der: rango);
var i, j: integer; x: real; sube: boolean;
begin
i:=izq+1; sube:=true;
while (i≤der) and sube do begin
sube:=false;
for j:=der downto i do if v[j] < v[j-1] then begin x:=v[j-1]; v[j-1]:=v[j]; v[j]:=x; sube:=true end;
i:=i+1
end
end;
decir si:
SOLUCIÓN: la talla es m=der-izq+1 y la complejidad t(m)∈Ω(m), t(m)∈O(m2)
Ejercicio 3 (prácticas). Puntuación: 1 punto.
Considérese la siguiente función recursiva subeminimo (véanse las declaraciones del ejercicio 2):
procedure subeminimo (var v: vector; var subemin: boolean; i, j: rango);
var aux: real;
begin
if (j>=i) then begin
if v[j] < v[j-1] then begin aux:=v[j-1]; v[j-1]:=v[j]; v[j]:=aux; subemin:=true end;
subeminimo (v, subemin, i, j-1)
end
end;
Sabiendo que vec es una variable de tipo vector (véanse las declaraciones del ejercicio 2) que inicialmente contiene los
valores (2,6,5,3,1,7,9,3), subir es una variable de tipo boolean que inicialmente es igual a false, y que en la llamada inicial
i = 3 y j= 5, describir la secuencia de registros que aparecerían en la ventana del depurador cuando se sitúa un punto de
y se realiza la llamada: subeminimo(vec, subir, 3, 5).
ruptura en la línea donde está el símbolo
Elegir entre los tres registros de activación que se muestran en la figura, el que se apila en primer lugar y rellenar parte de
las columnas (y en cada columna parte de los registros) de la pila de registros de activación. Cada columna representa la
secuencia de registro(s) de activación cada vez que se detiene la ejecución del procedimiento debido a su punto de ruptura.
Describir como cambian a lo largo de la ejecución del procedimiento la variables globales vec y subir.
v=@vec
subemin=@subir
i=3
j=5
aux=?
v=@vec
subemin=@subir
i=3
j=2
aux=?
vec
subir
v=@vec
subemin=@subir
i=3
j=3
aux=?
v=@vec
subemin=@subir
i=3
j=3
aux=6
v=@vec
subemin=@subir
i=3
j=4
aux=?
v=@vec
subemin=@subir
i=3
j=4
aux=5
v=@vec
subemin=@subir
i=3
j=4
aux=5
v=@vec
subemin=@subir
i=3
j=5
aux=?
v=@vec
subemin=@subir
i=3
j=5
aux=3
v=@vec
subemin=@subir
i=3
j=5
aux=3
v=@vec
subemin=@subir
i=3
j=5
aux=3
(2, 6, 5, 3, 1, 7, 9, 3)
(2, 6, 5, 1, 3, 7, 9, 3)
(2, 6, 1, 5, 3, 7, 9, 3)
(2, 1, 6, 5, 3, 7, 9, 3)
false
true
true
true
Ejercicio 4 (teoría). Puntuación: 0.5 puntos.
Determinar la talla del algoritmo subeminimo del ejercicio anterior y, en función de la misma, plantear las relaciones de
recurrencia correspondientes. Elegir de entre las complejidades indicadas la que corresponde a subeminimo.
Talla: m = j – i + 1
K1
m=0
K2 + t(m - 1)
m>0
Relaciones de recurrencia: t(m)=
Complejidad:
lineal
Ejercicio 5 (teoría). Puntuación: 1 punto.
Escribir en Pascal la versión recursiva del algoritmo del ejercicio 2. Para implementar el bucle “for” más interno, invocar el
procedimiento subeminimo del ejercicio 3.
procedure averquehaceR (var v: vector; var flag: boolean; i, der: rango);
begin
if
then begin
(i<=der)
flag:= false;
subeminimo(v, flag, i, der);
if flag then averquehaceR (v, flag, i+1, der)
end;
end; {averquehaceR}
Descargar