Primer parcial de EDA Facultad de Informática de Valencia 31 de enero de 2005 – Duración 3.5 horas No olvides poner el nombre. No utilices lápiz ni tinta roja. Pregunta 1 (2.5 puntos) Dada la siguiente implementación en C++ de un árbol binario: c l a s s nodo abb { // c l a s e a u x i l i a r para r e p r e s e n t a r un nodo public : int v a l o r ; nodo abb ∗ h i z q , ∗ h d e r ; }; c l a s s abb { // c l a s e á r b o l b i n a r i o public : nodo abb ∗ r a i z ; abb ( ) ; ˜abb ( ) ; void l i s t a r p r o f u n d i d a d ( i n t d i s t ) ; // <−− E j e r c i c i o a p a r t a d o a ) void l i s t a r a l t u r a ( i n t d i s t ) ; // <−− E j e r c i c i o a p a r t a d o b ) }; Se pide: a) (1.25 puntos) Implementa un método que escriba por pantalla los valores de todos los nodos que tengan una distancia dada desde la raı́z (la distancia de la raı́z a sı́ misma es 0). Ejemplos: una llamada con valor 0 visualizarı́a la raı́z del árbol, con valor 1 sus hijos, etc. b) (1.25 puntos) Implementa un método que escriba por pantalla los valores de los nodos tales que la distancia a sus hojas más lejanas sea igual a un valor dado. Ejemplos: una llamada con distancia 0 visualizarı́a las hojas del árbol, una llamada con valor 1 los nodos que tengan sólo hojas como hijos, etc. Puedes utilizar atributos,métodos,etc. auxiliares si lo consideras conveniente. Pregunta 2 (2.5 puntos) Disponemos de dos tablas hash con el mismo número de cubetas y con la misma función de dispersión que almacenan valores enteros. Las tablas realizan una resolución de colisiones por encadenamiento. Las listas asociadas a cada cubeta contienen los valores ordenados de menor a mayor. Queremos obtener otra tabla con el mismo número de cubetas que contenga una copia de los elementos de ambas tablas. Si algún elemento está en las dos tablas, no debe aparecer repetido. Las listas asociadas a cada cubeta en la tabla resultado deben contener los elementos ordenados de menor a mayor. Implementa este método de modo que el coste de la operación sea lineal con el número de elementos más el número de cubetas de la tabla resultante. struct nodo { int c l a v e ; nodo ∗ s i g ; }; class tablaHash { public : i n t numcubetas ; nodo ∗ ∗ t a b l a ; i n t f u n c i o n h a s h ( i n t c l a v e ) ; // d e v u e l v e v a l o r e n t r e 0 y numcubetas −1 t a b l a H a s h ( i n t numcubetas ) ; ˜ tablaHash ( ) ; void i n s e r t a r ( i n t c l a v e ) ; // implementar e l método s i g u i e n t e : // s i l a s dos t a b l a s no t i e n e n mismo número de c u b e t a s d e v u e l v e 0 t a b l a H a s h ∗ u n i r ( const t a b l a H a s h ∗ o t r a ) const ; }; Pregunta 3 (2.5 puntos) Dada la siguiente implementación de un max heap: c l a s s max heap { i n t ∗ v e c t o r ; // ı́ n d i c e s v á l i d o s d e s d e 1 h a s t a tamanyo // e l e m e n t o s g u a r d a d o s en ı́ n d i c e s d e s d e 1 h a s t a ocupados i n t tamanyo ; // d e l v e c t o r i n t ocupados ; // número e l e m e n t o s que hay en e l heap public : max heap ( i n t tamanyo maximo ) ; ˜ max heap ( ) ; void h e a p i f y ( i n t pos ) ; void b u i l d h e a p ( ) ; bool e x t r a e r m a x i m o ( i n t ∗ e l e m e n t o ) ; void i n s e r t a r ( i n t e l e m e n t o ) ; // <− método a implementar }; a) (2 puntos) Implementa de la forma más eficiente el método de inserción de modo que se doble el tamaño del vector cuando se va a insertar un nuevo elemento y éste esté lleno. b) (0.5 puntos) Indica el coste del método implementado ¿serı́a necesario volver a realizar un buildheap? Razona la respuesta. Puedes utilizar atributos,métodos,etc. auxiliares si lo consideras conveniente. Pregunta 4 (2.5 puntos) Tenemos una lista de pares de amigos, y otra lista de pares de enemigos. Por simplicidad, cada individuo viene identificado por un valor numérico desde 0 hasta el número de individuos menos 1. Queremos implementar una función que compruebe si la famosa frase: “Los amigos de mis amigos son mis amigos” se cumple para las dos listas previamente proporcionadas. Por ejemplo, si 0 y 1 son amigos, 1 y 2 son amigos pero 0 y 2 son enemigos, la frase no es cierta. El prototipo de la función a implementar es: bool amigosdemisamigos ( par ∗ amigos , i n t num pares amigos , par ∗ enemigos , i n t n u m p a r e s e n e m i g o s ) ; donde se reciben los vectores de entrada y sus respectivos tamaños. Previamente hemos declarado: struct par { int a , b ; }; Nota: En caso de utilizar alguna de las estructuras de datos vistas en clase, hay que indicar lo que hace pero no es necesario implementarla.