Trabajo Práctico 4 - Departamento de Ciencias e Ingeniería de la

Anuncio
TRABAJO PRÁCTICO Nº 4
ESTRUCTURAS DE DATOS Y ALGORITMOS
Licenciatura en Ciencias de la Computación - Primer cuatrimestre de 2008
Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur
Listas
Ejercicio 1: "
a) Defina el TDA lista, es decir, indique el modelo matemático sobre el cual está basado, y un
conjunto de operaciones, con sus respectivas descripciones, para manejar datos de este tipo.
Ejercicio 2: "
a) Defina los conceptos de posición en una lista enlazada.
L
b) Suponga que la lista anterior no tiene celda de encabezamiento y que la posición de un elemento
es el enlace que apunta a la celda que contiene el elemento. Indique la celda que contiene al
primer elemento, al tercero y al último. Señale además la posición del primer elemento, la del
tercero y la del último.
c) Suponga ahora que la lista anterior tiene celda de encabezamiento y que la posición de un
elemento es el enlace que apunta a la celda que contiene el enlace que apunta a la celda que
contiene el elemento. Indique la celda que contiene al primer elemento, al tercero y al último.
Señale además la posición del primer elemento, la del tercero y la del último.
d) Indique para ambos casos el concepto de "fin de lista".
Ejercicio 3:
a) ¿Qué estructuras de datos podrían usarse para implementar el TDA lista? Analice las ventajas y
desventajas de cada una de ellas.
b) Implemente el TDA lista con punteros y con celda de encabezamiento. Indique cómo se
definiría en esta implementación el concepto de posición. Analice los tiempos de ejecución de
las operaciones.
c) Implemente el TDA lista con cursores, de la manera que crea más conveniente. Analice los
tiempos de ejecución de las operaciones.
d) Escriba un programa de prueba, para verificar el correcto funcionamiento de los TDA
implementados.
Nota: La implementación debe realizarse de manera que el oscurecimiento de la estructura sea total.
Ejercicio 4:
Dadas dos listas ordenadas L1 y L2, se desea obtener una tercera lista ordenada U (la unión de L1 y
L2) que contenga los elementos de L1 y L2, (sin los elementos repetidos).
L1 y L2 son listas simplemente enlazadas e implementadas con punteros. La lista U, en cambio,
debe estar implementada con cursores. En las tres listas el orden es creciente, y la implementación
es sin celda de encabezamiento.
a) Escriba un programa, sin usar el TDA lista, que tenga como entrada L1 y L2 y muestre la lista
resultante. Las listas L1 y L2 deben ser eliminadas durante el proceso de unión.
b) Analice además el tiempo de ejecución del programa, en términos de las longitudes de las listas.
1
TRABAJO PRÁCTICO Nº 4
ESTRUCTURAS DE DATOS Y ALGORITMOS
Licenciatura en Ciencias de la Computación - Primer cuatrimestre de 2008
Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur
Ejercicio 5:
Escriba un procedimiento recursivo y otro no recursivo para liberar todas las celdas de una lista L
implementada con punteros y con celda de encabezamiento. La lista debe recorrerse una sola vez.
Muestre que los procedimientos implementados son correctos.
Ejercicio 6:
El siguiente procedimiento se hizo con el propósito de eliminar todas las apariciones de un
elemento x de una lista L. Explique por qué no siempre funciona y sugiérase una manera de
arreglarlo para que realice la tarea propuesta:
a) Versión [1]:
PROCEDURE Elimina_apariciones (x: TipoElemento; VAR L: Lista);
VAR
P : Posición;
BEGIN
P := Primera(L);
WHILE P <> FIN(L) DO
IF Recupera(P,L) = x THEN
Elimina(P,L)
END;
P := Siguiente(P,L)
END
END Elimina_apariciones;
a) Versión [2]:
PROCEDURE Elimina_apariciones ( x: TipoElemento; VAR L: Lista);
VAR
P : Posición;
BEGIN
P := Primera(L);
WHILE P <> FIN(L) DO
IF Recupera(P,L) = x THEN
A := P;
P := Siguiente(P,L);
Elimina(A, L)
END
A := P
P := Siguiente(P,L)
END
END Elimina_apariciones;
Ejercicio 7:
a) Escriba en Modula-2 un procedimiento no recursivo Invertir(L), que dada un lista L devuelve
a L con sus elementos en el orden inverso al que estaban. Para realizar esta operación deberá
utilizar ÚNICAMENTE las operaciones del TDA lista visto en clase. Puede utilizar si fuera
necesario una o varias listas auxiliares. Deberá asegurarse que una vez que termina el
procedimiento, no queden en la memoria celdas ocupadas e inaccesibles (basura). Invertir(L)
debe ser a lo sumo de O(n) donde n es la cantidad de elementos de L.
b) Escriba en Modula-2 un procedimiento recursivo Invertir-Rec(L) para realizar la misma
tarea que el del inciso anterior, utilizando ÚNICAMENTE las operaciones del TDA lista. La
diferencia es que ahora NO puede utilizar ninguna estructura auxiliar.
Al igual que antes, deberá asegurarse que no queden en la memoria celdas ocupadas e
inaccesibles (basura). Determine el orden del tiempo de ejecución de su solución. Además,
2
TRABAJO PRÁCTICO Nº 4
ESTRUCTURAS DE DATOS Y ALGORITMOS
Licenciatura en Ciencias de la Computación - Primer cuatrimestre de 2008
Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur
determine si puede hallar una solución de orden lineal en la cantidad de elementos de la lista de
tal manera que su correcto funcionamiento sea independiente de la implementación subyacente
del TDA lista.
Ejercicio 8:
Escriba en Modula-2 la estructura de datos para implementar con cursores una lista con los nombres
de alumnos, y para cada uno de ellos una lista con los números de código de las materias que ha
cursado, y otra lista con los códigos de las materias que ha aprobado.
Ejercicio 9:
El siguiente procedimiento intenta insertar un elemento x en la posición P de una lista L.
PROCEDURE Inserta_en_Pos (VAR L: Lista; x: TipoElemento; P: Posición);
VAR
Salir : BOOLEAN;
Enlace: Posición;
BEGIN
Salir := FALSE;
Enlace := L;
WHILE Enlace <> NIL AND NOT Salir DO
IF Enlace = P
THEN
SigEnlace := Enlace^.Sig;
ALLOCATE(Enlace, SIZE(Enlace^));
Enlace^.Elemento := x;
Enlace^.Sig := SigEnlace;
Salir := TRUE
ELSE
Enlace := Enlace^.Sig
END;
END;
END Inserta_en_Pos;
Explique si logra el objetivo propuesto, en caso de no hacerlo cuál es el motivo.
Ejercicio 10:
a) Compare la implementación de listas con un arreglo y listas enlazadas con punteros. Analizando
el tiempo de ejecución de las operaciones y el uso de memoria. suponiendo que el tipo elemento
ocupa E bytes, y un puntero ocupa P bytes.
Indique las ventajas y desventajas de cada implementación.
b) Suponga que tiene que utilizar una lista de N elementos. Compare el uso de memoria de utilizar
arreglos, cursores, y punteros
c) Suponga que tiene que utilizar 10 listas de N elementos
d) Suponga que tiene que utilizar 10 listas de distinto tipo elemento
Ejercicio 11: Lista circular
El campo "de enlace" de la última celda de una lista simplemente enlazada, siempre contiene el
valor NIL. En algunos casos conviene hacer un uso más provechoso de este campo. Por ejemplo
hacer que apunte a la primera celda de la lista. Con esta modificación, la estructura resultante se
llama Lista circular (o lista circularmente enlazada) y su representación gráfica, para una lista sin
celda de encabezamiento es la siguiente:
3
TRABAJO PRÁCTICO Nº 4
ESTRUCTURAS DE DATOS Y ALGORITMOS
Licenciatura en Ciencias de la Computación - Primer cuatrimestre de 2008
Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur
...
L
a)
Si la anterior se tratara de una lista con celda de encabezamiento, ¿dónde debería apuntar
dicho campo?
b)
Implemente el TDA lista circular con punteros y con celda de encabezamiento.
Ejercicio 12: Lista doblemente enlazada
a) ¿Qué concepto de posición conviene usar en una lista doblemente enlazada? ¿Por qué?
b)
Implemente el TDA lista doblemente enlazada. Utilice punteros y el concepto de posición
más conveniente.
c) "Analice el orden de los tiempos de ejecución de las operaciones de este TDA. Compare con
los obtenidos para el TDA lista simplemente enlazada implementado con punteros.
d) Indique las ventajas y desventajas del doble enlace.
Ejercicio 13: Una cadena de caracteres es una sucesión de caracteres. Por lo tanto una estructura de
datos adecuada para el TDA cadena del práctico 1 sería una lista.
a) " Escriba la estructura de datos para dicho TDA usando arreglos, y usando una lista
implementada con punteros.
b) ¿Cuánto espacio ocupa en memoria una cadena de N caracteres en el caso que la estructura
de datos sea un arreglo de longitud L ? ¿ y en el caso que la estructura sea una lista ? Recuerde
que los caracteres ocupan 1 byte y que los punteros ocupan lugar en la memoria (en general 4
bytes).
c) Para una cadena cualquiera de longitud N, la mejor situación sería que ocupe solo N bytes
de memoria. ¿Puede definirse una estructura de datos con estas características?
d) " Escriba una estructura que minimice el espacio de memoria para una cadena de caracteres.
(Ayuda: la estructura puede ser combinada).
Ejercicio 14:
Realice un programa que mantenga una lista de nombres de alumnos, y para cada uno de ellos una
lista con las números de código de las materias que ha cursado, y otra lista con los códigos de las
materias que ha aprobado. El programa deberá permitir la carga de nuevas materias cursadas y
aprobadas, verificando que no estén ya cargadas en la lista. En el caso de las materias aprobadas
deberá verificar además que éstas hayan sido cursadas.
Ejercicio 15:
Se desea implementar en Modula-2 una lista doblemente enlazada con punteros, con celda de
encabezamiento, con exportación opaca. Escribir en Modula-2 la estructura de datos para
implementar una lista con estas características, especificando claramente que incluiría en los
módulos de definición y de implementación. Asuma que dispone de un módulo TIPOELE que
4
TRABAJO PRÁCTICO Nº 4
ESTRUCTURAS DE DATOS Y ALGORITMOS
Licenciatura en Ciencias de la Computación - Primer cuatrimestre de 2008
Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur
implementa al tipo elemento en forma opaca, con las operaciones necesarias para manejar el tipo
elemento.
a) Escriba la operación crear_Lista_Vacia para la estructura del inciso (a).
b) Sin utilizar las operaciones del TDA lista, y con total acceso a la estructura, escriba un
procedimiento que reciba dos listas A y B implementadas con la estructura del inciso (a). El
procedimiento deberá eliminar la primer ocurrencia de la lista B en A. Ejemplo: si B contiene
los elementos [x,y,z] y A contiene [a,x,b,x,y,z,c,d,x,y,z], entonces luego de ejecutar el
procedimiento debe quedar A con [a,x,b,c,d,x,y,z] . Asegúrese de no dejar locaciones de
memoria inaccesibles.
c) Indique el orden del tiempo de ejecución del procedimiento anterior. Justifique su respuesta.
Ejercicio 16: Se desea escribir un procedimiento generar_Lista_Resumen(L1, L2, R) que
reciba dos listas L1 y L2 (del mismo tipo elemento), y genere la lista R cuyos elementos serán
ternas de la forma:
(elemento E, cantidad de apariciones de E en L1, cantidad de apariciones de E en L2)
Ejemplo:
Sean L1 = <a, b, a, c, d, b> y L2 = <c, a, b, f, c> el procedimiento deberá generar la lista:
R = <(a, 2, 1), (b, 2, 1), (c, 1, 2), (d, 1, 0), (f, 0, 1)>
Las listas L1, L2 y R serán listas simplemente enlazadas con cursores, con celda de
encabezamiento y la posición de un elemento E será el cursor a la celda que contiene un cursor a la
celda que contiene a E. Los elementos de las listas L1 y L2 serán de tipo caracter.
a) Escriba en Modula-2 las estructuras de datos necesarias para implementar dichas listas con
exportación transparente.
b) Implemente en Modula-2 la operación Generar_Lista_Resumen sin utilizar las operaciones de
ningún TDA y con total acceso a las estructuras. Las listas L1 y L2 NO están ordenadas.
Implemente toda operación que utilice.
c) Indique el orden del tiempo de ejecución del procedimiento anterior. ¿Sería el mismo si las
listas L1 y L2 estuvieran ordenadas?. Justifique su respuesta.
Ejercicio 17:
Escriba utilizando únicamente las operaciones provistas por los TDA Lista y TDA TipoElemento
un procedimiento en Modula-2 que teniendo como entrada dos listas L1 y L2, devuelva verdadero si
L1 está compuesta por los elementos de L2 en el mismo orden, seguidos de los elementos de L2 en
orden inverso. El procedimiento escrito debe ser a lo sumo de O(n) donde n es la cantidad de
elementos de L1. Asegúrese que una vez ejecutado el procedimiento no se pierden L1 y L2.
Ejemplo:
Si L1 = <1,2,3,4,4,3,2,1> y L2 = <1, 2, 3, 4> entonces el proc. deberá devolver verdadero.
Si L1 = <1,2,3,4,4,3,2,1,5> y L2 = <1, 2, 3, 4> entonces el procedimiento deberá devolver falso
5
TRABAJO PRÁCTICO Nº 4
ESTRUCTURAS DE DATOS Y ALGORITMOS
Licenciatura en Ciencias de la Computación - Primer cuatrimestre de 2008
Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur
Ejercicio 18:
a) Este procedimiento fue diseñado para imprimir los elementos pares de una lista de números
enteros a medida que los va eliminando. Determine por qué el procedimiento es incorrecto y
proponga cambios para solucionarlo.
b) Al finalizar la ejecución del procedimiento, determine en qué condiciones queda la lista con
la que se lo invocó.
PROCEDURE ImprimePares( L : Lista );
VAR P : Posicion;
X : TElemento;
BEGIN
P := Primera(L);
IF P <> Fin(L) THEN
TElemento.AsignarElemento(X, Recupera(P,L));
IF TElemento.EsPar(X) THEN
TElemento.ImprimirElemento(X);
END;
TElemento.EliminarElemento(X);
ImprimePares(L);
END;
END ImprimePares;
Ejercicio 19:
Dada la siguiente porción de código, determine la función del mismo y si existe algún error,
proponga modificaciones:
PROCEDURE OrdenarLista( L : Lista );
VAR P, M : Posición;
BEGIN
P := Primera( L );
WHILE P <> Fin(L) DO
M := BuscarMinimo( P, L );
Intercambiar( M, P, L );
P := Siguiente(P,L);
END;
END OrdenarLista;
PROCEDURE Intercambiar( M, P : Posición; L : Lista );
BEGIN
(* Intercambia los elementos de las posiciones M y P en la
lista L *)
END Intercambiar;
PROCEDURE BuscarMinimo( P : Posición; L : Lista ) : Posicion;
VAR Min : Posición;
X : TElemento;
BEGIN
CrearElemento(X);
Min := P;
WHILE P <> Fin(L) DO
AsignarElemento(X, RecuperarElemento(P,L));
IF MenorElemento(X, Recuperar(Min,L)) THEN
Min := P;
END;
P := Siguiente(P,L);
END;
RETURN Min;
BorrarElemento(X);
END OrdenarLista;
6
TRABAJO PRÁCTICO Nº 4
ESTRUCTURAS DE DATOS Y ALGORITMOS
Licenciatura en Ciencias de la Computación - Primer cuatrimestre de 2008
Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur
Ejercicio 20:
Este procedimiento fue diseñado para eliminar un elemento de una posición determinada de una
lista simplemente enlazada, utilizando direccionamiento directo y con total acceso a la estructura de
datos. Determine si realiza lo indicado; en caso contrario, indique cuál es el error y proponga
modificaciones para solucionarlo.
PROCEDURE Eliminar_en_pos(P : Posición; VAR L : Lista );
VAR Q : Posición;
BEGIN
Q := Anterior( P, L );
Q := Siguiente(P,L);
DEALLOCATE( P, SIZE(P^) );
END Eliminar_en_pos;
Ejercicio 21:
El siguiente procedimiento fue pensado para imprimir los elementos de una pila de enteros en forma
invertida. Determine los errores que contiene y proponga una versión alternativa.
PROCEDURE ImprimirPilaEnReverso( VAR P : Pila );
VAR E : Elemento;
BEGIN
CrearElemento(E);
AsignarElemento( E, Tope(P) );
Desapilar( P );
ImprimirPilaEnReverso(P);
ImprimirElemento( E );
Apilar( E, P );
END ImprimirPila
Ejercicio 22:
El siguiente procedimiento fue pensado para copiar una pila de enteros implementada con punteros.
PROCEDURE CopiarPila( VAR Destino : Pila; Origen :
Pila );
VAR E : Elemento;
BEGIN
IF NOT ( PilaVacia( Origen ) ) THEN
CrearElemento( E );
AsignarElemento( E, Tope( Origen ) );
Desapilar( Origen );
CopiarPila( Destino, Origen );
Apilar( Destino );
END;
END CopiarPila;
a) ¿Se mantiene la pila de origen? En caso negativo, proponga modificaciones al código dado.
b) Analice el efecto de la elección del tipo de pasaje de parámetro en la solución planteada en el
punto (a)
c) Considere las preguntas anteriores bajo una implementación basada en una estructura de datos
estática.
7
TRABAJO PRÁCTICO Nº 4
ESTRUCTURAS DE DATOS Y ALGORITMOS
Licenciatura en Ciencias de la Computación - Primer cuatrimestre de 2008
Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur
Ejercicios opcionales Ø
I: 0
El cifrado de datos una de las formas de proteger la información almacenada en una computadora.
Al cifrar la información, se cambia cada uno de los caracteres almacenados, por otro carácter.
(Ejemplo: reemplazar las apariciones de una letra, por la que le sigue en el abecedario). De esta
forma, el texto queda ilegible y no se puede utilizar la información (salvo que se conozca la forma
en que de descifrarlo). La información cifrada debe poder ser recuperada nuevamente por su
propietario.
Una forma elemental de cifrar el contenido de una lista de caracteres, sería la siguiente:
• Reemplazar cada consonante por la letra que está antes que ella en el abecedario (Ej. la j por la i)
• Reemplazar la a por un 1, la e por un 2, la i por un 3, la o por un 4 y la u por un 5.
• Los demás caracteres dejarlos igual. Pero deberá elegir una política con los números del 1 al 5.
a) Realice un programa que cifre una lista de caracteres con la estrategia anterior. Use el TDA lista
implementado con punteros.
b) Ídem al inciso anterior pero utilizando el TDA lista implementado con cursores.
c) Ídem al inciso anterior pero sin utilizar el TDA lista.
d) Analice los tiempos de ejecución en los tres casos.
II:
Agregue al ejercicio 11 una tabla que contenga la lista de correlativas fuertes y débiles de cada una
de las materias. Implemente una opción del programa que permita verificar si un alumno está en
condiciones de anotarse para cursar una materia.
III:
Modifique la estructura de datos del programa del ejercicio 11 para que tenga la calificación
obtenida en las materias aprobadas. Implemente una nueva opción del programa para mostrar el
certificado analítico (lista de materias aprobadas con su calificación, y las materias cursadas y sin
rendir) de un alumno dado.
IV:
Defina e implemente un TDA Lista Ordenada. Compare el orden del tiempo de ejecución de las
operaciones con las del TDA lista dadas en clase. ¿Qué concepto de posición utiliza?
V:
Realice un programa para ordenar los elementos de una lista doblemente enlazada, usando el
método quick-sort.
8
Descargar