Primer parcial de EDA Facultad de Informática de Valencia 4 de febrero de 2004 – Duración 3.5 horas No olvides poner el nombre. No utilices lápiz ni tinta roja. Pregunta 1 (2 puntos) Dada la siguiente implementación en C++ de un árbol binario de búsqueda: 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 ; nodo abb ( i n t v , nodo abb ∗ h i z q , nodo abb ∗ hder ) ; void l i s t a r r a n g o ( i n t vmin , i n t vmax ) ; // <−− E j e r c i c i o problema 2 }; c l a s s abb { // c l a s e a r b o l b i n a r i o de b u s q u e d a public : nodo abb ∗ r a i z ; abb ( ) ; abb ( i n t ∗ v e c t o r , i n t t a l l a ) ; // <−− E j e r c i c i o problema 1 ˜abb ( ) ; void l i s t a r r a n g o ( i n t vmin , i n t vmax ) ; }; void abb : : l i s t a r r a n g o ( i n t vmin , i n t vmax ) { i f ( r a i z ! = 0 ) r a i z −>l i s t a r r a n g o ( vmin , vmax ) ; } Esta clase dispone de un constructor que, a partir de un vector de enteros, ordenado de menor a mayo, de tamaño talla, construye un árbol binario de búsqueda lo más equilibrado posible. Se pide: a) Implementa este constructor con la técnica “divide y vencerás” b) Estudia su coste asintótico. Pregunta 2 (2 puntos) Dada la implementación en C++ del árbol binario de búsqueda del ejercicio anterior, escribe un método que imprima ordenadamente todos los valores del árbol comprendidos entre un rango [min, max]. El algoritmo no debe explorar ramas innecesarias del árbol. Pregunta 3 (2 puntos) Dado el siguiente histograma de ocupación de una tabla de dispersión: Histograma original 7 Numero de cubetas 6 5 4 3 2 1 0 -1 0 1 2 3 4 Longitud de la lista 5 6 a) ¿Cuántos elementos contiene la tabla de dispersión? ¿Y cuántas cubetas? Se insertan 4 elementos diferentes que no están en la tabla. Uno de los siguientes histogramas corresponde al estado de la tabla tras realizar las inserciones. Histograma B 7 6 6 Numero de cubetas Numero de cubetas Histograma A 7 5 4 3 2 1 5 4 3 2 1 0 0 -1 0 1 2 3 4 Longitud de la lista 5 6 -1 0 1 2 3 4 Longitud de la lista 5 6 b) Indica cuál es el histograma correspondiente a la tabla tras las inserciones. Es imprescindible razonar la respuesta. Pregunta 4 (2 puntos) Dada la siguiente implementación de un maxheap: c l a s s max heap { i n t ∗ v e c t o r ; // v e c t o r que empieza con i n d i c e 1 i n t tamanyo ; // d e l v e c t o r i n t ocupados ; // numero e l e m e n t o s que hay en e l heap i n t padre ( i n t pos ) { return pos / 2 ; } i n t h i j o i z q ( i n t pos ) { return 2 ∗ pos ; } i n t h i j o d e r ( i n t pos ) { return 2 ∗ pos + 1 ; } i n t b u s c a r r e c u r s ( i n t pos , i n t v a l o r ) ; // <−− E j e r c i c i o d e l examen public : max heap ( i n t tamanyo maximo ) ; ˜ max heap ( ) ; void h e a p i f y ( i n t pos ) ; bool e x t r a e r m a x i m o (T& e l e m e n t o ) ; void b u i l d h e a p ( ) ; int buscar ( int v a l o r ) ; }; i n t max heap : : b u s c a r ( i n t v a l o r ) { i f ( ocupados == 0) return −1; return b u s c a r r e c u r s ( 1 , v a l o r ) ; } Implementa un método recursivo para buscar un elemento. Este método no bajará por aquellos subárboles que, por la propiedad de orden del maxheap, no puedan contener el valor buscado. Devolverá la posición del elemento encontrado (el ı́ndice en el vector) y, en caso de no encontrarse el elemento, devolverá -1. Pregunta 5 (2 puntos) Dada la siguiente clase MFSET: c l a s s MFset { public : int ∗ mfset ; i n t num elem ; MFset ( i n t num elem ) ; ˜MFset ( ) ; void merge ( i n t x , i n t y ) ; int f i n d ( int x ) ; void cambiar ( i n t x , i n t y ) ; // <−− E j e r c i c i o d e l examen }; Implementa la operación cambiar(x,y) de un MFSET de tal manera que, si x no es el representante de su partición, lo extraiga del conjunto en el que está y lo asigne al conjunto al que pertenezca y.