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) }