Primer parcial de EDA Facultad de Informática de Valencia 29 de

Anuncio
Primer parcial de EDA
Facultad de Informática de Valencia
29 de enero de 2010 – Duración 3 horas
Cada pregunta en una hoja separada. No utilices lápiz ni tinta roja. Se piden soluciones eficientes.
Pregunta 1 (2 puntos) Dada la siguiente clase de árbol binario de búsqueda::
c l a s s nodo {
public :
int v a l o r ;
nodo ∗ i z q , ∗ d e r ;
nodo ( i n t v , nodo ∗ i , nodo ∗d ) ;
};
c l a s s abb { // c l a s e á r b o l b i n a r i o de b ú s q u e d a
public :
nodo ∗ r a i z ;
void b a j a d a e q u i l i b r a d a ( ostream &f i c h e r o ) const ; // e j e r examen
...
};
Se pide implementar, con coste lineal, el método bajada_equilibrada que escribe, en el fichero dado
como argumento, los nodos del árbol tales que, al bajar a ellos desde la raı́z, se baja el mismo número
de veces a un hijo izquierdo que a un hijo derecho.
Nota: Puedes añadir métodos auxiliares si lo consideras conveniente, pero no nuevos atributos.
Pregunta 2 (1.5 puntos) Dado un vector de enteros V de talla N, y una función hipotética:
i n t maximo ( i n t ∗V, i n t i n i , i n t f i n ) ;
que calcula en tiempo constante el valor máximo del vector entre ini y fin. Se pide:
a) Utiliza la técnica de Divide y Vencerás para implementar la siguiente función que, con coste
sublineal, devuelva la posición del máximo del vector (1 punto):
i n t p o s i c i o n m a x i m o ( i n t ∗V, i n t N) ;
b) ¿Cuál es el coste de la función Divide y Vencerás diseñada? Demuestra dicho coste (0.5 puntos).
Pregunta 3 (3.5 puntos) Tenemos una tabla de dispersión que almacena números enteros:
class tabla {
i n t num cubetas ;
...
i n t hash ( i n t x ) { return x % num cubetas ; }
public :
...
t a b l a ( i n t n u m e r o c u b e t a s ) ; // ya implementado
void i n s e r t a r ( i n t x ) ; // ya implementado
void i n s e r t a e n c u b e t a ( i n t cubeta , i n t c a n t i d a d ) ; // e j e r examen
}
El histograma de ocupación de la tabla de dispersión en forma de vector de enteros V de talla N
representa en V[i] el número de cubetas que tienen i elementos. Se pide:
a) Para el siguiente histograma de ocupación [3, 2, 2, 1] indica el número de cubetas y un conjunto
de números enteros tales que, insertados en una tabla vacı́a con el número adecuado de cubetas,
harı́an que dicha tabla tuviese ese histograma de ocupación (0.75 puntos).
b) Escribe una función que, dado un histograma de ocupación, devuelva (por referencia) el número
de elementos y el número de cubetas (0.75 puntos):
void c a l c u l a r ( i n t ∗V, i n t N, i n t &num cub , i n t &num elem ) ;
c) Escribe el método inserta_en_cubeta que recibe el ı́ndice de una cubeta (valor entre 0 y
num_cubetas-1) y un valor n. El método debe insertar n elementos en la tabla (calculando
inversas de la función hash) de modo que caigan todos en esa cubeta (que puedes asumir que
estaba vacı́a) (0.75 puntos):
void t a b l a : : i n s e r t a e n c u b e t a ( i n t cubeta , i n t n ) ;
d) Escribe una función que recibe un histograma de ocupación y devuelve una tabla que corresponda
a dicho histograma de ocupación (1.25 puntos):
t a b l a ∗ t a b l a c o n h i s t o g r a m a ( i n t ∗V, i n t N) ;
Pregunta 4 (3 puntos) Tenemos digitalizado un mapa de N × M pixels. Cada pixel está etiquetado
como tierra (false) o agua (true). Nos han pedido simular un proceso de desertificación que seca
todas las regiones de agua (4-conectadas) que tengan menos (menor estricto) de un valor prefijado de
pixels. Para ello:
a) Implementa un MFset que utilice como rango el número de elementos de la clase de equivalencia
(cambiado de signo) (1.5 puntos):
c l a s s MFset {
i n t ∗v , n ;
public :
MFset ( i n t n ) ; // 0 . 2 5 p u n t o s
˜MFset ( ) { delete [ ] v ; }
void merge ( i n t x , i n t y ) ; // 0 . 5 p u n t o s
i n t f i n d ( i n t x ) const ; // 0 . 5 p u n t o s
i n t t a l l a s u b c l a s e ( i n t r e p r e s e n t a n t e ) const ; // 0 . 2 5 p u n t o s
};
b) Implementa una función que, dado el mapa, elimine las zonas de agua de la simulación solicitada
(1.5 puntos):
void d e s e r t i f i c a c i o n h u m e d a l e s ( bool mapa [N ] [M] , i n t umbral ) ;
Descargar