LetraYSolucionDiciembre 2020
LetraYSolucionDiciembre 2020
LetraYSolucionDiciembre 2020
Universidad de la República
Examen de Programación 2
16 de Diciembre 2020
a) Implemente un procedimiento iterativo insFinal que dados una lista de enteros l y un entero e,
agregue a e al final de l. Si la lista es vacía, lo insertará como único elemento de ésta.
b) Dada la siguiente función iterativa copia en C++ que, dada una lista de enteros l devuelve una copia
idéntica de l sin compartir memoria con ésta:
Calcule el orden de tiempo de ejecución en el peor caso de la función copia. Justifique brevemente.
c) Sin usar el procedimiento insFinal ni otras estructuras auxiliares, implemente la función
copiaEficiente para construir la copia de una lista, sin compartir memoria, en un menor orden de
tiempo de ejecución en el peor caso que la función copia. Calcule el orden del peor caso y justifique
brevemente.
1/4
Instituto de Computación. Facultad de Ingeniería. Universidad de la República
Examen de Programación 2
16 de Diciembre 2020
2/4
Instituto de Computación. Facultad de Ingeniería. Universidad de la República
Examen de Programación 2
16 de Diciembre 2020
// POS: Devuelve la suma total de ocurrencias de todos los elementos del multiset m (0 si m está vacío).
int cantidad (Multiset m);
// POS: Devuelve la cantidad de ocurrencias del elemento x del multiset m (0 si x no está en m).
int ocurrencias (Multiset m, int x);
/* POS: Elimina a lo sumo n ocurrencia del elemento x del multiset m. Si ocurrencias(m, x)<=n entonces
en m no quedarán ocurrencias del elemento x. */
void eliminar (Multiset & m, int x, int n);
// POS: Devuelve el mínimo elemento del multiset m (independientemente del número de ocurrencias).
PRE: m no vacío.
int min (Multiset m);
Se quiere implementar el TAD Multiset anterior de tal manera que las operaciones insertar, ocurrencias y
eliminar tengan O(log(n)) de tiempo de ejecución en el caso promedio, siendo n la cantidad de elementos
diferentes del multiset, y las operaciones crear, cantidad y min tengan O(1) peor caso. Además, eliminar
deberá liberar la memoria correspondiente. La implementación debe hacerse en espacio O(n).
Se pide:
a) Defina en C++ la representación del TAD y escriba los códigos de las operaciones crear, insertar y
min. Omita el código del resto de las operaciones, que puede asumir están implementadas.
struct RepMultiset;
typedef RepMultiset * Multiset;
3/4
Instituto de Computación. Facultad de Ingeniería. Universidad de la República
Examen de Programación 2
16 de Diciembre 2020
Solución:
a)
typedef nodoABB* ABB;
struct nodoABB { int elem; int ocurr; ABB izq, der;};
struct RepMultiset {ABB multi; int cant; int Mmin;};
typedef RepMultiset * Multiset;
Multiset crear(){
Multiset m = new RepMultiset;
m->multi = NULL;
m->cant = 0;
return m;
}
4/4