Examen Parcial I - LDC - Universidad Simón Bolívar

Anuncio
Universidad Simón Bolívar
Departamento de Computación y Tecnología de la Información
CI2612 – Algoritmos y Estructuras II
Enero-Abril 2010
Carnet:
Nombre:
Examen Parcial I
(40 puntos)
Antes de empezar, revise bien el examen, el cual consta de tres preguntas.
Pregunta 0
Pregunta 1
Pregunta 2
Total
6 puntos
6 puntos
28 puntos
40 puntos
Pregunta 0 — 6 puntos
En relación con el texto sobre tipos abstractos de datos (TADs) de Barbara Liskov (con John Guttag),
“Program Development in Java – Abstraction, Specification, and Object-Oriented Design”, responda
las siguientes preguntas:
0.0 Indique brevemente si el estilo utilizado para la especificación de TADs es algebraico o basado
en modelos, y si tales especificaciones se presentan por medio de lenguaje natural, lenguaje
matemático, lenguaje de programación, o alguna combinación de estos. Utilice el ejemplo principal de especificación de TAD usado en el texto, la especificación de IntSet, para ilustrar su
respuesta.
0.1 Liskov sugiere que la “abstraction function” y la “representation invariant” sean implementadas
para mejorar la confiabilidad de los programas. Explique muy brevemente qué son estas dos
componentes y cómo sugiere Liskov implementarlas.
Pregunta 1 — 6 puntos
En esta pregunta trabajaremos con una especificación algebraica de un tipo abstracto de datos (TAD)
para manejar multiconjuntos. Nuestro TAD estará parametrizado, como de costumbre, con el tipo
T de los elementos a ser contenidos en los multiconjuntos.
Las operaciones a considerar son las siguientes: (i) vacio, que crea un multiconjunto vacío; (ii) agregar,
que permite agregar un elemento a un multiconjunto; (iii) eliminarUna, que permite eliminar una ocurrencia de un elemento de un multiconjunto; (iv) eliminarTodas, que permite eliminar completamente
un elemento de un multiconjunto (lo cual quiere decir que desaparecen todas las ocurrencias del
elemento en cuestión); y (v) pertenencia, que permite determinar si un elemento está o no en el
multiconjunto (independientemente de cuántas ocurrencias del elemento hay).
Veamos parte de la especificación algebraica:
Especificación Algebraica de TAD Mcjto (T )
Operaciones
vacio : Mcjto(T )
agregar : T × Mcjto(T ) → Mcjto(T )
eliminarUna : T × Mcjto(T ) → Mcjto(T )
eliminarTodas : T × Mcjto(T ) → Mcjto(T )
pertenencia : T × Mcjto(T ) → boolean
Axiomas
pertenencia(x, vacio) = false
pertenencia(x, agregar(x, m)) = true
pertenencia(x, agregar(y, m)) = pertenencia(x, m)
..
.
si x 6= y
Fin TAD
Se desea que Ud. complete esta especificación, indicando axiomas que describan el comportamiento
de las operaciones eliminarUna y eliminarTodas.
Considere que ambas operaciones de eliminación son aplicables a cualquier multiconjunto. En caso
de que estas operaciones sean aplicadas a un multiconjunto que no contenga ninguna ocurrencia del
elemento al que se le desea eliminar una ocurrencia o todas las ocurrencias, el resultado será el mismo
multiconjunto original.
Note que, como todo multiconjunto puede ser expresado sólo en términos de vacio y agregar, en
los axiomas de pertenencia bastó describir la interacción entre pertenencia y estas dos operaciones.
Lo mismo bastará para los axiomas restantes requeridos; esto es, bastará describir la interacción de
eliminarUna y eliminarTodas con vacio y agregar.
Pregunta 2 — 28 puntos
Se quiere construir un tipo de datos que permita almacenar información sobre compromisos en un
planificador.
Éste permite planificar actividades para exactamente N días; en el caso más común de un planificador
anual, N sería 365. Cada una de las actividades almacenadas puede ocurrir una o más veces, y
en cada uno de los días contemplados por el planificador pueden estar programadas cero o más
actividades. Llamaremos compromiso a la planificación de una actividad en una fecha determinada.
Cada planificador permite almacenar información de hasta M compromisos.
A continuación presentamos una especificación de un tipo abstracto de datos (TAD) diseñado para
almacenar la información de compromisos programados. En esta especificación, la información sobre
las actividades almacenadas se modela mediante un conjunto de Strings, mientras que la información
sobre las fechas en las que ocurre cada actividad (esto es, compromisos) estará representada mediante
una relación entre actividades y números naturales. Cada una de las fechas del período a planificar
será representada por medio de un número natural, con el natural 0 representando el primer día del
período, y N − 1 representando el último.
Restringiremos nuestra atención sólo a las siguientes operaciones del TAD: (i) agregarCompromiso,
que dadas la actividad y la fecha de un compromiso permite almacenar a éste en el planificador; el
compromiso puede estar ya previamente almacenado, en cuyo caso no hace falta agregar información
nueva al planificador, y si el compromiso es nuevo debe haber espacio disponible para almacenar a
éste; (ii) hayCompromisos, que dada una fecha determina si hay algún compromiso asociado a ésta
almacenado en el planificador; y (iii) eliminarActividad, que dada una actividad permite eliminar
todos los compromisos asociados a ésta que estén almacenados en el planificador, aun cuando no
haya ningún compromiso asociado a la actividad dada, en cuyo caso el planificador no es modificado.
Continúa. . .
Veamos entonces la especificación con modelo abstracto de nuestro TAD:
Especificación A de TAD Planificador
Modelo de Representación
const N, M : int
var act : set(String)
compr : String ↔ int
Invariante de Representación
N >0 ∧ M >0
∧ ( ∀x : x ∈ ran(compr) : 0 6 x < N )
∧ dom(compr) = act
∧ # compr 6 M
Operaciones
..
.
proc agregarCompromiso ( in-out p : Planificador ; in a : String ; in f : int )
{ Pre : 0 6 f < p.N ∧ ((a, f ) 6∈ p.compr ⇒ # p.compr < p.M ) }
{ Post : p.compr = p0 .compr ∪ { (a, f ) } }
proc hayCompromisos ( in p : Planificador ; in f : int ; out h : boolean )
{ Pre : 0 6 f < p.N }
{ Post : h ≡ (f ∈ ran(p.compr)) }
proc eliminarActividad ( in-out p : Planificador ; in a : String )
{ Pre : true }
{ Post : . . . }
..
.
Fin TAD
Continúa. . .
Como primera propuesta de estructura de datos para el TAD Planificador, se sugiere un arreglo
unidimensional de actividades, y un arreglo unidimensional de fechas, en donde la ocurrencia de una
actividad y una fecha en una misma posición indica que la actividad está planificada para esa fecha.
Veamos la nueva especificación del TAD con este modelo concreto propuesto:
Especificación B de TAD Planificador , refinamiento de A
Modelo de Representación
const N, M : int
var actividades : array [ 0..M ) of String
fechas : array [ 0..M ) of int
cant : int
Invariante de Representación
N > 0 ∧ M > 0 ∧ 0 6 cant 6 M
∧ ( ∀i, j : 0 6 i < j < cant
: actividades[i] 6= actividades[j] ∨ fechas[i] 6= fechas[j] )
∧ ( ∀i : 0 6 i < cant : 0 6 fechas[i] < N )
Relación de Acoplamiento
act = { i : 0 6 i < cant : actividades[i] }
∧
compr = { i : 0 6 i < cant : ( actividades[i] , fechas[i] ) }
Operaciones
..
.
proc agregarCompromiso ( in-out p : Planificador ; in a : String ; in f : int )
{ Pre : 0 6 f < p.N ∧ . . . }
{ Post : . . . }
proc hayCompromisos ( in p : Planificador ; in f : int ; out h : boolean )
{ Pre : 0 6 f < p.N }
{ Post : h ≡ ( ∃ i : 0 6 i < p.cant : p.fechas[i] = f ) }
proc eliminarActividad ( in-out p : Planificador ; in a : String )
{ Pre : true }
{ Post : . . . }
..
.
Fin TAD
Continúa. . .
Con toda esta información, responda ahora las siguientes preguntas:
2.0 (6 puntos) Complete la postcondición de la operación eliminarActividad en la especificación
A con modelo abstracto.
2.1 (8 puntos) Demuestre formalmente que las postcondiciones de hayCompromisos en las dos
especificaciones se corresponden adecuadamente, según la noción de refinamiento de datos.
2.2 (7 puntos) En la especificación B con modelo concreto, con una buena implementación para
todas las operaciones, ¿de qué orden de complejidad estima Ud. que será el tiempo de ejecución
de agregarCompromiso y hayCompromisos?
Utilice notación asintótica para la complejidad en términos del tamaño (actual, no máximo)
del planificador, y diferencie peor y mejor caso. Explique brevemente el por qué de su respuesta
según los algoritmos que utilizaría la implementación.
2.3 (7 puntos) Considere una especificación C con modelo concreto, cuyo Modelo de Representación y Relación de Acoplamiento coinciden con los dados en la especificación B, y
cuyo Invariante de Representación incluye adicionalmente una condición sobre el arreglo
fechas que exige que éste esté ordenado. En esta nueva especificación C, con una buena implementación para todas las operaciones, ¿de qué orden de complejidad estima Ud. que será el
tiempo de ejecución de agregarCompromiso y hayCompromisos?
Al igual que antes, utilice notación asintótica para la complejidad en términos del tamaño
(actual, no máximo) del planificador, y diferencie peor y mejor caso. Explique brevemente el
por qué de su respuesta según los algoritmos que utilizaría la implementación.
Descargar