Examen PS 2009-2010-Q1_final

Anuncio
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.
Descargar