Parcial de Programación 2

Anuncio
Instituto de Computación. Facultad de Ingeniería. Universidad de la República
Parcial de Programación 2
Mayo de 2013
Generalidades:
•
La prueba es individual y sin material; la duración es 3 horas; sólo se contestan dudas acerca de la letra de los ejercicios.
•
Escriba las hojas de un sólo lado y con letra clara; comience la solución de cada ejercicio en una nueva hoja; numere cada
hoja, indicando en la primera el total; coloque su número de cédula y nombre en cada hoja.
SI TODAS LAS RESTRICCIONES EXPLICITADAS DE UN EJERCICIO NO SON CUMPLIDAS POR LA SOLUCIÓN
PROPUESTA, EL EJERCICIO TENDRÁ PUNTAJE 0. PRESTAR ATENCIÓN A LAS NOTAS INCLUÍDAS EN CADA
EJERCICIO.
•
Ejercicio 1 (14 puntos)
Considere las siguientes declaraciones, en Modula-2, del tipo de las listas de números enteros LInt y del tipo de
las listas de números enteros con cantidad de ocurrencias LCantInt.
LInt = POINTER TO NodoLista;
LCantInt = POINTER TO NodoCantLista;
NodoLista = RECORD
info : INTEGER;
sig : LInt
END;
NodoCantLista = RECORD
info : INTEGER;
cant : CARDINAL;
sig : LCantInt
END;
Se pide, accediendo directamente a la representación, implementar la siguiente función iterativa:
ordenar: que dada una lista de enteros de tipo LInt, con valores en el rango [1:K], con K un valor entero
constante, retorne una lista compacta de tipo LCantInt ordenada, de menor a mayor, donde cada elemento x
contenga la cantidad de ocurrencias del mismo en la lista parámetro (x, cant_x). La función debe tener O(n) de
tiempo de ejecución en el peor caso, siendo n la cantidad de elementos de lista parámetro.
PROCEDURE ordenar (L:LInt): LCantInt;
No se permite definir procedimientos ni funciones auxiliares. No obstante, se sugiere utilizar una estructura de
datos estática auxiliar, teniendo en cuenta que K es un valor constante, con el objetivo de satisfacer la restricción
temporal exigida para la función ordenar.
Ejemplos:
Entradas (asumiendo K ≥ 9 en los ejemplos)
Resultado de ordenar
L = [9, 5, 2, 5, 9, 5]
[(2,1), (5,3), (9,2)]
(el 2 ocurre una vez, el 5 ocurre 3 veces y el 9 ocurre 2 veces)
L = [9, 5, 2, 5, 4, 1, 7, 9, 3, 4, 3, 9]
[(1,1), (2,1), (3,2), (4,2), (5,2), (7,1), (9,3)]
L = [9,2,5]
[(2,1), (5,1), (9,1)]
L = []
[]
Ejercicio 2 (14 puntos)
Considere la siguiente declaración, en Modula-2, del tipo de los árboles binarios de búsqueda de enteros:
ABB = POINTER TO ABNode;
ABNode = RECORD
raiz : INTEGER;
izq : ABB;
der : ABB;
END;
Se pide, accediendo directamente a la representación, implementar la siguiente función recursiva:
copia: que dados un árbol binario de búsqueda de enteros A de tipo ABB (sin elementos repetidos) y un entero x,
retorne una copia del subárbol de A que tenga a x como raíz. Si x no pertenece al árbol A, el resultado debe ser el
árbol vacío. La función debe retornar un árbol que no comparta memoria con el árbol parámetro.
PROCEDURE copia (A:ABB; x:INTEGER): ABB;
Si usa procedimientos o funciones auxiliares, deberá implementarlos.
Ejemplo:
8
3
9
2
y
x=7
copia
7
7
4
4
6
6
Para el árbol de arriba y x = 5, copia retorna el árbol vacío. Lo mismos ocurre si el árbol es vacío,
independientemente del valor de x.
Ejercicio 3 (12 puntos)
Considere árboles generales (finitarios) de naturales representados como árboles binarios con la semántica:
“primer hijo”–“siguiente hermano”, de tipo ARBOL.
ARBOL = POINTER TO Nodo;
Nodo =
RECORD
dato: CARDINAL;
primerHijo: ARBOL;
sigHermano: ARBOL;
END;
Escriba, accediendo directamente a la representación y sin definir operaciones auxiliares, un
procedimiento recursivo:
PROCEDURE Min (A:ARBOL; k:CARDINAL; VAR dirMin:ARBOL);
que dado un árbol general no vacío A, representado por uno binario de tipo ARBOL, sin elementos repetidos y un
número natural k mayor que 0, deje en dirMin un puntero el mínimo elemento de A que se encuentra en los
primeros k niveles del árbol. Si k es mayor a la altura de A, el procedimiento debe almacenar en dirMin el
puntero al mínimo elemento del árbol.
Por ejemplo, dado el siguiente árbol general:
7
2
1
9
10
6
5
8
3
12
15
11
4
13
El procedimiento debe dejar en dirMin un puntero al nodo con dato 7 si k es 1; un puntero al nodo con dato 2 si
k es 2; y un puntero al nodo con dato 1 si k ≥ 3.
Descargar