Universitat Politècnica de Catalunya Facultat d’Informàtica de Barcelona Apellidos, Nombre Titulación: Ing. Téc. en Informática de Sistemas Asignatura: Programación de Sistemas Duración: 2:30 horas D.N.I. Curso: Q1 2009–2010 (Final) Fecha: 18 de Enero de 2010 1. (1 puntos; 15 minutos) Muestra gráficamente las fases iniciales de la ejecución del algoritmo de heapsort aplicado sobre el vector v = [95, 5, 97, 58, 43, 99, 37, 68, 26, 16]. Para ello, dibuja los contenidos del vector v después de cada llamada a la operación hundir o flotar, hasta que los tres mayores elementos del vector se hayan colocado en su posición final. N.B. Hay que usar la variante más eficiente para la construcción inicial del heap. SOLUCIÓN: 1 Apellidos, Nombre (Continuad respondiendo aquı́ la Pregunta 1.) 2 D.N.I. Apellidos, Nombre D.N.I. 2. (3 puntos; 30 minutos) Implementad una función que dados dos árboles de expresión nos diga si son equivalentes o no teniendo en cuenta exclusivamente la propiedad conmutativa de los operadores. Las hojas del árbol contienen constantes o variables, y los nodos internos contienen operadores. Para simplificar, sólo consideramos los operadores binarios SUMA (+), PRODUCTO (*), RESTA (-), y DIVISION (/). Por ejemplo, los árboles correspondientes a las expresiones (a + b) ∗ c y c ∗ (b + a) son equivalentes, pero los árboles para a − a ∗ 1 y a ∗ 1 − a no lo son. En este último caso, aunque ambas expresiones tienen el mismo valor, no son equivalentes en el sentido restringido que se le ha dado aquı́. Usad las declaraciones siguientes: struct nodo { string info ; // e l o p e r a d o r u o p e r a n d o s e r e p r e s e n t a // en f o r m a t e x t u a l , p . e . , i n f o = ”+” nodo * izq ; nodo * der ; }; typedef nodo * arb_expr ; bool son_conm_equiv ( arb_expr T1 , arb_expr T2 ); SOLUCIÓN: 3 Apellidos, Nombre (Continuad respondiendo aquı́ la Pregunta 2.) 4 D.N.I. Apellidos, Nombre D.N.I. 3. (6 puntos; 1h 45 min) Queremos implementar una clase Extincion que nos va a permitir saber qué animales en peligro de extinción hay en diferentes regiones. También nos permitirá determinar cuál es la menor población de entre todas las consideradas. Aquı́, el término población se refiere a un conjunto de individuos de una misma especie en una determinada región. De hecho, el único dato que nos interesa de una población es el número de individuos que la componen. La clase constará de las siguientes operaciones, al menos: (a) La constructora de la clase: construye un objeto vacı́o. (b) a~ nade region: añade una región dado su identificador. No hace nada si ya existe. (c) a~ nade poblacion: añade una población de n individuos de la especie e a la región r si e no existe en r, o incrementa en n la población de la especie e en la región r. Lanza un error si r no existe o si la especie no existe y n ≤ 0. Si, como consecuencia de un incremento negativo, la población de una especie en una región pasa a ser ≤ 0, la especie desaparece completamente de la región. (d) menor poblacion: determina la especie e con menor población y la región r a la que pertenece; lanza un error si la estructura está vacı́a. (e) especies en region: lista en orden alfabético ascendente todas las especies de una región r, con sus poblaciones respectivas. Si no hay especies en la región, devuelve la lista vacı́a. Lanza error si la región no existe. (f) elimina especie: elimina la especie e de una región r. No hace nada sino existe la especie en esa región. Lanza error si la región no existe. (g) fusiona regiones: une las especies de la region r1 con las de la región r2 en r2, en el caso de especies comunes se suman las poblaciones. La región r1 desaparece. Lanza error si alguna de las regiones no existe. template < typename T1 , typename T2 > struct pair { T1 first ; T2 second ; }; class Extincion { public : Extincion () throw ( error ); ... void a~ n ade_region ( const string & r ) throw ( error ); void a~ n ade_poblacion ( int n , const string & e , const string & r ) throw ( error ); pair < string , string > menor_poblacion () const throw ( error ); 5 void esp ec ie s_ en _r eg io n ( const string & r , list < pair < string , int > >& L ) const throw ( error ); void elimina_especie ( const string & e , const string & r ) throw ( error ); void fusiona_regiones ( const string & r1 , const string & r2 ) throw ( error ); ... }; Denotaremos R el número de regiones y N el número de poblaciones (poblaciones de una misma especie en diversas regiones cuentan por separado). El número medio de poblaciones por región es n = N/R. Idealmente, el coste promedio de la operación especies en region deberı́a ser Θ(n), el coste de menor poblacion deberı́a ser Θ(1) y el coste promedio de las operaciones a~ nade poblacion y elimina especie deberı́a ser O(n + log N ). (a) Escribe en C++ la representación de la clase (parte privada de la definición, es decir, el .rep para la clase Extincion. Dibuja un diagrama que ilustre la definición propuesta. (b) Implementa en C++ el método fusiona regiones. Calcula su coste. (c) Describe brevemente cómo se implementarı́an a~ nade region, a~ nade poblacion, menor poblacion,elimina especie y especies en region. Calcula su coste. SOLUCIÓN: 6 Apellidos, Nombre (Continuad respondiendo aquı́ la Pregunta 3.) 7 D.N.I. Apellidos, Nombre (Continuad respondiendo aquı́ la Pregunta 3.) 8 D.N.I. Apellidos, Nombre (Continuad respondiendo aquı́ la Pregunta 3.) 9 D.N.I. Apellidos, Nombre (Continuad respondiendo aquı́ la Pregunta 3.) 10 D.N.I.