Solución - Universidad de Oviedo

Anuncio
Licenciatura de Matemáticas
Algorítmica y Lenguajes de Programación
Segundo examen parcial
Universidad de Oviedo
20/06/2001
Apellidos:
Nombre:
D.N.I:
Notas:
1.
2.
3.
1.
Todos los ejercicios se resolverán empleando la notación algorítmica explicada en clase.
Implementar únicamente aquello que se pide en cada caso (una función, una acción o un programa).
Los ejercicios puntuarán de la siguiente forma:
•
Ejercicios 1, 2 y 5: 1,5 puntos.
•
Ejercicio 3 y 4: 2,75 puntos.
El algoritmo de Euclides permite calcular el máximo común divisor de dos números de forma rápida; dicho algoritmo
se basa en la siguiente propiedad:
Si A y B son enteros entonces MCD (A, B) = MCD (A-B, B)
Escribir una función recursiva que calcule el máximo común divisor de dos números basándose en dicha propiedad.
Posible solución:
funcion mcd (a,b ∈ entero) dev (c ∈ entero)
inicio
si a=b entonces
c ß a
si no
si a>b entonces
c ß mcd(a-b, b)
si no
c ß mcd (b-a, a)
fsi
fsi
fin
2.
Escribir una acción recursiva que lea números enteros por teclado (un número por línea) hasta que se teclee un –1 y
que escriba la secuencia de números introducida de forma inversa.
accion leeInvierte ()
variables
n ∈ entero
inicio
leer n
si n≠
≠ -1 entonces
leer()
fsi
escribir n !Repite el -1
fin
Posible solución (II):
accion leeInvierte ()
variables
n ∈ entero
inicio
leer n
si n≠
≠ -1 entonces
leer()
escribir n !No repite el -1
fsi
fin
3.
Dada la siguiente estructura de datos:
estructura Complejo
r ∈ real
i ∈ real
acción construye (x,y ∈ real) dev (a ∈ Complejo)
inicio
a.r ß x
a.i ß y
fin
acción escribir ()
inicio
si a.i ≠ 0 entonces
escribir a.r, ‘+’, a.i, ‘i’
si no
escribir a.r
fsi
fin
festructura
Escribir una acción que utilice dicha estructura e imprima las soluciones de ax2 + bx + c = 0 sean reales o complejas.
Posible solución:
accion segundoGrado (a,b,c ∈ real)
variables
s1,s2 ∈ Complejo
discr ∈ real
inicio
discr ß b2-4ac
si discr=0 entonces
s1.construye(-b/(2a),0)
s2.construye(-b/(2a),0)
si no
si discr>0 entonces
s1.construye((-b + √discr)/(2a),0)
s2.construye((-b - √discr)/(2a),0)
si no
s1.construye(-b/(2a),√|discr|/(2a))
s2.construye(-b/(2a),-√|discr|/(2a))
fsi
fsi
escribir ‘Las soluciones de la ecuación son:’
s1.escribir()
s2.escribir()
fin
4.
Completar las acciones que se indican en la siguiente estructura para que se comporte como una cola ordenada de
forma ascendente.
estructura Lista
dato ∈ entero
sig ∈ ↑Lista
acción inicia (x ∈ entero) dev (a ∈ Lista)
inicio
a.dato ß x
a.sig ß NIL
fin
acción insertar (x ∈ entero)
inicio
! COMPLETAR ESTA ACCIÓN
fin
función buscar (x ∈ entero) dev (a ∈ booleano)
inicio
! COMPLETAR ESTA ACCIÓN
fin
festructura
Posible solución:
accion insertar (x ∈ entero)
variables
nuevo ∈ Lista
temp ∈ entero
inicio
si x<dato entonces
nuevo.inicia(x)
nuevo.sig ß sig
sig ß ↑nuevo
temp ß dato
dato ß nuevo.dato
nuevo.dato ß temp
si no
si sig=NIL entonces
nuevo.inicia(x)
sig ß ↑nuevo
si no
sig.insertar(x)
fsi
fsi
fin
funcion buscar (x ∈ entero) dev (a ∈ booleano)
inicio
si dato=x entonces
a ß verdadero
si no
si sig=NIL entonces
a ß falso
si no
a ß sig.buscar(x)
fsi
fsi
fin
5.
Escribir una acción que ordene un vector de 100 números enteros y calcular su complejidad.
Se implementa el método de la burbuja:
∈ vector[100] de entero)
variables
i,j ∈ entero
temp ∈ entero
inicio
para i de 2 a 100 hacer
para j de 100 a 1 hacia atrás hacer
si v[j-1] > v[j] entonces
temp ß v[j-1]
v[j-1] ß v[j]
v[j] ß temp
fsi
fpara
fpara
fin
La complejidad del algoritmo anterior sería O(1), constante, puesto que siempre se tarda lo mismo en ordenar 100
elementos, si en lugar de 100 elementos el vector pudiera tener diferente longitud, n, la complejidad sería
diferente:
para i de 2 a n hacer
para j de n a 1 hacia atrás hacer
si v[j-1] > v[j] entonces
temp ß v[j-1]
v[j-1] ß v[j]
v[j] ß temp
fsi
fpara
fpara
El orden de complejidad de cada sentencia es O(1), constante,
al ser una secuencia se debe coger la dominante de las tres, al
ser las tres O(1) la complejidad de esta parte del algoritmo es
O(1).
para i de 2 a n hacer
para j de n a 1 hacia atrás hacer
si v[j-1] > v[j] entonces
O(1)
fsi
fpara
fpara
para i de 2 a n hacer
para j de n a 1 hacia atrás hacer
O(1)
fpara
fpara
para i de 2 a n hacer
O(n)
fpara
El orden de complejidad de una estructura si-entonces-sino es
la dominante entre la complejidad de la condición y la de las
sentencias a ejecutar; esta condición tiene un tiempo de
ejecución constante, por tanto, complejidad O(1), la dominante
entre O(1) y O(1) es O(1).
La complejidad de un bucle es O(n·s) donde n es el número de
ejecuciones y s es la complejidad de las sentencias del interior
del bucle, en este caso el número de ejecuciones es n, con lo
que la complejidad de este bucle es O(n·1), es decir, O(n).
La complejidad de un bucle es O(n·s) donde n es el número de
ejecuciones y s es la complejidad de las sentencias del interior
del bucle, en este caso el número de ejecuciones es n-1, con lo
que la complejidad de este bucle es O((n-1)·n), es decir, O(n 2n). Aplicando la regla que dice que O(a+b) es la dominante
entre O(a) y O(b) y sabiendo que O(n2) domina a O(n) entonces
la complejidad final del algoritmo es O(n2).
Conclusión: El algoritmo tiene un orden de complejidad O(n2)
Descargar