Primer parcial de EDA Facultad de Informática de Valencia

Anuncio
Primer parcial de EDA
Facultad de Informática de Valencia
18 de junio de 2004 – Duración 2 horas
No olvides poner el nombre. No utilices lápiz ni tinta roja.
Pregunta 1 (2.5 puntos)
Necesitamos contar el número de veces que aparece un número primo de dos cifras en un secuencia de dı́gitos
de longitud n. Por ejemplo, la secuencia de dı́gitos 11340211 tiene las siguientes subcadenas de longitud 2:
11, 13, 34, 40, 02, 21, 11
de las cuales 4 son números primos, que es el resultado devuelto. Dispones de la siguiente función:
int es primo ( int n) ;
que devuelve 1 si n es primo y 0 en otro caso, y que para entradas de 0 a 99 tiene un coste O(1). Se pide:
a) Implementa la función:
i n t numPrimos ( i n t ∗ d i g i t o s , i n t desde , i n t h a s t a ) ;
que recibe un vector con los digitos (valores de 0 a 9) y utiliza la técnica divide y vencerás para resolver
este problema dividiendo el vector en dos partes aproximadamente iguales. Ejemplo de utilización:
const i n t n = 8 ;
int v e c t o r [ n ] = { 1 , 1 , 3 , 4 , 0 , 2 , 1 , 1 } ;
i n t num = numPrimos ( v e c t o r , 0 , n−1) ;
b) Obten el coste temporal de la función del apartado a) justificándolo adecuadamente.
Pregunta 2 (2.5 puntos)
Dado el conjunto de datos: C={colada, coliflor, comer, correr, casa, sarcofago, luceros, la, una, caramelo}
Se dispone de una tabla de dispersión de tamaño m=10 y de las siguientes funciones de dispersión:
1) int F1(char∗ key){ return (int)key[0] % m;}
2) int F2(char∗ key){ return ((int)key[0] + (int) key[1] + (int) key [2]) % m;}
3) int F3(char∗ key){ return strlen(key) % m;}
NOTA: Por simplicidad considera que el valor entero del caracter ’a’ es 1, el del ’b’ , 2, etc.
Se pide:
a) Dibuja el histograma de ocupación (número de cubetas de cada longitud) para cada función de dispersión.
b) Razona brevemente cuál es la mejor función de dispersión para dicho conjunto de datos y para dicha tabla.
Pregunta 3 (2.5 puntos)
Dadas las siguiente clases C++ de un heap de enteros:
c l a s s max heap {
i n t ∗ v e c t o r ; // e l v e c t o r que s e pasa en e l c o n s t r u c t o r
i n t tamanyo , ocupados ;
public :
max heap ( i n t ∗ c o n t e n i d o , i n t tamanyo ) ; // c o n s t r u c t o r
˜ max heap ( ) ; // d e s t r u c t o r
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 ) ; // e x t r a e y b o r r a
};
c l a s s min heap {
. . . // s i m i l a r a l max heap
bool e x t r a e r m i n i m o ( i n t & e l e m e n t o ) ; // e x t r a e y b o r r a
};
i n t s e l e c c i o n ( i n t ∗ v e c t o r , i n t n , i n t k ) ; // p r o t o t i p o f u n c i o n e s a r e a l i z a r
Se pide:
a) Implementa una función que devuelva el k-ésimo menor elemento de un vector de longitud n utilizando
un min heap ¿cuál es el coste de esta operación?
b) Implementa una función que devuelva el k-ésimo menor elemento de un vector de longitud n utilizando
un max heap ¿cuál es el coste de esta operación?
c) Haz una función que obtenga el k-ésimo menor elemento de un vector de longitud n usando las funciones
anteriores, delegando en aquella que sea mejor según los valores de k y de n.
Nota: Puedes suponer 1 ≤ k ≤ n.
Pregunta 4 (2.5 puntos)
Queremos utilizar un MFSET para calcular las componentes conexas de un grafo no dirigido. Para ello haremos
un merge con el par de vértices de cada arista. Como queremos calcular al mismo tiempo el número de aristas
de cada componente conexa, utilizaremos un MFSET con rango y el valor que guardaremos en el nodo raı́z será:
−((número llamadas a merge en esta clase de equivalencia) + 1)
Por ejemplo, la figura b) corresponde a la aplicación de un merge con valores 11, 12 al MFSET de la figura a).
10
11
11
10
10
11
12
−3
10
10
12
10
11
12
−4
10
10
12
a)
b)
Dada la siguiente cabecera de la clase y el constructor:
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 ) ;
};
MFset : : MFset ( i n t num elem ) {
this−>num elem = num elem ;
m f s e t = new i n t [ num elem ] ;
f o r ( i n t i = 0 ; i < num elem ; i ++) m f s e t [ i ] = − 1 ;
}
Se pide:
a) Implementa el método merge(x,y) de manera que actualice adecuadamente el número de aristas de cada
subgrafo.
b) Implementa el método aristascc () que muestre por pantalla el número de aristas de cada componente
conexa con un coste lineal con el número de elementos del MFSET (igual al número de vértices del grafo).
Descargar