Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Ejercicios Algoritmos Greedy - Examen Final Diseño y Análisis Algoritmos URJC (2014/2015), Exámenes de Ingeniería Infórmatica

Documento que contiene el examen final de la asignatura diseño y análisis de algoritmos de la universidad rey juan carlos (2014/2015). El documento incluye tres ejercicios de algoritmos greedy: uno sobre empaquetar objetos en recipientes, otro sobre distribuir ficheros entre dos cintas magnéticas y otro sobre las cadenas dominó. El documento proporciona información sobre las estrategias greedy aplicables, ejemplos y soluciones.

Tipo: Exámenes

2014/2015

Subido el 30/04/2015

johnny_joel_cancio_sandoval
johnny_joel_cancio_sandoval 🇪🇸

1 documento

1 / 7

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
1
UNIVERSIDAD REY JUAN CARLOS
GRADO EN INGENIERÍA INFORMÁTICA
DISEÑO Y ANÁLISIS DE ALGORITMOS
Curso 2014/2015 – EXAMEN FINAL DE MAYO
NORMAS:
- La duración del examen será de dos horas y media.
- El alumno tendrá 10 minutos para decidir si realiza el examen o no. Si abandona el aula a lo largo de
esos 10 minutos, no deberá entregar nada y obtendrá en actas una calificación de no presentado. Si
permanece en el aula transcurrido ese tiempo, deberá entregar el examen obligatoriamente.
- La solución de cada ejercicio debe entregarse en hojas separadas. Al menos hay que entregar una
hoja por ejercicio, aunque sea en blanco.
- Cada hoja debe contener claramente nombre y apellidos.
Ejercicio 1 (3 puntos)
Se desea resolver los dos problemas siguientes mediante algoritmos voraces. Para cada
uno, se pide formular una estrategia voraz que resuelva el problema de forma razonable
e indicar si el criterio voraz es óptimo. En caso afirmativo, justifíquese informalmente;
en caso negativo, dese un contraejemplo.
a) Sean n objetos de tamaños t1, t2, …, tn tales que 0<ti1 y un suministro infinito de
recipientes de tamaño 1. Se desea empaquetar esos objetos en el menor número de
recipientes.
Por ejemplo, dados 7 objetos de tamaños 0’5, 0’2, 0’4, 0’1, 0’7, 0’8 y 0’3, un
empaquetado óptimo sería:
0’1
0’2
0’7
0’5
0’8
0’4
0’3
b) Se desea distribuir n ficheros de longitudes l1, l2, …, ln entre dos cintas magnéticas,
de forma tal que se minimice la longitud máxima ocupada de ambas cintas. Es decir,
si los conjuntos de ficheros contenidos en las cintas se representan con A y B, se
quiere minimizar
Bi i
Ai ill ,max
Por ejemplo, dados 3 ficheros de longitudes 3, 1, 5, una solución óptima es A={1,3}
y B={5}, de longitud máxima 5.
pf3
pf4
pf5

Vista previa parcial del texto

¡Descarga Ejercicios Algoritmos Greedy - Examen Final Diseño y Análisis Algoritmos URJC (2014/2015) y más Exámenes en PDF de Ingeniería Infórmatica solo en Docsity!

