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