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}