UNIVERSIDAD REY JUAN CARLOS GRADO EN INGENIERÍA INFORMÁTICA DISEÑO Y ANÁLISIS DE ALGORITMOS Curso 20 14 /20 15 – EXAMEN FINAL DE MAYO NORMAS:

  • La duración del examen será de dos horas y media.
  • El alumno tendrá 10 minutos para decidir si realiza el examen o no. Si abandona el aula a lo largo de esos 10 minutos, no deberá entregar nada y obtendrá en actas una calificación de no presentado. Si permanece en el aula transcurrido ese tiempo, deberá entregar el examen obligatoriamente.
  • La solución de cada ejercicio debe entregarse en hojas separadas. Al menos hay que entregar una hoja por ejercicio, aunque sea en blanco.
  • Cada hoja debe contener claramente nombre y apellidos. Ejercicio 1 ( 3 puntos) Se desea resolver los dos problemas siguientes mediante algoritmos voraces. Para cada uno, se pide formular una estrategia voraz que resuelva el problema de forma razonable e indicar si el criterio voraz es óptimo. En caso afirmativo, justifíquese informalmente; en caso negativo, dese un contraejemplo. a) Sean n objetos de tamaños t 1 , t 2 , …, tn tales que 0< ti 1 y un suministro infinito de recipientes de tamaño 1. Se desea empaquetar esos objetos en el menor número de recipientes. Por ejemplo, dados 7 objetos de tamaños 0’5, 0’2, 0’4, 0’1, 0’7, 0’8 y 0’3, un empaquetado óptimo sería: 0 ’ 0’ 0’5 0’ 0’ 0’ 0’ b) Se desea distribuir n ficheros de longitudes l 1 , l 2 , …, ln entre dos cintas magnéticas, de forma tal que se minimice la longitud máxima ocupada de ambas cintas. Es decir, si los conjuntos de ficheros contenidos en las cintas se representan con A y B, se quiere minimizar 

iB i i A max l (^) i , l Por ejemplo, dados 3 ficheros de longitudes 3, 1, 5, una solución óptima es A={1,3} y B={5}, de longitud máxima 5.

Ejercicio 2 (3 puntos) Sean p y q dos puntos del plano real con coordenadas ( p 1 , p 2 ) y ( q 1 , q 2 ), respectivamente. Se dice que el punto p domina al punto q si y sólo si ( p 1 > q 1 ) y ( p 2 > q 2 ). Si p no domina a q ni q domina a p , decimos que p y q son incomparables. Dado un conjunto C de puntos, definimos el rango del punto p como el número total de puntos de C que son dominados por p. Se pide: a) Diseñar un algoritmo de divide y vencerás que, dado un punto p y un conjunto C de puntos, determine el rango de p. Su cabecera será: public static int rango (int, x, int y, int[] xs, int ys[]) donde el punto tiene de coordenadas x e y , y las coordenadas del conjunto de puntos C están contenidas en los vectores xs e ys (correspondientes a ordenadas y abscisas, respectivamente). b) Calcular la complejidad en tiempo del algoritmo desarrollado en el apartado anterior. Ejercicio 3 ( 4 puntos) El dominó se juega con 28 fichas diferentes. Cada ficha es rectangular y tiene grabado en cada extremo un número de puntos comprendido entre 0 y 6. Siguiendo las reglas del juego, las fichas se colocan formando una cadena de tal manera que cada par de fichas adyacentes tienen iguales los números de los extremos que se tocan. Al acabar una cadena de fichas, la primera y la última pueden hacerse adyacentes, es decir, la cadena es circular. La figura muestra un ejemplo de una cadena de dominó (sin acabar). Se desea desarrollar un algoritmo que imprima todas las cadenas circulares correctas de 28 fichas. Obsérvese que, al ser circular, cada cadena puede tomar 28 formas aparentemente distintas, según la ficha que se imprima en primer lugar. Para evitar esto, podemos suponer que todas empiezan por la misma ficha. El algoritmo debe estar basado en la técnica de vuelta atrás y tener la siguiente cabecera: public static void cadenasDomino (int a, int b) donde a y b son los números de la ficha de comienzo. Se pide: a) Diseñar un árbol de búsqueda que permita resolver el problema e identificar las condiciones que deben comprobarse en cada nodo del árbol de búsqueda. b) Codificar un algoritmo de vuelta atrás basado en las decisiones de diseño anteriores. (No es necesario codificar el método de imprimir.)

