DELTA – MASTER

Anuncio
DELTA – MASTER
EDI
FORMACIÓN UNIVERSITARIA
C/ Gral. Ampudia, 16
Teléf.: 91 533 38 42 - 91 535 19 32
28003 MADRID
Ejercicio 1 [3.5 puntos] Un hoter ofrece alojamiento a turistas todos los días comprendidos en un
intervalo [a..b] (donde a y b son naturales) cuya longitud b-a+1 se sabe que es par (sin estar excluida
la posibilidad de que sea 0, pero sí de que sea negativa). El precio de una estancia diaria varía cada
día, siendo:
•
•
•
1 euro para los días a y b (comienzo y fin de temporada),
2 euros para los días a+1 y b-1,
2² euros para los días a+2 y b-2,
Y así sucesivamente, es decir, el precio se multiplica por dos a medida que nos acercamos al centro
del intervalo (temporada alta). Se pide:
a) [1 punto] Especificar formalmente una funcion ingresos que calcule los ingresos obtenidos
por el hotel durante una temporada. La función toma un vector v que almacena en cada
posición k el número de huéspedes del día k, y dos naturales a y b indicando al principio y el
final de la temporada.
b) [2.5 puntos] Derivar detalladamente, a partir de la especificación formal del apartado (a), un
algoritmo iterativo para la función ingresos, de coste lineal con respecto al tamaño del vector.
Se ha de demostrar que el coste es, efectivamente, lineal.
SOLUCION
a) ingresos : VEC NAT NAT -> NAT
{a<=b, b-a+1 mod 2 = 0}
fun ingresos (E/S v[1..N] de ent, E a,b:ent) dev c:nat
{c = ∑ i: a<=i<=a+b /2 +1 : v[a]*2i-a }
b) Inicialización : <i,c> := <a,0>
Avanzar: i := i+1
Cota : a+b/2 +1 –i
Invariante siguiente paso: = ∑ i: a<=i+1<=a+b /2 +1 : v[a]*2i+1-a Λ a<= i+1 <= b+a/2+1
Vemos que tras avanzar se sigue cumpliendo el invariante
<i,c> := <a,0> ;
{I ≡c=∑ i: a<=i<=a+b /2 +1 : v[a]*2i-a Λ a<= i <= b+a/2+1}
Mientras i ≠ a+b/2+1 hacer
{I Λ i≠ a+b/2+1}
C:= c + v[a]*2i-a
Fmientras
La complejidad en el tiempo del algoritmo ésta en O(n) ya que la complejidad del cuerpo del
bucle es constante y el número de iteraciones en exactamente N
1
DELTA – MASTER
EDI
FORMACIÓN UNIVERSITARIA
C/ Gral. Ampudia, 16
Teléf.: 91 533 38 42 - 91 535 19 32
28003 MADRID
Ejercicio 2 [2 puntos] Dada la siguiente especificación algebraica:
parametro CLAVE
Usa BOOL .
Tipos Clave .
operaciones
op _<_ : clave clave -> bool .
op equivalente : Clave Clave -> bool .
op canonico : Clave -> Clave .
vars c1 c2 : Clave .
ceq canonico(c1) = caninico(c2) if equivalente(c1,c2) .
fparametro
parametro CONTENIDO
tipos Contenido .
operaciones
op conbinar : Contenido Contenido -> Contenido // asociativa y conmutativa
op codigo : Contenido -> Contenido .
op compresor : Contenido Contenido -> Contenido .
variables
vars y1 y2 : Contenido
ecuaciones
eq combinar(codigo(y1),codigo(y2)) = codigo(combinar(y1,y2)) .
fparametro
especificación EJERCICIO {X :: CLAVE, Y :: CONTENIDO}
tipos TAD{X,Y} .
operaciones
op error : -> [TAD{X,Y}] .
op vacio : -> TAD{X,Y} [constructor] .
op insertar : TAD{X,Y} Clave contenido -> TAD{X,Y} [constructor] .
op eliminar : TAD{X,Y} Clave -> TAD{X,Y} .
op es-vacio? : TAD{X,Y} -> Bool .
op cifrar : TAD{X,Y} Clave ->p TAD{X,Y} .
op comprimir : TAD{X,Y} -> TAD{X,Y} .
variables
var t : TAD{X,Y} .
vars x1 x2 : Clave .
vars y1 y2 : Contenido .
ecuaciones
eq insertar(insertar(t,x1,y1),x2,y2) = insertar(insertar(t,x2,y2),x1,y1) .
eq insertar(t,x1,y1),x1,y2) = insertar(t,x1,convinar(y1,y2)) .
fespecificacion
2
DELTA – MASTER
EDI
FORMACIÓN UNIVERSITARIA
C/ Gral. Ampudia, 16
Teléf.: 91 533 38 42 - 91 535 19 32
28003 MADRID
especificar las operaciones:
a) [1 punto] cifrar: operación parcial que cifra el contenido asociado a una clave dada. La
operación utilizada para cifrar un contenido es codigo. La operación produce error si la clave
dada no se encuentra en el TAD{X,Y}
b) [1 punto]comprimir: operación total que comprime el contenido de un TAD. Para ellos, si dos
claves del TAD son equivalentes, es decir, si la función equivalente aplicada a las claves da
como resultado cierto, aplicar la función compresor a sus contenidos, produciendo una
entrada en el TAD con clave el término canónico obtenido con la operación canonico aplicada
a una de las claves equivalente y contenido el resultado de la función compresor.
SOLUCION
a) eq cifrar(vacio,x1) = error
ceq cifrar (insertar(t,x1,y1),x2) = error if codigo(x2) =/= y1
ceq cifrar((insertar(t,x1,y1),x2) = t if codigo(x2) == y1
b) eq comprimir(vacio) = vacio
eq comprimir (insertar(insertar(t,x1,y1),x2,y2)) = insertar(t,canonico(x1),compresor(y1,y2))
if equivalente(x1,x2)
3
DELTA – MASTER
EDI
FORMACIÓN UNIVERSITARIA
C/ Gral. Ampudia, 16
Teléf.: 91 533 38 42 - 91 535 19 32
28003 MADRID
Ejercicio 3 [2.5 puntos] Se desea diseñar un tipo abstracto de datos para representar la gestión y
ejecución de programas en un sistema operativo.Para cada programa, el sistema guarda la siguiente
información: un identificador nuevo para cada programa con el nombre que va a ser reconocido en el
sistema, un estado en el que se encuentra el programa en cada momento (preparado si está listo para
ser ejecutado, o bien suspendido en caso contrario) y una prioridad (un numero natural) dependiendo
del programa, de forma de que se ejecuten antes en el sistema los más prioritarios (con un mayor
número natural) cuyo estado sea el de preparado. De entre todos los programas preparados que tengan
la misma prioridad, se ejecurará siempre por el orden de llegada al sistema. A continuación se
muestra la especificación algebraica de dicho tipo abstracto de datos en que suponemos que los
programas disponen de una operación de igualdad y otra de orden entre los identificadores:
parametro ESTADO
tipos Estado
operaciones
op preparado : -> Estado
op suspendido : -> Estado
fparametro
parametro ID_PROG
tipo id-prog
operaciones
_<_ : id-prog id-prog -> bool .
fparametros
especificacion SISTEMA-OPERATIVO {X :: Id-PROG , Y :: ESTADO}
usa LISTA_ORD .
tipos SO{X, Y} .
operaciones
op error : -> [Estado] .
op error :-> [SO{X,Y}] .
op vacio : -> SO{X,Y} [constructor] .
op añadir : SO{X,Y} id-prog Nat Estado ->p SO{X,Y} [constructor]
op ejecutar : SO{X,Y} ->p SO{X,Y} .
op consultar : SO{X,Y} id-prog ->p Estado .
op cambiar : SO{X,Y} id-prog -> p SO{X,Y} .
op listar : SO{X,Y} -> ListaOrdenada{X} .
operaciones privadas
op max-pri : SO{X,Y} -> Nat .
variables
var s : SO{X,Y} .
vars x1 x2 : id-prog .
vars n1 n2 : Nat .
vars y1 y2 : Estado .
ecuaciones
eq añadir(añadir(s,x1,n1,y1),x1,n2,y2) = error .
ceq añadir(añadir(s,x1,n1,y1),x2,n2,y2) = añadir(añadir(s,x2,n2,y2),x1,n1,y1) if n1 =/= n2 .
4
DELTA – MASTER
EDI
FORMACIÓN UNIVERSITARIA
C/ Gral. Ampudia, 16
Teléf.: 91 533 38 42 - 91 535 19 32
28003 MADRID
eq max-pri(vacio) = 0 .
ceq max-pri(añadir(s,x1,n1,y1)) n1 if n1 >= max-pri(a) and y1 == preparado .
ceq max-pri(añadir(s,x1,n1,y1)) = max-pri(s)
if n1 <= max-pri(s) or y1 =/= preparado .
eq ejecutar(vacio) = error .
ceq ejecutar(añadir(vacio,x1,n1,y1)) = vacio if y1 == preparado .
ceq ejecutar(añadir(vacio,x1,n1,y1)) = añadir(vacio,x1,n1,y1) if y1 =/= preparado .
ceq ejecutar(añadir(s,x1,n1,y1)) = añadir(ejecutar(s),x1,n1,y1)
if y1 =/= preparado or n1 <= max-pri(s) .
eq consultar(vacio,x1) = error .
eq consultar(añadir(s,x1,n1,y1),x1) = y1 .
ceq consultar(añadir(s,x1,n1,y1),x2) = consultar(s,x2) if x1 =/= x2 .
eq cambiar(vacio,x1) = error .
eq cambiar(añadir(s,x1,n1,preparado),x1) =añadir(s,x1,n1,suspendido) .
eq cambiar(añadir(s,x1,n1,suspendido),x1) = añadir(s,x1,n1,preparado) .
ceq cambiar(añadir(s,x1,n1,y1),x2) = añadir(cambiar(s,x2),x1,n1,y1) if x1 =/= x2 .
eq lista(vacia) = crear .
eq listar(añadir(s,x1,n1,y1)) = insertarOrd(x1,listar(s)) .
fespecificacion
Se pide implementar este tipo abstracto de datos. Para ello, se debe explicar con detalle la
representación elegida, codificar cada una de las operaciones de la especificación y justificar el coste
de cada una de dichas operaciones.
Suponer que las operaciones de consulta realizan una copia de las estructura de datos. Calcular
el coste teniendo en cuenta esta copia. Indicad también cual sería el coste en el caso de que no se
realizara la copia (esto es, las operaciones de consulta compartieran memoria).
Nota: Se puede suponer que el número de programas que pueden tener la misma prioriad es pequeño,
es decir, puede considerarse siempre menor que una constante. Hay que tener en cuenta además que
la información no debe aparecer en la representación elegida más de dos veces. Ninguna operación
debe tener un coste superior a O(log(n)) (sin tener en cuenta el coste de las copias de TADs), siendo n
el número de programas en el sistema, salvo listar, que tendrá complejidad lineal.
5
DELTA – MASTER
EDI
FORMACIÓN UNIVERSITARIA
C/ Gral. Ampudia, 16
Teléf.: 91 533 38 42 - 91 535 19 32
28003 MADRID
SOLUCION
El sistema operativo en un ejemplo de colas de prioridad en la que se introduce los datos en orden de
prioridades colocando los elementos de la misma prioridad ordenados por tiempo de entrada. Existen
múltiples implementaciones para las colas de prioridad, siendo la que se ajusta a las complegidades
pedidas el empleo de los montículos. Tendremos un móticulo para los elementro preparados y otro
para los elementos suspendidos.
Para la resulución este problema suponemos que los móticulos están implementados según los
apuntes de clase. Si no bastaría con incluir dichos métodos en la Solución
Tipos
Programa = reg
E de Estado
Id de ID_PROG
Prior de 0..M
freg
Monticulos = reg
V[1..N] de Programa
Ultimo : 0..N
freg
SisOp = reg
Preparados de Monticulo
Suspendidos de Monticulo
ftipos
proc añadir (SO : SisOp, id: ID_PROG, n: Nat, e: Estado)
si preparado(e) entonces
añadir(SO.Preparados,Programa(id,n,e))
si no
añadir(SO.Suspendidos,Programa(id,n,e))
fsi
fproc
La complegidad en O(n) ya que la insercion en un montículo es O(n)
proc ejecutar (SO :SisOp)
e = programa;
si SO.Preparados.Ultimo = 0 entonces error
si no
e = minimo (SO.preparados);
eliminar-min (SO.preparados);
suspender(e);
añadir (e);
6
DELTA – MASTER
EDI
FORMACIÓN UNIVERSITARIA
C/ Gral. Ampudia, 16
Teléf.: 91 533 38 42 - 91 535 19 32
28003 MADRID
fsi
fproc
La complejidad depende de minimo que sería O(n)
func cosultar (SO :SisOp): e = programa
e = programa;
si SO.Preparados.Ultimo = 0 entonces error
si no
e = minimo (SO.preparados);
fsi
ffunc
La complejidad depende de minimo que sería O(n)
Proc cambiar (SO:SisOp,id : id-prog)
e: programa
e =Sacar(SO.Suspendidos, id)
si no error
preparar (e.estado)
añadir (SO.Preparados, e.id,e.prioridad, e.estado)
si no
e=Sacar(SO.Preparados,id)
suspender (e,estado)
añadir (SO.Suspendidos, e.id,e.prioridad, e.estado)
fsi
pfin
En donde Sacar será una operación parcial de extracción (borrado) en un montículo O(log n) que da
un error si el elemento no existiera.
Func listar(SO: SisOp): ListaOrdenada
Lo: lista Ordenada;
mientras no Vacia(SO.preparados);
Insertar (Lo, minimo (SO.preparados);
fmientras
mientras no Vacia(SO.suspendidos);
Insertar (Lo, minimo (SO.suspendidos);
fmientras
fin listar
Teniendo una complejidad de lineal
TODAS estas complejidades suponen que NO se realizar copias de los Objetos. Si se realizaran las
funciones aunemtarian a O(n) al copiar todas las extructuras
7
Descargar