Sin embargo, la solución óptima reserva dos recipientes: 0’2 0’ 0’2 (^) 0’ 0’6 (^) 0’  Una criterio simétrico (pero peor) es considerar los objetos en orden creciente de tamaño. Tampoco es un criterio óptimo, como puede comprobarse con el ejemplo del enunciado, para el que usaría 4 recipientes. b) Veamos dos posibles funciones de selección:  Se parte de A y B vacíos. Al considerar cada fichero, se asigna a A si los ficheros almacenados en A ocupan menos espacio que los almacenados en B y se asigna a B en caso contrario. La función de selección es razonable ya que se basa en la idea de que, al ir asignando ficheros a la cinta menos ocupada, la longitud ocupada de ambas crece lo menos posible. La función de selección no es óptima, como puede comprobarse con el siguiente contraejemplo. Dados 3 ficheros de longitudes 1, 3, 5, se obtiene {{1,5},{3}}, de longitud máxima 6. Sin embargo, una solución óptima es {{1,3},{5}} de longitud máxima 5.  Ordenar los ficheros en orden creciente de longitud, introducirlos en la primera cinta mientras no se sobrepase la mitad de la suma de las longitudes de los ficheros e introducir el resto en la segunda. La función de selección también es razonable porque pretende acercar la ocupación de la primera cinta (y por tanto de la segunda también) a la media posible de la suma de la longitudes. Sin embargo, la función de selección no es óptima, como puede observarse con el siguiente contraejemplo. Sean 4 ficheros de longitudes 1, 2, 3 y 4; su suma es

  1. Por tanto, el criterio definido hace el reparto {{1,2},{3,4}}, con longitud ocupada máxima igual a 7. Sin embargo, la solución {{1,4},{2,3}} ocupa una longitud máxima de 5.

Ejercicio 2 (4 puntos) a) El algoritmo es sencillo. El caso base corresponde a un conjunto C con un solo punto, en cuyo caso, el rango del punto es 1 o 0 según que le domine o no. El caso recursivo es similar al de otros problemas y corresponde a un conjunto con más de un punto. En este caso, se parte el conjunto en dos conjuntos, se halla recursivamente el rango de cada subconjunto y se suman los rangos calculados. Codificado en Java queda: public static int rango (int x, int y, int[] xs, int ys[]) { return rangoDyV (x, y, xs, ys, 0, xs.length-1); } private static int rangoDyV (int x, int y, int[] xs, int ys[], int inf, int sup) { if (inf==sup) return ((x>xs[inf])&&(y>ys[inf])?1:0); else { int medio = (inf+sup)/2; int r1 = rangoDyV (x, y, xs, ys, inf, medio); int r2 = rangoDyV (x, y, xs, ys, medio+1, sup); return r1+r2; } } b) Podemos utilizar la solución general para sistemas de recurrencia de algoritmos de divide y vencerás. Es fácil ver que tanto el caso base como la partición y la combinación son operaciones con un coste constante, es decir, (1). Por tanto, las ecuaciones de recurrencia para la función de tiempo de este algoritmo quedan: 

T n paran para n T n En consecuencia: a = b =2 a > b k k = Por tanto, la complejidad es: ( ) ( ) ( ) log T n On On b a  

b) El algoritmo en Java queda: public static void cadenasDomino (int a, int b) { boolean[][] libres = new boolean[7][7]; for (int i=0; i<=6; i++) for (int j=0; j<=6; j++) libres[i][j] = true; int[] cadena = new int[28]; cadena[0] = a; cadena[1] = b; libres[a][b] = false; libres[b][a] = false; cadenasDominoBuscar (2, cadena, libres); } private static void cadenasDominoBuscar (int i, int[] cadena, boolean[][] libres) { for (int k=0; k<=6; k++) if (libres[cadena[i-1]][k]) { cadena[i] = k; libres[cadena[i-1]][k] = false; libres[k][cadena[i-1]] = false; if (i==27) { if (libres[cadena[0]][cadena[27]]) imprimir (cadena); } else cadenasDominoBuscar (i+1, cadena, libres); libres[cadena[i-1]][k] = true; libres[k][cadena[i-1]] = true; } }