programacionIII



Comments



Description

EXÁMENES RESUELTOS PROGRAMACIÓN IIIRecopilación de Exámenes de Programación III Esta recopilación de exámenes incluye desde el año 1996 hasta septiembre de 2008. Llevo unos dos años haciéndola y no hubiera sido posible sin la inestimable ayuda de Ali, por ello creí conveniente nombrarla ya que ha sido de gran ayuda en la resolución de problemas y dudas que han hecho posible esta colección de exámenes. Antonio Rivero Cuesta Alicia Sánchez Ferro Palma de Mallorca, septiembre de 2008 Problemas de Programación III Febrero 1996-1..................Calcular T ( n) = 2n ................................... Divide y Vencerás Febrero 1996-1..................Calcular recubrimiento de vértices................ Voraz Febrero 1996-2..................Dominó ......................................................... Vuelta Atrás Febrero 1996-2..................Fibonacci....................................................... Divide y Vencerás Septiem 1996 ....................Cartógrafo ..................................................... Voraz Septiem 1996 ....................Calcular 2 = d(d(m(d(7)))) ............................ Vuelta Atrás Septiem 1996-R ................f x c Alumnos ................................................ Divide y Vencerás Septiem 1996-R ................Seleccionar carreteras ................................... Voraz Febrero 1997-1..................n Cintas n Registros ...................................... Voraz Febrero 1997-1..................El 31.............................................................. Vuelta Atrás Febrero 1997-2..................Grabar n Canciones....................................... Voraz Septiem 1997 ....................n Motos n Clientes ........................................ Ramificación y Poda Septiem 1997 ....................Tablero .......................................................... Vuelta Atrás Febrero 1998-1..................El Continental. .............................................. Vuelta Atrás Febrero 1998-1..................Metro Japón. ................................................. Voraz Febrero 1998-2..................Línea Horizonte ............................................ Voraz Febrero 1998-2..................Mecano 8 piezas............................................ Ramificación y Poda Septiem 1998 ....................n rectángulos ................................................. Voraz Septiem 1998 ....................Cadena euleriana ........................................... Voraz Febrero 1999-1..................Nave Mir. ...................................................... Ramificación y Poda Febrero 1999-1..................Colorear 3 colores. ........................................ Vuelta Atrás Febrero 1999-2..................Mínimo Colores ............................................ Vuelta Atrás Febrero 1999-2..................Liga n equipos............................................... Divide y Vencerás Febrero 2000-1..................Tablero Genérico........................................... Vuelta Atrás Febrero 2000-2..................Base Aerea .................................................... Ramificación y Poda Septiem 2000 ....................Mayoritario ................................................... Divide y Vencerás Febrero 2001-1..................Río Guadalhorce ........................................... Vuelta Atrás, Ramificación y Poda Febrero 2001-2..................Torneo n participantes................................... Divide y Vencerás Septiem 2001 ....................Tablero .......................................................... Vuelta Atrás, Ramificación y Poda Febrero 2002-1..................Caja de Bombones ........................................ Divide y Vencerás Febrero 2002-2..................8 casillas........................................................ Vuelta Atrás Septiem 2002 ....................Laberinto ....................................................... Ramificación y Poda Septiem 2002-R ................Buscaminas ................................................... Divide y Vencerás Diciem 2002.....................Multiplicación de polinomios ....................... Vuelta Atrás Febrero 2003-1..................Laberinto ....................................................... Vuelta Atrás Febrero 2003-2..................Fibonacci....................................................... Divide y Vencerás Septiem 2003 ....................Operadora Teleco.......................................... Voraz Septiem 2003-R ................Daniel Tesoros .............................................. Ramificación y Poda Diciem 2003.....................Taller Sleepy ................................................. Voraz Febrero 2004-1..................Matriz de 3 colores........................................ Vuelta Atrás Febrero 2004-2..................Grafo dirigido................................................ Recorrido profundidad Septiem 2004 ....................Vectores texto ............................................... Ramificación y Poda Septiem 2004-R ................n Agentes n Tareas........................................ Ramificación y Poda Febrero 2005-1..................Conjunto operaciones.................................... Vuelta Atrás Febrero 2005-2..................Estructura Montículo..................................... Divide y Vencerás Septiem 2005 ....................Votación Elecciones...................................... Divide y Vencerás Septiem 2005-R ................Sudoku .......................................................... Vuelta Atrás Febrero 2006-1..................n montadores................................................. Ramificación y Poda Febrero 2006-2..................Dos socios ..................................................... Vuelta Atrás Septiem 2006 ....................Salto caballo.................................................. Vuelta Atrás Septiem 2006-R ................Repartidor de Pizzas...................................... Voraz Diciem 2006......................Grabación Cd ................................................ Ramificación y Poda Febrero 2007-1..................Taller Sleepy ................................................. Voraz Febrero 2007-2..................Suma exacta C............................................... Vuelta Atrás Septiem 2007 ....................n objetos volumen ......................................... Ramificación y Poda Septiem 2007-R ................Parejas estables ............................................. Vuelta Atrás Febrero 2008-1..................n Huertas ....................................................... Ramificación y Poda Febrero 2008-2..................n Agentes n Tareas........................................ Ramificación y Poda Septiem 2008 ....................n Agentes n Tareas........................................ Ramificación y Poda Septiem 2008-R ................n Agentes n Tareas........................................ Ramificación y Poda 2 Escuela Universitaria de Informatica de la UNED Ingenier a Tecnica de Sistemas e Ingenier a Tecnica de Gestion Programacion III - Convocatoria de Febrero Examen primera semana - Curso 1995-96 Problema 1 (5 puntos). El tiempo de ejecucion de un algoritmo viene dado por T (n) = 2n2 . Encontrar una forma e ciente de calcular T (n), suponiendo que el coste de multiplicar dos enteros es proporcional a su tama~o en representacion n binaria. Problema 2 (5 puntos). Un recubrimiento de vertices de un grafo no dirigido G = hV Ai es un conjunto de vertices tales que cada arista del grafo incide en, al menos, un vertice de V. Dise~ar un algoritmo que, dado un grafo no dirigido, n calcule un recubrimiento de vertices de tama~o m nimo para un grafo dado. n La resolucion de cada problema debe incluir: Eleccion razonada del esquema algor tmico. Descripcion del esquema usado e identi cacion con el problema. Estructuras de datos. Algoritmo completo a partir del re namiento del esquema general. Estudio del coste. Segun el esquema elegido hay que especi car, ademas: Voraz: demostracion de optimalidad. Divide y venceras: preorden bien fundado. Vuelta atras: descripcion del arbol de busqueda asociado. . . . . . Un recubrimiento R de vértices de un grafo no dirigido G = +N. 2. pues no hay forma obvia de dividir el problema en subproblemas idénticos cuyas soluciones puedan combinarse en una solución global. sino que éste ha de ser de tamaño mínimo. Hay que seguir los siguientes pasos: 1. es un conjunto de vértices tales que cada arista del grafo incide en. dado un grafo no dirigido.RESPUESTAS EXAMEN Programación III. Solución: Elección razonada del esquema El esquema voraz se adapta perfectamente al problema. La forma más “intuitiva” de garantizar que el recubrimiento sea mínimo es tomar vértices de los que salgan muchas aristas. La función de selección debe escoger el candidato con más vértices de los que aun están en el conjunto de candidatos. Elegir el vértice de mayor grado. esto es.A. Esta notación algorítmica puede escribirse así (libro de Brassard página 214): fun voraz (C: conjunto) dev (S: conjunto) S ← ∅ mientras ¬ solucion (S) ∧ C ≠ ∅ hacer x ← elemento que maximiza objetivo (x) C ←C \ {x} si completable (S ∪ {x}) entonces S ← S ∪ {x} fsi dev S ffun donde: C: Conjunto de vértices del grafo. • De entre un conjunto de vértices (candidatos) hay que seleccionar un subconjunto que será la solución. El esquema de vuelta atrás es un esquema muy general y casi siempre muy costoso que no debemos usar si podemos dar un algoritmo voraz que resuelva el problema. . Se caracterizan porque nunca se deshace una decisión ya tomada: los candidatos desechados no vuelven a ser considerados y los incorporados a la solución permanecen en ella hasta al final del algoritmo. Recorrer su lista asociada (aquellos vértices con los que está conectado) y restar 1 al grado de cada uno de ellos en el campo correspondiente en el vector de vértices. Para ello. al menos. Es crucial determinar la función de selección adecuada que nos asegure que la solución obtenida es óptima. calcule un recubrimiento de vértices de tamaño mínimo. Esquema general e identificación con el problema El esquema voraz se aplica a problema de optimización. Consiste en ir seleccionando elementos de un conjunto de candidatos que se van incorporando a la solución. Solo hay que encontrar la función de selección adecuada (si existe) para resolver el problema mediante un algoritmo voraz. Febrero 1996 (Primera Semana) Problema 2 (5 puntos). ya que: • Se trata de un problema de optimización: No solo hay que encontrar un recubrimiento. cada vez que seleccionemos un vértice tendremos que disminuir en uno el grado de cada uno de los vértices candidatos con el. elegir vértices con mayor grado. S: Recubrimiento del grafo. Diseñar un algoritmo que. un vértice de R. El esquema de divide y vencerás es descartable. un sencillo contraejemplo nos puede hacer ver más claramente lo dificultoso. a veces.De esta forma. que será el siguiente: Este problemas es un ejemplo de que los algoritmos voraces. un recubrimiento. objetivo(x): Grado del vértice. por tanto. solución(S): Todas las aristas del grafo tocan al menos un vértice de S.. cuando el grado de todos los candidatos sea cero todas las aristas del grafo tocan al conjunto de selección y será. factible(S) (o completable): Siempre es cierto. las funciones del esquema principal tendrán el siguiente significado: 1. del estudio de algoritmia. a veces una heurística que “no puede fallar”.N] de vértice vertice = tupla indice: entero // Posición en el vector grado: entero // Grado del vértice adyacentes: apuntador a nodo_adyacente nodo_adyacente = tupla adyacente: entero siguiente: apuntador a nodo_adyacente Algoritmo completo a partir del refinamiento del esquema Adaptamos el algoritmo general a lo dicho anteriormente: fun recubrimiento-minimo (G: grafo) dev (S: conjunto de vértices) S ← ∅ mientras ¬ solucion (S) ∧ C ≠ ∅ hacer x ← elemento que maximiza objetivo (x) C ←C \ {x} disminuir-grado (x. Según este criterio. aunque si una buena aproximación a la misma. 2. Como los costes no juegan ningún papel en el algoritmo. Para representar el grafo podemos utilizar cualquiera de las dos formas habituales. Estructuras de datos En el problema intervienen grafos. Se deja al lector que busque dicho contraejemplo para este caso. vértices de un grafo y conjunto de vértices. teniendo asociado cada vértice una lista enlazada con los vértices adyacentes a éste. ya que se selecciona cada vez un único vértice correcto. en determinadas ocasiones. Aunque la intuición nos indique. teniendo en cuenta que el uso de la matriz de adyacencia hará menos eficiente el algoritmo. Aquí representar el grafo como un vector de vértices. Ocurre también en el ejemplo que se cita en el capítulo de metodología del texto con el algoritmo de devolución de monedas en el sistema británico antiguo. lo excluiremos (por comodidad) de la estructura de datos. 3.C) dev S ffun Las funciones son las siguientes: Solución: El conjunto S será una solución cuando el grado de todos los elementos que restan en C será cero. En estos problemas añadimos la demostración de optimalidad. no proporcionan la solución óptima. Será en pseudocódigo así: . grafo = vértice [1. ya que dentro del bucle “para” hay un bucle “si” que no comprendo muy bien que hace. por lo que calculamos la variable b (que es un booleano) para averiguar si es solución o no. De modo que el coste del bucle es Ο(n) y el coste del algoritmo es Ο(n2) . debido a que no es “entendible”. que tiene un coste lineal y disminuir en uno el grado de los demás. en el peor de los casos. Cabe destacar que la solución no es mía personal.1 fpara ffun Análisis del coste El tamaño del problema viene dado por el número de vértices del grafo. que tiene también coste lineal. C) para w ∈ C en sucesores (v) hacer w.grado . es una de ellas. las soluciones aportadas en estos ejercicios hay algunas que no cuadran. Dentro del bucle se realizan dos operaciones: encontrar el vértice de mayor grado.fun solución (C: Conjunto de vértices) dev (b:booleano) b ← cierto para c en C hacer si G[i].grado ← w. etc etc. la función disminuir-grado resta 1 al grado de todos los elementos conectados con el vértice elegido: fun disminuir_grado(v: vértice. n. la aporto otro compañero en los cursos virtuales. por ello gracias .grado ffun Por último. El número de veces que se ejecuta el bucle voraz es. debido a sintaxis.grado =0) fpara dev b ffun Tal como comentábamos anteriormente. En este caso.) La función de selección devuelve el grado del vértice en consideración: fun seleccionar (v: vertice) dev (g:entero) dev vertice.grado ≠ 0 hacer b ← (G[i]. . Segun el esquema elegido hay que especi car. . a continuacion de la cha (1 2) puede colocarse la (2 4). Una cha de domino puede colocarse a continuacion de la anterior si coinciden los valores de los extremos que se tocan.1 se pide dise~ar un algoritmo que calcule en tiempo logar tmico el termino .Curso 1995-96 Problema 1 (5 puntos). ademas: Voraz: demostracion de optimalidad. i j cfn fn Sugerencia: Utilizad la siguiente relacion: 0 10 0 1 0 B 0 0 1 CB @ A@ a b c . Las 28 chas de domino son de la forma (i j ) con = 1 : : : 6.2 + n . Descripcion del esquema usado e identi cacion con el problema. Divide y venceras: preorden bien fundado. Por ejemplo.1 fn 1 0 C=B A @ . Estudio del coste.Convocatoria de Febrero Examen segunda semana . Problema 2 (5 puntos).Escuela Universitaria de Informatica de la UNED Ingenier a Tecnica de Sistemas e Ingenier a Tecnica de Gestion Programacion III . Algoritmo completo a partir del re namiento del esquema general.3 + bfn.1 fn fn 1 C A La resolucion de cada problema debe incluir: Eleccion razonada del esquema algor tmico.2 fn.3 fn.2 fn. Dada la sucesion de nida como fn = afn. Dise~ar un algoritmo que produzca n todas las cadenas permisibles que contengan todas las chas del domino. Estructuras de datos. Vuelta atras: descripcion del arbol de busqueda asociado. . ademas: Voraz: demostracion de optimalidad.Escuela Universitaria de Informatica de la UNED Ingenier a Tecnica de Sistemas e Ingenier a Tecnica de Gestion Programacion III . Dise~ar un algoritmo que. se puede pasar de 7 a 2 mediante 2 = d(d(m(d(7)))) La resolucion de cada problema debe incluir. 5. Un cartografo acaba de terminar el plano de su pais. que incluye informacion sobre las carreteras que unen las principales ciudades y sus longitudes. Eleccion razonada del esquema algor tmico. por este orden: 1.Convocatoria de Septiembre 96 Examen Original Problema 1 (5 puntos). Ahora quiere a~adir una tabla en la que se recoja la distancia n entre cada par de ciudades del mapa (entendiendo por distancia la longitud del camino mas corto entre las dos). 2. Por ejemplo. Estructuras de datos. . dados dos n numeros a y b. Divide y venceras: preorden bien fundado. Algoritmo completo a partir del re namiento del esquema general. Estudio del coste. Descripcion del esquema usado e identi cacion con el problema. encuentre una forma de llegar de a a b mediante aplicaciones sucesivas de m y d. Vuelta atras: descripcion del arbol de busqueda asociado. 4. 3. Escribir un algoritmo que le permita realizar esa tabla. Se consideran las funciones m(x) = 3x y d(x) = x 2 (donde ` ' representa la division entera). Segun el esquema elegido hay que especi car. Problema 2 (5 puntos). . Cuidado: no hay que confundir este problema (llamado \de caminos m nimos) con el problema de dar un arbol de expansion m nimo. las carreteras las aristas del grafo. Eleccion razonada del esquema algor tmico. pues. Pensad contrajemplos en caso de duda. Para hallar la distancia m nima desde un vertice de un grafo a cada uno de los demas vertices contamos con el algoritmo voraz de Dijkstra. que resuelven algoritmos como el de Prim o Kruskal. Ahora quiere a~adir una tabla en la que se recoja la distancia entre cada par de ciudades del n mapa (entendiendo por distancia la longitud del camino mas corto entre las dos). un arbol de expansion m nimo ser a un subconjunto de carreteras que conectara todas las ciudades y cuya longitud total fuera m nima pero esa condicion no nos asegura que la distancia entre cada par de ciudades sea la m nima posible. que incluye informacion sobre las carreteras que unen las principales ciudades y sus longitudes. En este caso. Escribir un algoritmo que le permita realizar esa tabla.Escuela Universitaria de Informatica de la UNED Ingenier a Tecnica de Sistemas e Ingenier a Tecnica de Gestion Soluciones a los examenes de Septiembre 1996 Equipo docente de la asignatura Programacion III Problema 1 Un cartografo acaba de terminar el plano de su pais. con aplicarlo para cada una de las ciudades. siendo estas los vertices. Basta. 1 . y sus longitudes los pesos de las aristas. Podemos implementarlo como una matriz de adyacencia. N] para cada vertice v hacer m dijkstra(g. pag. que podeis encontrar en el Brassard/Bratley. El coste del algoritmo depende de la implementacion para grafos que se escoja. Estructuras de datos. Como hemos de aplicarlo n veces (o n .m) que devuelve la matriz m con la informacion a~adida correspondiente a las distancias entre el n grafo v y todos los demas grafos de g. N. . N. La unica variacion respecto al algoritmo de Dijkstra es que necesitamos saber la distancia m nima entre cada par de ciudades. no es necesario aplicarlo sobre la ultima ciudad. . como una lista de listas de adyacencia. . vector 1. es necesario aplicar Dijkstra n veces.m) m fun mapa (g:grafo) dev vector 1. Algoritmo completo a partir del re namiento del esquema general. siendo n el numero de ciudades (en rigor. etc. 89. el coste del algoritmo completo es O(n3 ). N] de entero fpara dev m fun donde el algoritmo de dijkstra se implementa mediante una funcion dijkstra(g. Estudio del coste. . . .Descripcion del esquema usado e identi cacion con el problema. El conjunto de ciudades y carreteras viene representado por un grafo no orientado con pesos. 1. sabemos que el coste del algoritmo de Dijkstra es cuadratico (O(n2 )). Nos ahorramos la explicacion. 2 .v. Ademas necesitaremos otra matriz que acumule las distancias m nimas entre ciudades y que sirva como resultado. no solo entre una ciudad y todas las demas.v. . que tambien es de orden n).1. Si se implementa como una matriz de adyacencia. pues los caminos m nimos a esa ciudad ya han sido obtenidos en aplicaciones anteriores. . Por ello.1. dentro de cada columna. Este algoritmo debe sacar partido de la colocacion anterior. dados dos numeros a y b. Por ejemplo. Eleccion razonada del esquema algor tmico. es necesario que. encuentre n una forma de llegar de a a b mediante aplicaciones sucesivas de m(x) y d(x).Problema 2 Se consideran las funciones m(x) = 3x y d(x) = x 2 (donde ` ' representa la division entera). al mirar hacia n la pizarra. b) A mitad de curso se coloca una pizarra adicional en una de las paredes adyacentes con la primera pizarra. Dise~ar un algoritmo que coloque a los alumnos de forma n que puedan mirar tambien a esa segunda pizarra sin estorbarse. a) Dise~ar un algoritmo que reparta los f c alumnos de forma que. Delante de la primera la se encuentra la pizarra. no ofrecemos todav a la solucion. se puede pasar de 7 a 2 mediante 2 = d(d(m(d(7)))) Como este problema esta en relacion muy estrecha con la practica del curso 96-97. Para que nadie tenga un alumno mas alto que el al mirar a la pizarra. Dise~ar un algoritmo que. Problema 3 En una clase hay f las y c columnas de pupitres. los alumnos esten ordenados segun su altura de mayor a menor. ninguno se vea estorbado por otro alumno mas alto que el. 3 . se vuelven a descomponer. para obtener la disposicion nal de los alumnos en el apartado b) debe hacerse una ordenacion de f c elementos. caso en el que la ordenacion es trivial y consiste simplemente en n devolver el elemento. esta vez. Las soluciones a estos subproblemas se combinan a continuacion para dar la solucion al problema. y a continuacion debe ordenarse cada uno de esos subconjuntos. ordenados entre s . por ser mas e ciente asintoticamente en el caso peor (es O(n log n)). Para que esten ordenadas las columnas y las las. Cada uno de ellos sera una columna en la clase. Pero si aprovechamos la disposicion anterior no es necesario. 4 . y el mas alto en el vertice opuesto de la clase. Si su tama~o es n mayor. la ordenacion nal puede obtenerse en tiempo lineal. El esquema divide y venceras es una tecnica recursiva que consiste en dividir un problema en varios subproblemas del mismo tipo. Descripcion del esquema usado e identi cacion con el problema. a su vez. los alumnos de cada la deben estar. Como algoritmo de ordenacion puede escogerse cualquiera de los estudiados nosotros utilizaremos el algoritmo divide y venceras de fusion.Para resolver el apartado a) de forma e ciente basta con dividir los f c alumnos en c subconjuntos de f elementos escogidos al azar. se resuelven mediante un algoritmo espec co. Al colocar una segunda pizarra adyacente a la primera. As . Podemos tomar n como tama~o umbral n=1. Por lo tanto. y colocarlos en la clase de forma que el mas bajito ocupe el pupitre que esta en la interseccion de las dos pizarras. El esquema es el siguiente: fun divide y venceras (problema) si su cientemente-simple (problema) entonces dev solucion-simple (problema) si no hacer fp fsi un : : : pk g descomposicion(problema) para cada si hacer si divide y venceras(pi) fpara dev combinacion(s1 : : : sk ) 1 Tama~o umbral y solucion simple: El preorden bien fundado para los problemas se deriva n directamente del orden total entre el tama~o de los subconjuntos problema. Cuando los subproblemas son mas peque~os n que un umbral pre jado. es necesario ordenar a todos los alumnos de menor a mayor. aplicar ningun algoritmo de ordenacion: basta con realizar una fusion de los c subconjuntos ya ordenados (equivaldr a al ultimo paso de un algoritmo de ordenacion por fusion en el que el factor de division fuera c). j: entero ) dev vector 1. n sabiendo que cada f elementos representan una columna.i. f. mediante un bucle que toma cada vez el menor elemento de entre los primeros de uno y otro subconjunto todav a sin seleccionar. es decir.1.. Estructuras de datos. f. . .1.i.. . . c] de enteros para i=1 hasta c hacer fpara dev clase un clase 1 : : : f i] ordenacion(clase 1 : : : f i]) La funcion de ordenacion equivale a la funcion general divide y venceras. Tambien podemos utilizar un vector de tama~o c f . .2) fsi fproc 5 .k+1. Algoritmo completo a partir del re namiento del esquema general. . . Combinacion: Es necesario fundir los dos subconjuntos ordenados. n] i.j) fusion (v.Descomposicion: Dividiremos el conjunto problema en dos subbconjuntos formados por los n 2 primeros elementos por un lado y el resto por otro. La funcion a es la siguiente: fun a (clase: vector 1.. . . .. que modi caremos ligeramente para incluir como argumento vectores que sean siempre del mismo tama~o: n proc ordenacion (v: vector 1.k) ordenacion (v. c] de enteros) dev vector 1. . Llamaremos a a la funcion que obtiene la ordenacion requerida en el apartado a). y b a la que soluciona el apartado b).j. . La unica estructura de datos que necesitamos es una matriz de enteros de tama~o c f que n almacene las alturas de los alumnos. obtiene una ordenacion total a partir de la que se tiene en a). n] si i = j entonces dev v si no hacer k (i + j 2) ordenacion (v. 1 hacer ix ix + 1 v ix para h=inicio hasta nal hacer si no hacer fsi fpara v' I Infi g x fproc La funcion b debe conseguir una ordenacion completa del conjunto de alumnos. . y a continuacion lo borra para que no vuelva a ser considerado g k 1 proc fusion (v: vector 1. n] inicio.La funcion de fusion tiene cuatro parametros: el vector. entero: c) dev vector 1. pero debe tener en cuenta que ya existe una ordenacion parcial entre ellos: los alumnos de cada columna estan ordenados entre s . los f siguientes a la segunda. el problema queda solucionado llamando a la funcion de fusion de nida anteriormente. c*f] fproc 6 . Para el apartado a) podr amos ahorrarnos este ultimo argumento (es 2). . . . pero esa generalizacion nos permitira usar la misma funcion en el apartado b). pero utilizando un factor de division c en lugar de 2: fusion (v. . . . Si representamos el conjunto de los alumnos como un vector de c f elementos. 1) fpara I f i ::: i g f Selecciona el menor elemento de entre los principios de vector para incluirlo en la solucion.factor: entero ) dev vector 1. . n] factor elemento que maximiza v ix] v' h] v ix] si ix < inicio + factor x . n] f Inicializa punteros al comienzo de los vectores por fusionar g para k = 1 hasta factor hacer i inicio + factor (k .c) proc b (v: vector 1.c*f. f Inicializa el vector solucion g v' vector 1. etc. y el factor de division empleado. c*f]. nal. el principio y nal del tramo que contiene a los dos subvectores que hay que fusionar.1. . . en el que los f primeros elementos corresponden a la primera columna. apartado b T (n) = 2T (n=2) + cte n Se resuelve mediante una llamada al algoritmo de fusion. Mediante una ordenacion total habr amos resuelto n tambien el problema. De esa igualdad se obtiene un coste O(n log n. 7 . En efecto. el coste es O(c f ). un arbol de expansion m nimo es un conjunto de aristas que conectan todos los vertices del grafo en el que la suma de los pesos es m nima (por tanto. apartado a La ordenacion por fusion tiene un coste que cumple: ya que el algoritmo de fusion tiene un coste O(n) (consta de dos bucles consecutivos). El coste es mucho menor que en el caso n en que no aprovecharamos la ordenacion parcial que se obtiene en el apartado a. de entre todas las carreteras posibles. Encontrar un algoritmo que permita seleccionar. Eleccion razonada del esquema algor tmico. que tiene un coste lineal como el tama~o del problema es c f . el problema no es otro que el de hallar un arbol de expansion m nimo para ese grafo. el coste de construir el subconjunto de carreteras es m nimo). el coste total es O(cf log f ). Si interpretamos los datos como un grafo en el que los pueblos son los vertices y las carreteras son aristas cuyos pesos son el coste de construccion.Estudio del coste. un subconjunto que conecte todos los pueblos de la region con un coste global m nimo. pero con un coste O(cf log cf ) (ya que el tama~o del problema ser a c f ). Se dispone de un estudio que enumera todas las posibles carreteras que podr an construirse y cual ser a el coste de construir cada una de ellas. Problema 4 Se planea conectar entre s todos los pueblos de una cierta region mediante carreteras que sustituyan los antiguos caminos vecinales. Como se realizan c ordenaciones de f elementos cada una. <Cuidado! No debe confundirse este problema con el de encontrar los caminos m nimos entre un vertice y el resto. Podeis encontrarla en la pagina 83 del Brassard/Bratley. Nos ahorramos la descripcion del resto del problema. 8 . Ver problema 1 Descripcion del esquema usado e identi cacion con el problema.Para resolverlo podemos usar cualquiera de los dos algoritmos voraces estudiados que resuelven este problema: el de Kruskal o el de Prim. La resolucion de cada problema debe incluir. descripcion del arbol de busqueda asociado. Problema 2 (5 puntos). preorden bien fundado. 5. Dise~ar un algoritmo que coloque a los alumnos n de forma que puedan mirar tambien a esa segunda pizarra sin estorbarse. al mirar n hacia la pizarra. Delante de la primera la se encuentra la pizarra. a) Dise~ar un algoritmo que reparta los f c alumnos de forma que. 2. Encontrar un algoritmo que permita seleccionar. de entre todas las carreteras posibles. por este orden: 1. Eleccion razonada del esquema algor tmico. Se planea conectar entre s todos los pueblos de una cierta region mediante carreteras que sustituyan los antiguos caminos vecinales. Estructuras de datos.Escuela Universitaria de Informatica de la UNED Ingenier a Tecnica de Sistemas e Ingenier a Tecnica de Gestion Programacion III . b) A mitad de curso se coloca una pizarra adicional en una de las paredes adyacentes con la primera pizarra.Convocatoria de Septiembre 96 Examen de reserva Problema 1 (5 puntos). Este algoritmo debe sacar partido de la colocacion anterior. un subconjunto que conecte todos los pueblos de la region con un coste global m nimo. ninguno se vea estorbado por otro alumno mas alto que el. 3. 4. Algoritmo completo a partir del re namiento del esquema general. ademas: Voraz: demostracion de optimalidad. En una clase hay f las y c columnas de pupitres. Segun el esquema elegido hay que especi car. Descripcion del esquema usado e identi cacion con el problema. Estudio del coste. Se dispone de un estudio que enumera todas las posibles carreteras que podr an construirse y cual ser a el coste de construir cada una de ellas. Divide y venceras: Vuelta atras: . . 2.7. La resolucion de cada problema debe incluir. 2. Dise~ar un algoritmo que calcule todas las posibles formas de obtener n 31 utilizando a lo sumo 4 cartas y 2 palos distintos en cada combinacion. Mezclamos A con B (50 movimientos) y el resultado con C (60 movimientos). ademas: Voraz: demostracion de optimalidad. Problema 1 (5 puntos). 3. B con 20 y C con 10 1. Dise~ar un algoritmo que busque la solucion optima minimizando el n numero de movimientos. . 5. se pretende mezclarlas a pares hasta lograr una unica cinta ordenada.10(sota).Convocatoria de Febrero de 1997 Examen primera semana denados cada una. Segun el esquema elegido hay que especi car. copas. La secuencia en la que se realiza la mezcla determinara la e ciencia del proceso. Mezclamos C con B (30 Movimientos) y el resultado con A (60). con lo que realizamos en total 110 movimientos 2. Divide y venceras: preorden bien fundado. Dado un conjunto de n cintas con n registros ori Por ejemplo: 3 cintas: A con 30 registros.4. Vuelta atras: descripcion del arbol de busqueda asociado. Descripcion del esquema usado e identi cacion con el problema.11(caballo) y 12(rey) con los 4 palos: oros. Eleccion razonada del esquema algor tmico. Algoritmo completo a partir del re namiento del esquema general. El juego del 31 utiliza las cartas de la baraja espa~ola: n 1.3. espadas y bastos.6.Escuela Universitaria de Informatica de la UNED Ingenier a Tecnica de Sistemas e Ingenier a Tecnica de Gestion Programacion III . Total = 90 movimientos >Hay alguna forma mas e ciente de ordenar el contenido de las cintas? Problema 2 (5 puntos). Estudio del coste. 4.5. por este orden: 1. Estructuras de datos. . • Por otro lado. ¿Hay alguna forma más eficiente de ordenar el contenido de las cintas? Solución: Elección razonada del esquema El problema presenta una serie de elementos característicos de un esquema voraz: • Por un lado. B con 20 y C con 10. 1. de manera que para alcanzar una solución óptima es preciso seleccionar adecuadamente al candidato mediante un criterio determinado. se tienen un conjunto de candidatos (las cintas) que vamos eligiendo uno a uno hasta completar determinada tarea. Dado un conjunto de n cintas no vacías con ni registros ordenados cada uno. Esquema general e identificación con el problema El esquema voraz se aplica a problema de optimización. Consiste en ir seleccionando elementos de un conjunto de candidatos que se van incorporando a la solución. Demostración de optimalidad: La demostración corresponde con la de minimización del tiempo en el sistema. habremos de demostrar que nos lleva a una solución óptima. Una vez escogido. Es crucial determinar la función de selección adecuada que nos asegure que la solución obtenida es óptima. Diséñese un algoritmo que busque la solución óptima minimizando el número de movimientos. Por ejemplo: 3 cintas: A con 30 registros. 2. Mezclamos C con B (30 movimientos) y el resultado con A (60 movimientos). Mezclamos A con B (50 movimientos) y el resultado con C (60 movimientos). con la que realiza en total 110 movimientos. por lo que evitamos escribirla de nuevo. Esta notación algorítmica puede escribirse así (libro de Brassard página 214): fun voraz (C: conjunto) dev (S: conjunto) S ← ∅ mientras ¬ solucion (S) ∧ C ≠ ∅ hacer x ← elemento que maximiza objetivo (x) C ←C \ {x} si completable (S ∪ {x}) entonces S ← S ∪ {x} fsi dev S ffun . dada ya en ejercicios antes. Se caracterizan porque nunca se deshace una decisión ya tomada: los candidatos desechados no vuelven a ser considerados y los incorporados a la solución permanecen en ella hasta al final del algoritmo. Febrero 1997 (Primera Semana) Problema 1 (5 puntos). con la que realiza en total 90 movimientos.RESPUESTAS EXAMEN Programación III. el orden de elección de dichos elementos determina la optimalidad de la solución. se pretende mezclarlos a pares hasta lograr una única cinta ordenada. La secuencia en la que se realiza la mezcla determinara la eficiencia del proceso. El criterio de elección de las cintas para alcanzar una solución óptima será el de elegir en cada momento aquella con menor número de registros. • Factible (x) (o completable): Esta función es siempre cierta. La única función (de selección) por desarrollar es aquella que obtiene en cada momento la cinta con menor número de registros de entre las cintas no usadas todavía y almacenadas en el vector de cintas. sólo que pienso que había algunas erratas. Algoritmo completo a partir del refinamiento del esquema Adaptamos el algoritmo general a lo dicho anteriormente: fun voraz (c: vector) dev (s: vector) para i ← 0 hasta n hacer s[i] ← 0 fpara i ← 0 mientras i < n hacer x ← seleccionar (c) c[i] ← 0 s[i] ← x i ← i+1 fmientras dev S ffun Esta solución está modificada respecto de la solución aportada en el libro de problemas. por lo que evitamos escribirla de nuevo. Con esto trato de decir. pues cualquier orden de combinación es válido.Hemos de particularizar las siguientes funciones: • Solución (S): El número de cintas. La función devuelve la cinta. Se han añadido una línea (la de i←i+1) y se ha modificado la línea c[i]←0. para el conjunto C se define la variable c como vector de naturales. Estructuras de datos Se utilizarán vectores de n valores naturales para representar los conjuntos. que es n. Los argumentos sin c. que no es seguro que esté correcta la respuesta. siendo c[i] = ni la expresión de que la cinta i consta de ni registros. • Objetivo (x): Función que devuelve la cinta con menor número de registros de entre el conjunto de cintas disponibles. dada ya en ejercicios antes. El conjunto S puede representarse de manera análoga. Por ejemplo. el valor ∅). Análisis del coste La función objetivo (para nosotros seleccionar) tiene coste de Ο(n) y el bucle principal (“mientras”) se repite n veces. por lo que el coste es Ο(n2). vector de cintas y cinta que es un vector de ni registros. . Para representar la ausencia de un elemento puede usarse cualquier marcador (por ejemplo. fun seleccionar (c: vector) dev cinta: vector min ← 1 para j ← 1 hasta n hacer si c[j] < c[min] entonces min ← j fsi fpara dev c[min] ffun Demostración de optimalidad La demostración corresponde con la de minimización del tiempo en el sistema. pero no la elimina del conjunto de candidatos. Dise~ar un algoritmo que permita almacenar el maximo n La resolucion de cada problema debe incluir. 4. Problema 1(5 puntos). Algoritmo completo a partir del re namiento del esquema general. Descripcion del esquema usado e identi cacion con el problema.Escuela Universitaria de Informatica de la UNED Ingenier a Tecnica de Sistemas e Ingenier a Tecnica de Gestion Programacion III . Dise~ar un algoritmo que seleccione las canciones de n forma que se minimice el espacio vac o que queda en la cinta. Divide y venceras: preorden bien fundado. por este orden: 1. Segun el esquema elegido hay que especi car. ademas: Voraz: demostracion de optimalidad. duracion =1 n T < n i t1 : : : tn en una cinta de audio de ti numero de canciones en el espacio disponible. 3. Problema 2(5 puntos).Convocatoria de Febrero de 1997 Examen segunda semana Queremos grabar canciones de duraciones P . 5. Estudio del coste. Eleccion razonada del esquema algor tmico. Vuelta atras: descripcion del arbol de busqueda asociado. . Estructuras de datos. 2. . Descripcion del esquema usado e identi cacion con el problema. Sea un juego de tablero para dos personas. Supondremos que en el juego no se pueden dar ciclos (volver a una situacion previa en el juego). . Divide y venceras: preorden bien fundado. por este orden: 1. Una empresa de mensajer a dispone de tres motoristas en distintos puntos de la ciudad.Convocatoria de Septiembre de 1997 Original Problema 1 (5 puntos). quien debe mover a continuacion (o. 2. y tiene que atender a tres clientes en otros tres puntos. en minutos): cliente1 cliente2 cliente3 Moto 1 Moto 2 30 40 60 20 40 90 Moto 3 70 10 20 Dise~ar un algoritmo que distribuya un cliente a cada motorista de forma que se minimice el n coste total (en tiempo) de atender a los tres clientes. Eleccion razonada del esquema algor tmico. que la partida acabo con triunfo del primer jugador. Estudio del coste.Escuela Universitaria de Informatica de la UNED Ingenier a Tecnica de Sistemas e Ingenier a Tecnica de Gestion Programacion III . de forma que se asegure la victoria siguiendo esa estrategia. 5. que la partida acabo con triunfo del segundo jugador. Problema 2 (5 puntos). al juego del ajedrez? >Y en la practica? La resolucion de cada problema debe incluir. Estructuras de datos. en el que se turnan para mover las piezas del tablero segun unas reglas determinadas. 3. Una funcion funcion movimientos (j: jugada) devolver l:lista de jugada que da todas las jugadas posibles a partir de una dada. Segun el esquema elegido hay que especi car. >Se puede aplicar el algoritmo. 2. Se puede estimar el tiempo que tardar a cada motorista en atender a cada uno de los clientes (en la tabla. y 4. por otro lado. Dise~ar n un algoritmo que averigue si existe una estrategia optima para el jugador que mueve primero. 4. al segundo jugador. Daremos por conocidos: Una estructura de datos jugada que nos da dos tipos de informacion: en un registro tablero. ademas: Voraz: demostracion de optimalidad. en caso de ser una posicion nal. con la siguiente convencion: 1 signi ca que le toca mover al jugador que comenzo. quien es el ganador). en teor a. la situacion de las chas en el tablero. Exploracion en grafos: descripcion del arbol de busqueda asociado. que no se puede prolongar inde nidamente y que la partida no puede acabar en tablas. por un lado. 3. Y en un registro turno. Algoritmo completo a partir del re namiento del esquema general. . Estudio del coste. En la compleja red de metro de Japon. Algoritmo completo a partir del re namiento del esquema general. por este orden: 1. Exploracion en grafos: descripcion del grafo de busqueda asociado.Escuela Universitaria de Informatica de la UNED Ingenier a Tecnica de Sistemas e Ingenier a Tecnica de Gestion Programacion III . Estructuras de datos requeridas. El objetivo del juego es eliminar progresivamente todas las bolas del tablero hasta que solo quede una. Se considera un juego solitario en el que el tablero se compone de varios huecos dispuestos en forma de cruz y un conjunto de bolas que. Eleccion razonada del esquema algor tmico. Describir un algoritmo que deduzca la informacion de todos esos paneles. retirando la bola intermedia (ver un posible primer movimiento en g. derecha). ademas: Voraz: demostracion de optimalidad. cubren todos ellos excepto el hueco central (ver gura izquierda). La resolucion de cada problema debe incluir. basando el calculo en la suposicion de que el viajero se trasladara de una estacion a otra por el camino mas corto. n Problema 2 (5 puntos). Por tanto. Breve descripcion del esquema usado e identi cacion con el problema. Solo se consideran movimientos horizontales o verticales. es necesario instalar en cada estacion un panel informativo que informe del precio del billete a cualquier otra estacion de la red. inicialmente. Dise~ar un algoritmo que encuentre una solucion al juego. Divide y venceras: preorden bien fundado entre los ejemplares del problema. se puede saltar con la primera bola al hueco vac o. 2. 3. .Convocatoria de Febrero de 1998 Primera Semana Problema 1 (5 puntos). nunca en diagonal. 5. Siempre que haya dos bolas y un hueco vac o consecutivos. 4. la cantidad que se paga por un billete es proporcional a la distancia que se recorre. Segun el esquema elegido hay que especi car. . 1 si la casilla tiene una pieza.7. La solución consiste en la secuencia de movimientos hasta llegar a la posición final.x ← i+2*dX[v] . Es posible que una casilla del tablero sea visitada varias veces por distintas piezas a lo largo de una partida: no podemos utilizar un tablero para representar la solución Utilizaremos una secuencia X = (x1.x ← i+dX[v] .destino. Solucionado por Vuelta atrás. inicialmente.v) entonces sol[etapa].7]..j] = 1 entonces desde v ← 1 hasta 4 hacer si esValido(D.31]. cubren todos ellos excepto el hueco central (ver figura izquierda).comido. posición de la _cha que se salta. m = 31. Se utiliza para deshabilitar las posiciones de las esquinas.origen. se puede saltar con la primera bola al hueco vacío. Cada movimiento debe contener información para deshacerlo si es necesario: • • • posición del tablero desde la que se mueve. Además.j. nunca en diagonal.. 0) .x ← i . -1) //constantes globales fun continental(D[1. Se considera un juego solitario en el que el tablero se compone de varios huecos dispuestos en forma de cruz y un conjunto de bolas que. sol[etapa].RESPUESTAS EXAMEN Programación III.sol[etapa]) si continental(D. derecha). Diseñar un algoritmo que encuentre una solución al juego. Siempre que haya dos bolas y un hueco vacío consecutivos. sol[etapa]. El objetivo del juego es eliminar progresivamente todas las bolas del tablero hasta que sólo quede una. -1 si la casilla es no válida.y ← j+dY[v] hacerMovimiento(D.etapa+1) entonces devolver cierto si no deshacerMovimiento(D. 0.etapa) si esFin(D.sol.origen..destino.sol[1.comido. en la que xi representa el movimiento i -ésimo.sol[etapa]) fin si fin desde fin si fin desde fin desde devolver falso fin fun .xm). dX = (1.etapa) entonces devolver cierto desde i ← 1 hasta 7 hacer desde j ← 1 hasta 7 hacer si D[i. 1.…. -1. Sólo se consideran movimientos horizontales o verticales. Febrero 1998 (Primera Semana) Problema 1 (5 puntos).i. X X X X X X X X X X X X X X X X O X X X X X X X X X X X X X X X X ===> X X X X X X X X X X X X X X X X X O O X X X X X X X X X X X X X X El tablero de juego se puede representar mediante una matriz 7*7 con tres valores posibles: • • • 0 si la casilla está vacía. sol[etapa].y ← j+2*dY[v] sol[etapa].y ← j sol[etapa]. posición a la que se mueve. retirando la bola intermedia (ver un posible primer movimiento en fig. 0.1. dY = (0. que no forman parte del tablero. -1}. 1. 1. Descripción del esquema usado e identificación con el problema.mov.y] ← 1 fin proa fun llamador continental(sol) crear D[1.sol[etapa]) D[mov.comido.y] ← 0 fin proa proc deshacerMovimiento(D.v) // Ya se ha comprobado que D[i. . Elección razonada del esquema algorítmico.-1. destY ← j+2*dY[v] comX ← i+dX[v] .sol. 1. comY ← j+dY[v] si 1 ≤ destX ≤ 7 ^ 1 ≤ destY ≤ 7^ D[destX. 1.j]=1 destX ← i+2*dX[v] . 1.-1}.etapa) si etapa = 31 ^ D[4.7. {-1. Estudio del coste. {-1.mov. 4. por este orden: 1. 1.-1}} devolver continental(D.comY]=1 entonces devolver cierto si no devolver falso fin fun proc hacerMovimiento(D. { 1. { 1.mov. 3.comido.mov) D[mov.-1.y] ← 1 D[mov.y] ← 1 D[mov.y] ← 0 D[mov. 1}. 1. 1.. Según el esquema elegido hay que especificar.x.-1. Estructuras de datos. 1.fun esFin(D. 1. Algoritmo completo a partir del refinamiento del esquema general. además: Voraz: demostración de optimalidad. Divide y vencerás: preorden bien fundado. 1. 1}.mov.mov.7] D ← {{-1.-1. 2.1.destino.x. 1.origen.mov.-1. 1.-1}.x. 1. 1. Exploración en grafos: descripción del árbol de búsqueda asociado.destino.destino. 1. { 1.4] = 1 entonces devolver cierto devolver falso fin fun fun esValido(D. 1.-1.1) fin fun La resolución del problema debe incluir.-1.j.comido. 1. 1}.i. 1.x.y] ← 0 D[mov. {-1. 5.x..origen.destY]=0 ^ D[comX. 1. 1. 1.destino. 1.origen.comido. 1. 1. 1.-1.origen.x. 0. Eleccion razonada del esquema algor tmico.20 10 20 .3 2 . La resolucion de cada problema debe incluir. Estudio del coste. Se pide programar un algoritmo e ciente que encuentre la linea de horizonte que forma un conjunto de edi cios. Cada rectangulo descansa sobre el eje horizontal y se representa por sus abscisas inicial y nal y por su altura.Convocatoria de Febrero de 1998 Segunda Semana Problema 1 (5 Puntos) Sobre un eje de coordenadas positivo se tienen representados edi cios en forma de rectangulos. . Divide y venceras: preorden bien fundado entre los ejemplares del problema. Las piezas se acoplan entre s mediante tornillos. Ej. 2.Escuela Universitaria de Informatica de la UNED Ingenier a Tecnica de Sistemas e Ingenier a Tecnica de Gestion Programacion III .5 10 5 .10 .- p5 p6 p7 p8 3 - Se pide construir un algoritmo que calcule la combinacion de piezas que forman un juguete completo minimizando el gasto de tornillos. ademas: Voraz: demostracion de optimalidad. formando distintos juguetes dependiendo de como se combinen. 4. Breve descripcion del esquema usado e identi cacion con el problema. 3. Una ciudad = f(0 4 7) (2 14 4) (7 12 5) (8 17 2) (19 21 10)g tendr a una linea de horizonte = f(0 4 7) (4 7 4) (7 12 5) (12 14 4) (14 17 2) (17 19 0) (19 21 10)g: C H Problema 2 (5 Puntos) Se tiene un mecano de 8 piezas. El gasto de tornillos de cada acoplamiento es el indicado en la siguiente tabla: (Un . por este orden: 1. La linea de horizonte es el contorno que forman los edi cios. Un juguete completo es aquel formado por las 8 piezas. 5..1 .1 . Exploracion en grafos: descripcion del grafo de busqueda asociado. Segun el esquema elegido hay que especi car. indica que las piezas no encajan) p1 p2 p3 p4 p5 p6 p7 p8 7 12 4 - p1 p2 7 2 6 1 1 - 12 2 4 10 3 p3 p4 6 4 3 2 - 4 . Algoritmo completo a partir del re namiento del esquema general. Estructuras de datos requeridas. . . ademas: Voraz: demostracion de optimalidad.Escuela Universitaria de Informatica de la UNED Ingenier a Tecnica de Sistemas e Ingenier a Tecnica de Gestion Programacion III . 5. Una cadena euleriana en un grafo no orientado es una cadena que une cada arista del grafo exactamente una vez. 3. 4. Problema 1 (5 puntos). Segun el esquema elegido hay que especi car. que devuelva esa cadena. Divide y venceras: preorden bien fundado entre los ejemplares del problema. La resolucion de cada problema debe incluir. Dado un conjunto de n rectangulos cuyos lados son paralelos Problema 2 (5 puntos). Breve descripcion del esquema usado e identi cacion con el problema. si es as . Eleccion razonada del esquema algor tmico. hallar el rectangulo interseccion de todos los rectangulos mediante un algoritmo e ciente. 2. Algoritmo completo a partir del re namiento del esquema general. Exploracion en grafos: descripcion del grafo de busqueda asociado. Estudio del coste. Estructuras de datos requeridas.Convocatoria de Septiembre de 1998 Original a los ejes del plano. Escribir un algoritmo que decida si un grafo dado tiene una cadena euleriana y. por este orden: 1. . . . . Elección razonada del esquema algorítmico. Problema 2 (5 puntos). Divide y vencerás: preorden bien fundado. etc.. 4. por este orden: 1. 3.e2 . Exploración en grafos: descripción del árbol de búsqueda asociado.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Febrero 1999 – Segunda Semana Problema 1 (5 puntos). Algoritmo completo a partir del refinamiento del esquema general. e2 a e3. 2. Según el esquema elegido hay que especificar. 5. El coste debe ser a lo sumo O(nlogn) La resolución del problema debe incluir. Diseñar un algoritmo que realice una pseudo-ordenación (e1. .en) a partir de la tabla de resultados de lo equipos de manera que e1 haya ganado a e2.. Estudio del coste. Descripción del esquema usado e identificación con el problema. Estructuras de datos. Diseñar un algoritmo que tome un mapa político y coloree el mapa con el mínimo número de colores posible de manera que dos países fronterizos no tengan el mismo color. además: Voraz: demostración de optimalidad. pero no se empata. Una liga de n equipos ei juega a un juego donde solo se pierde o se gana. . Algoritmo completo a partir del refinamiento del esquema general. Cada jugador mueve alternativamente. o en tablas. Elección razonada del esquema algorítmico. La resolución del problema debe incluir. . . Según el esquema elegido hay que especificar. 4.Una función funcion movimientos(j: situacion) devolver l:lista de situación que nos da todas las jugadas posibles a partir de una dada. disposición de las fichas en el tablero. Descripción del esquema usado e identificación con el problema. Estudio del coste.Una estructura de datos situación que nos da la situación actual del juego: qué jugador tiene el turno. es porque el juego ha terminado. Comparar la eficiencia de los algoritmos de ordenación Quicksort (ordenación rápida) y Mergesort (ordenación por fusión). Exploración en grafos: descripción del árbol de búsqueda asociado. Divide y vencerás: preorden bien fundado. Cuestión 2 (1 puntos). El juego acaba con la victoria de uno de los dos jugadores. Se considera un juego de tablero genérico con las siguientes características: .UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Febrero 2000 Primera Semana Cuestión 1 (2 puntos). Estructuras de datos. 3. .Juegan dos oponentes entre sí. Cuestión 3 (2 puntos). Se pide diseñar un algoritmo que encuentre cuál es el número de movimientos de la (o las) partidas más cortas. por este orden: 1. PROBLEMA (5 puntos). si nos devuelve una lista vacía. 2. 5. Comenta las condiciones de poda que has utilizado en la realización de la práctica del Nim. ¿Que variante del problema de la mochila admite una solución voraz y ¿por qué? ¿Qué variante no admite solución voraz? Poner un ejemplo del segundo caso en el que la solución voraz no nos lleve a la solución óptima. además: Voraz: demostración de optimalidad.Se supone conocido: . Aceptaremos que. etc. Pese a esto. El algoritmo Quicksort emplea un tiempo promedio de nlogn. Esta variante admite solución voraz porque encontramos una función de selección que nos permite escoger del candidato a cada paso de forma que obtengamos una solución óptima. b y c. Comparar la eficiencia de los algoritmos de ordenación Quicsort (ordenación rápida) y Mergesort (ordenación por fusión). lo que nos lleva a una solución óptima. peso máximo de la mochila) . Vemos con este ejemplo como el criterio seguido en la variante continua del problema no puede aplicarse en el caso en el que los objetos no puedan fragmentarse.333) . (Respuesta: Fundamentos de Algoritmia. De este modo tendríamos: a (vi/wi = 1. el valor conseguido será entonces de 6. . Febrero 2000 (Primera Semana) Cuestión 1. La variante del problema de la mochila que admite solución voraz es la variante continua. Dada la siguiente relación de objetos valor-peso para una mochila de capacidad 10 (W=10 . Siendo esta la solución óptima. a 6 8 b 5 5 c 5 5 wi vi Según el algoritmo voraz de la variante continua tomaríamos los objetos según su orden decreciente en función de la relación valor/peso. Cuestión 3. queda aún espacio para el objeto c. La variante que no admite solución optima es la que no nos permite fragmentar los objetos. b (vi/wi= 1) y c(vi/wi=1) . Dicha función consiste en escoger los objetos por orden decreciente (de mayor a menor) según su relación valor/peso. pag 227. El algoritmo por fusión mergesort utiliza un tiempo de nlogn (siempre observando la precaución de equilibrar los subcasos a tratar). 260). veamos esto con un ejemplo. en la práctica Quicksort es más rápido en un tiempo c constante. y porqué?¿Qué variante no admite solución voraz? Poner un ejemplo del segundo caso en el que la solución voraz no nos lleve a la solución óptima. con lo que en esta ocasión hemos utilizado el peso total máximo de la mochila y el valor conseguido es de 10. mientras que si introducimos primero el objeto b. (Respuesta: Fundamentos de algoritmia. La sucesión a. Sin embargo como en esta ocasión no podemos fragmentar los objetos al introducir en la mochila el objeto a de peso 6 ya no podemos introducir ninguno más. Comenta las condiciones de poda que has utilizado en la realización de la práctica del Nim. Cuestión 2. 300). donde podemos fragmentar los objetos.RESPUESTAS EXAMEN Programación III. en el peor caso de n2. contraejemplo en pag.¿Qué variante del problema de la mochila admite solución voraz. pag. Además el algoritmo mergesort requiere de un espacio extra para tratar los distintos casos sin perder eficiencia (hacer la ordenación in situ lleva asociado un incremento de la constante oculta bastante alto). Exploración en grafos: descripción del árbol de búsqueda asociado. Durante este proceso la nave es vulnerable. 3. Divide y vencerás: preorden bien fundado. Elección razonada del esquema algorítmico.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Febrero 2000 – Segunda semana Cuestión 1 (1 puntos).5] [-3] [-10. Estudio del coste. Suponiendo que se produce un ataque sorpresa.-8. ¿En que se diferencia esta estrategia de juego de la utilizada para resolver la práctica?. construir un algoritmo que averigüe el orden de despegue de las aeronaves de manera que se minimice el tiempo medio durante el cual son vulnerables. Si queremos maximizar la importancia estratégica una vez que hayan despegado todas ¿Qué tipo de problema es éste? ¿Con que esquema se resuelve?. 5. mejor jugada para A. ¿Puedes explicar brevemente que papel desempeña un montículo en el algoritmo de Ramificación y Poda? ¿Cuál es el criterio general para realizar la poda en este algoritmo?. Se pide propagar las puntuaciones y elegir la rama más adecuada a partir de la raíz sabiendo que el nodo raíz corresponde al jugador A. Según el esquema elegido hay que especificar. Descripción del esquema usado e identificación con el problema. además: Voraz: demostración de optimalidad.-10] [-15. 2. Explica en un párrafo breve el funcionamiento del algoritmo. Cuestión 2 (2 puntos). Cada caza tiene que salir del bunker y superar un tiempo de rodadura ki más un tiempo de despegue ti para estar en el aire y operativo. . por este orden: 1.n}). Poner algún ejemplo en el que un enfoque de Divide y Vencerás nos lleve a un coste exponencial de forma innecesaria. En una exploración de un árbol de juego con dos oponentes a nivel de profundidad 4 (contando la raíz como nivel 1) y siguiendo la estrategia del MINIMAX nos encontramos con la siguiente puntuación: [[[-7. La resolución del problema debe incluir. Estructuras de datos..14] [-30.20]] [[1] [6. Supongamos ahora que cada aeronave ci posee un índice acumulativo bi de importancia estratégica siempre que despegue antes de la ranura temporal hi (con i ∈ {1. Problema (5 Puntos).. 4. Cuestión 3 (2 puntos). y que se alternan para mover. Algoritmo completo a partir del refinamiento del esquema general.0]] [[-5.0] [-8.-9]]] donde los corchetes indican agrupación de nodos por nodo padre común. La Base Aérea de Gando (Gran Canaria) posee una flota variada de n cazas de combate ci (con i ∈ {1. a mayor valor.-20.n}). . a mayor valor. pag. De este modo tendremos ordenados los nodos según la cota.-8. tomando como valor el de la función de cota.Poner algún ejemplo en el que un enfoque divide y vencerás nos lleve a un coste exponencial de forma innecesaria. luego cogerá los valores más pequeños.14] [-30. (Respuesta: Fundamentos de Algoritmia.-10][-15. el nodo 2 a B. ¿En que se diferencia esta estrategia de juego de la utilizada para resolver la práctica? (Alg.RESPUESTAS EXAMEN Programación III. el nodo 3 a A y consecuentemente el nodo 4 a B. y los mejores valores para A son los mayores.En una exploración de un árbol de juego con dos oponentes a nivel de profundidad 4 (Contando la raiz como nivel 1) y siguiendo la estrategia MINIMAX nos encontramos con la siguiente puntuación: [[[-7. Como anteriormente juega A.5][-3][-10. de manera que el elemento en la cima será el más factible de ser explorado a continuación.83). .-9]]] Donde los corchetes indican agrupación de nodos por nodo padre común.0]] [[-5. Se pide propagar las puntuaciones y elegir la rama más adecuada a partir de la raíz sabiendo que el nodo raíz corresponde al jugador A. El criterio consiste en calcular una cota del posible valor de aquellas soluciones que el grafo pudiera tomar más adelante. según lo cual los valores corresponderán por tanto a una jugada de B.20]] [[1] [6. El montículo es la forma ideal de mantener la lista de nodos que han sido generados pero no explorados en su totalidad en los diferentes niveles del árbol. y que se alternan en mover. cogerá por tanto los mayores valores de las jugadas posibles. mejor jugada para A. Fun Fib(n) si (n < 2) entonces devolver n sino Devolver Fib(n . Febrero 2000 (Segunda Semana) Cuestión 1. existiendo formas de obtener la solución en un coste inferior utilizando un enfoque distinto al de divide y vencerás. 354. Cuestión 3.-20.0] [-8.¿Puedes explicar brevemente qué papel desempeña un montículo en el algoritmo de ramificación y poda? ¿Cuál es el criterio general para realizar la poda en este algoritmo? (Respuesta Fundamentos de Algoritmia. Un ejemplo claro de esto es utilizar la definición recursiva de la función de Fibonacci sin más.1) + Fib(n . Minimax pag. y 348). si la cota muestra que cualquiera de estas soluciones será necesariamente peor que la mejor solución hallada hasta el momento entonces no seguimos explorando esa parte del grafo. pag. 354) El nodo raíz corresponde al jugador A. de este modo el siguiente algoritmo conlleva un coste exponencial.2) Fsi Ffun Cuestión 2. Cuando juegue B es lógico que este tomará aquellas jugadas que sean peores para A. por este orden: 1. Explica en un párrafo breve el funcionamiento del algoritmo. Divide y vencerás: preorden bien fundado. 3.n}). 4. Exploración en grafos: descripción del árbol de búsqueda asociado. Estudio del coste. Supongamos ahora que cada aeronave ci posee un índice acumulativo bi de importancia estratégica siempre que despegue antes de la ranura temporal hi (con i ∈ {1.. Durante este proceso la nave es vulnerable. Suponiendo que se produce un ataque sorpresa. construir un algoritmo que averigüe el orden de despegue de las aeronaves de manera que se minimice el tiempo medio durante el cual son vulnerables. 2. La Base Aérea de Gando (Gran Canaria) posee una flota variada de n cazas de combate ci (con i ∈ {1. . Según el esquema elegido hay que especificar. Algoritmo completo a partir del refinamiento del esquema general. Estructuras de datos.n}).Problema (5 Puntos). Descripción del esquema usado e identificación con el problema.. Cada caza tiene que salir del bunker y superar un tiempo de rodadura ki más un tiempo de despegue ti para estar en el aire y operativo. además: Voraz: demostración de optimalidad. 5. La resolución del problema debe incluir. Si queremos maximizar la importancia estratégica una vez que hayan despegado todas ¿Qué tipo de problema es éste? ¿Con que esquema se resuelve?. Elección razonada del esquema algorítmico. >Cual es la relacion entre la ordenacion por Problema (5 puntos). 3. f ib n f ib n f ib n f ib n n seleccion y la ordenacion por mont culo? >Como se re eja en la e ciencia de los dos algoritmos? (2 puntos). Descripcion del esquema usado e identi cacion con el problema. La sucesion de Fibonacci se de ne como (0) = (1) = 1 ( ) = ( . Segun el esquema elegido hay que especi car.Septiembre 2.Escuela Universitaria de Informatica de la UNED Ingenier a Tecnica de Sistemas e Ingenier a Tecnica de Gestion Programacion III . La unica comparacion que se permite entre esos elementos es el test de igualdad. Llamemos elemento mayoritario de . al menos. Sugerencia: el elemento mayoritario de un vector debe serlo tambien. a aquel que aparece estrictamente mas de 2 veces en . Exploracion en grafos: descripcion del arbol de busqueda asociado. Estudio del coste. Dise~ar un algoritmo que encuentre el n elemento mayoritario de un vector (si existe) en un tiempo que sea. 1)+ ( . . ademas: Voraz: demostracion de optimalidad. si existe.Original Cuestion 1. 5. por este orden: 1. 4. Eleccion razonada del esquema algor tmico. 2. A la hora de hacer una exploracion ciega en un grafo. T n= T n n La resolucion del problema debe incluir. Sea 1 ] un vector de elementos. >que criterios nos pueden decidir por una busqueda en profundidad o en anchura? f ib f ib Cuestion 2 (2 puntos). Algoritmo completo a partir del re namiento del esquema general. Que ocurre si aplicamos una estrategia divide y venceras para calcular ( ) usando directamente la de nicion? >Que otras opciones existen? (2 puntos). O( log ).000 . (1 punto). a lo sumo. T :::n n Cuestion 3 (2 puntos). de una de sus dos mitades. Estructuras de datos. 2)si 2. Divide y venceras: preorden bien fundado. . Septiembre 2000 Cuestión 1. for (int i = 1.println ("\tTiempo: "+(timeFinal-timeInicial)/1000 + " s.currentTimeMillis(). pag 340). BufferedReader b=new BufferedReader (new InputStreamReader (System. Del mismo modo.A la hora de hacer una exploración ciega en un grafo ¿qué criterios nos pueden decidir por una búsqueda en profundidad o en anchura? (Respuesta: Fundamentos de Algoritmia. Si utilizamos directamente la definición obtendremos un algoritmo con un coste exponencial.readLine (). Ffun Y el principal problema es que calcularía varias veces los mismos valores. i ← j − i. double timeFinal = System. En otro caso nos decidiremos por la exploración en profundidad. Si el problema consiste en encontrar el camino más corto desde un punto del grafo hasta otro. i++){ System. else return fib(n-1) + fib(n-2). j ← 0. Dicho algoritmo sería el siguiente: Fun Fibrec(n) si (n < 2) entonces devolver n sino devolver Fibrec(n . Implementación en java de los dos algoritmos.*. de forma que no resulte manejable. Cuestión 2. } } } .1) + Fibrec(n . para evitar esto existe otra opción dada por el algoritmo iterativo.print("numero: "). (Respuesta. la exploración en anchura es la más adecuada. System. int N=Integer. String numero2 =b.La sucesión de fibonacci se define como Fib(1)=1.out.in)). que requiere de un tiempo de orden n.currentTimeMillis(). Fundamentos de Algoritmia pag.print(i + ": " + fib(i)). fib(n)=fib(n-1)+fib(n-1) si n >= 2 ¿Qué ocurre si aplicamos una estrategia divide y vencerás para calcular fib(n) usando directamente la definición?¿Qué otras opciones existen?."). A la hora de escoger un criterio u otro fundamentaremos nuestra decisión según el problema en cuestión y el tamaño del grafo generado. i <= N. si el grafo a tratar es de un tamaño muy grande. con los tiempos de ejecución: import java.parseInt (numero2). utilizaremos la exploración en anchura para realizar una exploración parcial de dicho grafo. 83). Fpara devolver j.out.2) Fsi Ffun Fun Fibiter(n) i ← 1.out. o infinito.RESPUESTAS EXAMEN Programación III. public class fibrec { public static long fib(int n) { if (n <= 1) return n. } public static void main(String[] args) throws IOException { System. double timeInicial = System.io. para k ← 1 hasta n hacer j ← j + i. 61 s. BufferedReader b=new BufferedReader (new InputStreamReader (System.266 0.2620098008170014E304 1459: 3.266 0.5 s. . double N=Double.0 s.b):= (0. s. 76710.currentTimeMillis().0) n=1 → (a. s.0 Tiempo: 0.625 7.485 12.println("\tTiempo: "+(timeFinal-timeInicial)/1000 + " s.out.094 1.0 Tiempo: 0.0 0.0 Tiempo: 0. 18116.b):= (a*a+b*b. 2: 1. g = 1.125 s. fibiter 1: 1. s. i++) { f = f + g.b):= potF(n-1) f := a+b fsi ffun fun potF (n:nat) dev (a. System. Tiempo: Tiempo: Tiempo: Tiempo: Tiempo: Tiempo: Tiempo: Tiempo: Tiempo: Tiempo: 0.b):= potF(ndiv2) (a.v [ n ] y se intercambia con v [1] . 47427.0 0.in)).266 0. a*b+b*(a+b)) n<1 ^ impar (n) → (a. public class fibiter { public static void main(String[] args) throws IOException{ System.0 0. s. 29307. } } } fibrec 1: 1 Tiempo: 2: 1 Tiempo: 3: 2 Tiempo: 4: 3 Tiempo: 5: 5 Tiempo: .3979989397902865E304 1458: 2. s.io. double timeFinal = System. 1456: 8.readLine ().import java. Existe una tercera opción con la que tendríamos un algoritmo de fibonacci de orden O ( logn ) fun fibo (n:nat) dev f:nat si n ≤ 1 entonces f := n sino (a.625 s.766 2. i <= N.currentTimeMillis().¿Cuál es la relación entre la ordenación por selección y la ordenación por montículo? ¿Cómo se refleja en la eficiencia de los dos algoritmos? ORDENACIÓN POR SELECCIÓN: (página 121) La ordenación se hace sobre un array.b):= (1.266 0.0 s.*. s.64010861026715E303 1457: 1. 5: 5.b):= potF(ndiv2) (a. así sucesivamente hasta llegar al elemento v [ n − 1] . s. s. g = f . s.672 1. System.0 Tiempo: 0. 3: 2. s. String numero2 =b. Tiempo: Tiempo: Tiempo: Tiempo: Tiempo: 11211.print(i+": "+f).422 0. s. s. double timeInicial = System. double f = 0.660008740607288E304 1460: 5. s.469 s.266 0. s.0 s.b):= (b*a+(a+b)*b.844 4. seleccionando el menor elemento del array v [0 ] . 4: 3."). for (int i = 1.0 s.922018541424289E304 Tiempo: Tiempo: Tiempo: Tiempo: Tiempo: 0.11 19.v [ n ] e intercambiándolo con v [0 ] .0 s.0 s. . s.g. ..b:nat) casos n=0 → (a. 33: 3524578 34: 5702887 35: 9227465 36: 14930352 37: 24157817 38: 39088169 39: 63245986 40: 102334155 41: 165580141 42: 267914296 55: 56: 57: 58: 59: 139583862445 225851433717 365435296162 591286729879 956722026041 0.0 0.out. luego el menor elemento del array v [1] . s.5 s.0 Tiempo: 0.. s. b*b+(a+b)*(a+b))) fcasos ffun Cuestión 3. .print("numero: ").parseDouble (numero2).266 s.1) n>1 ^ par (n) → (a.out. de esta manera se obtiene el array ordenado ascendentemente La ordenación por selección requiere un tiempo que está en Ο ( n 2 ) . Utilizando esta idea. mayor1 := mayoritario (V. Llamemos elemento mayoritario de T. sk) fsi ffunción Si el vector tiene un elemento mayoritario. Se cumple que para un nodo que ocupa la posición i del array.mayor1 fsi si ¬existe ∧ existe2 entonces {comprobamos el segundo candidato} existe. Es una variante del método de ordenación por selección. como nos piden que el coste sea logarítmico y el problema se puede dividir en subproblemas más pequeños utilizaré el esquema de divide y vencerás.V [ c ] sino m := ( c + f ) div2 existe1 . ESQUEMA GENÉRICO. por lo tanto descarto el esquema voraz y ramificación y poda. y su hijo derecho la posición 2i +1 Problema (5 puntos). a aquel que aparece estrictamente más de n/2 veces en T. Diseñar un algoritmo que encuentre el elemento mayoritario de un vector (si existe) en un tiempo que sea.. f ) . f ] es el siguiente: fun mayoritario (V [1. al menos. función divide y vencerás (problema) si suficientemente simple (problema) entonces devolver solución simple (problema) sino hacer {p1 … pk} ← descomponer (problema) para cada pi hacer si ← divide_y_vencerás (pi) fpara devolver combinación (s1. a lo sumo... 1.. podemos mirar de forma recursiva si existe un elemento mayoritario en cada una de las dos mitades del vector y si aparece en más de la mitad de las posiciones.ORDENACIÓN POR MONTÍCULO: (página 188) El montículo organiza sus datos como un árbol que es la única estructura que proporciona cotas de tiempo logarítmico. f ) existe := falso si existe1 entonces {comprobamos el primer candidato} existe.n ] de elemento. este tiene que ser mayoritario en al menos una de las mitades del vector. .c. c. mayor := cierto.m ) existe2 .mayor1 . Sugerencia: el elemento mayoritario de un vector debe serlo también. Elección razonada del esquema algorítmico No es un problema de optimización.mayor2 fsi fsi ffun . f ) . mayor2 := mayoritario (V. su hijo izquierdo ocupa la posición 2i . será el elemento mayoritario buscado.c. La única comparación que se permite entre esos elementos es el test de igualdad. f : nat ) dev existe : bool. de una de sus dos mitades. El montículo requiere un tiempo que está en Ο ( n log n ) para ordenar n elementos. mayor := comprobar (V. O(nlogn).c. mayor := comprobar (V.. mayor : elemento si c = f entonces existe.mayor2 .n] un vector de n elementos. si existe. El algoritmo que busca el mayoritario de V [ c. donde la búsqueda del elemento mínimo de un array se realiza mediante técnicas basadas en la construcción del montículo.m+1.. Sea T[1. k=1. T ( n ) ∈ Θ ( n log n ) La resolución del problema debe incluir. si a = b k ⎪ log a .n ] de elemento. Elección razonada del esquema algorítmico mas eficiente para resolver el problema (0. f : nat ) dev valido : bool veces := 0 para i = c hasta f hacer si V [i ] = x entonces veces := veces +1 fsi fpara valido := veces > ( f . b=2. 3. si a < b k ⎪ ⎪ T ( n ) ∈ ⎨Θ ( n k log n ) . c. Estudio del coste (1 punto). Demuestra que el problema se puede resolver con el esquema elegido (0. si 1 ≤ n < b ⎪ T (n) = ⎨ k ⎪aT ( n / b ) + cn . x : elemento. 2. .. Estructuras de datos (0.5 puntos).c +1) div2 ffun Para calcular el coste podemos utilizar la siguiente recurrencia: ⎧cn k .5 puntos).5 puntos). por este orden: 1. si a > b k ⎪Θ n b ⎩ ( ) Tenemos a=2. 4.5 puntos). 5. Algoritmo completo a partir del refinamiento del esquema general (1. si n ≥ b ⎩ ⎧Θ ( n k ) .fun comprobar (V [1. 4. el árbol de expansión mínimo de un grafo. 5. 3. Según el esquema elegido hay que especificar. por este orden: 1. de distintas formas. Cuestión 3. Exploración en grafos: descripción del árbol de búsqueda asociado. . Explicar cómo funciona el algoritmo que dota a un vector de la propiedad de montículo en tiempo lineal (no es necesario demostrar que ese es el coste). ¿qué implicaciones tiene para la eficiencia el escoger como pivote la mediana exacta del vector?. Algoritmo completo a partir del refinamiento del esquema general. La resolución del problema debe incluir. Descripción del esquema usado e identificación con el problema. además: Voraz: demostración de optimalidad. Estructuras de datos. ¿Cuál de los dos es más eficiente para un grafo con alta densidad de aristas?. 2.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Septiembre 2000 Reserva Cuestión 1. En el algoritmo quicksort. Divide y vencerás: preorden bien fundado. Razonar la repuesta. Cuestión 2. Los algoritmos de Prim y Kruskal calculan. Estudio del coste. Elección razonada del esquema algorítmico. . RESPUESTAS EXAMEN Programación III. Para obtener alguna ventaja utilizando como pivote la mediana tendremos que hacer algunas modificaciones al algoritmo original. Razonar la repuesta.i) k ←i Repetir j←k Si 2j ≤ n y V[2j] > V[k] entonces k ← 2j fsi Si 2j < n y V[2j +1] > V[k] entonces k ← 2j + 1 fsi Intercambiar V[j] y V[k] hasta j = k Fin_proc . pag.n]. es decir. siendo en este caso el tiempo Θ ( nlogn ) .(Respuesta en: Fundamentos de Algoritmia. siendo mejor que algunas implementaciones del algoritmo de Prim. utilizando la mediana como pivote el orden del algoritmo sea Ο ( nlogn ) incluso en el peor caso. pag. Al ser un algoritmo recursivo sería ideal poder dividir el caso en subcasos de tamaños similares de manera que cada elemento sea de profundidad logn .. Tras hacer esto se harían las llamadas recursivas correspondientes al algoritmo.. lo que hace que la modificación no sea factible. Utilizaremos una nueva función pivote que divida en tres secciones el vector. poder equilibrar los subcasos. de distintas formas. Pero si implementamos el algoritmo de Prim utilizando montículos el tiempo requerido será de Θ ( a log n ) (al igual que el algoritmo de Kruskal). El algoritmo Quicksort tiene un tiempo promedio de Ο ( nlogn ) . En el algoritmo quicksort. 223). Cuestión 3. y otra para el de los mayores que p. En el caso de un grafo disperso (pocas aristas) el número de aristas tendería a n. (Respuesta en: Fundamentos de Algoritmia. Explicar cómo funciona el algoritmo que dota a un vector de la propiedad de montículo en tiempo lineal (no es necesario demostrar que ese es el coste). ¿Cuál de los dos es más eficiente para un grafo con alta densidad de aristas?. y el El algoritmo de Kruskal tiene un tiempo Θ ( a log n ) . Sin embargo.. aunque seleccionemos la mediana del vector en el peor caso (todos los elementos a ordenar son iguales) el orden será cuadrático. ¿qué implicaciones tiene para la eficiencia el escoger como pivote la mediana exacta del vector?. de modo que dado un pivote p una parte conste de elementos menores que él.. otra de elementos iguales y finalmente otra parte con los más grandes que p. En la práctica es más rápido que la ordenación por montículo (heapsort) y la ordenación por fusión (mergesort) en un tiempo constante. con lo que el tiempo pasaría a Θ ( n 2logn ) . una para con el sub-vector de elementos menores que p. Esta modificación consigue que.N]) Para i ← ⎢ n/2 ⎥ bajando hasta 1 hacer ⎣ ⎦ hundir(V. el árbol de expansión mínimo de un grafo. 190) El algoritmo que convierte un vector en un montículo en tiempo lineal es: Proc CrearMontículo (V[1. (Respuesta en: Fundamentos de Algoritmia. Pero el coste que implica esta modificación hace que el tiempo constante crezca haciendo mejor el algoritmo de ordenación por montículo que el Quicksort en todos los casos.i) Fin_proc Proc Hundir(V[1. 266). alta el número de aristas a tiende a ser n(n-1)/2. Septiembre 2000 Reserva Cuestión 1. Si la densidad es algoritmo de Prim podría implementarse de forma que fuera mejor. pag. siendo a el número de aristas. Los algoritmos de Prim y Kruskal calculan. Cuestión 2. 1] . j=2 Como V[4]>V[2] k = 4 Pero NO(V[3]>V[4]) así que k=4 Intercambia V[4].7.7.V[1] V=[10.7.La idea es considerar el vector como un montículo. termina el bucle.7. observamos que el proceso es el descrito anteriormente...7.7. empezamos convirtiendo inicialmente en montículos los sub-árboles del nivel más bajo. Si dibujamos los vectores como montículos.3) k = 3.V[2] V=[4. Y así sucesivamente hasta llegar a la raíz.3.4. V=[4.7.7.3.V[2] V=[10. vamos al nivel más bajo y obtenemos los montículos correspondientes.i) i = 3.1] k=2.10. Veamos su funcionamiento con un ejemplo V=[4.7. para progresivamente seguir modificando en niveles superiores sucesivos. k=5 intercambia V[5].1] k=3.10.1] k=5 y j=5. hundir (V. i=1 hundir (V.2) k=2.1) k=1.3.3. Ejecutaríamos el algoritmo CrearMontículo Para i ← 3 hasta 1 hundir(V. j=3 NO(V[6]>V[4]) con lo que no hay cambio y termina el bucle.3. Hemos obtenido finalmente el montículo.7.4. j=2 Como V[4]>V[2] k = 4 Pero V[5]>V[2]. j = 3 no habría ningún cambio dado que V[6] < V[3] k=j fin del bucle i=2 hundir (V.1] con n=6 Si consideramos este vector cómo un montículo tendremos.10. j=1 Resulta que V[2]>V[1] k=2 Y NO (V[3] > V[2]) Intercambia V[2]. Explica los cambios que hay que hacer al anterior algoritmo. (2 puntos). 3. por este orden: 1. Se quieren encontrar los m mayores elementos del vector y se supone que n >>m. Un vector T contiene n elementos. Elección razonada del esquema algorítmico. Descripción del esquema usado e identificación con el problema. Cuestión 2.5.6. Suponemos que para el juego del ajedrez hemos programado una función estática perfecta de evaluación eval(u) para cada situación de juego u. 2. compleciones(u) que devuelve la lista de las jugadas legales a partir de la posición del tablero u. PROBLEMA (5 puntos).UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Febrero 2001 – Primera semana Cuestión 1. 5. Algoritmo completo a partir del refinamiento del esquema general. Según el esquema elegido hay que especificar. Explica. (1 punto). ¿Qué pasa si (como ocurre en la realidad) la función eval(u) no existe?¿Qué papel desempeña entonces la estrategia MINIMAX? Cuestión 3. se encuentran 3 alumnos y 3 profesores del tribunal de la UNED que deben cruzar el río para ir juntos al Centro Asociado. Describe una forma eficiente de hacer esto sin ordenar el vector y calcula qué coste tiene. 4.2] se pide insertar el valor 6 describiendo toda la secuencia de cambios en el mismo. . Estructuras de datos. incluyendo pseudocódigo si es preciso.2. La resolución del problema debe incluir. A orillas del río Guadalhorce. Divide y vencerás: preorden bien fundado. Se dispone de una pequeña canoa de 2 plazas.3. además: Voraz: demostración de optimalidad.3. Se supone conocida otra función. Exploración en grafos: descripción del árbol de búsqueda asociado. como programar un algoritmo que juegue al ajedrez. Dado el siguiente montículo: [10. Diseñar ahora el algoritmo para que calcule la solución con menor número de movimientos. (2 puntos). En ningún momento puede haber grupos en las orillas donde el número de alumnos supere al de los profesores. Diseñar un algoritmo que encuentre una solución al problema de cruzar el río considerando las siguientes restricciones: • • La canoa no puede viajar sola. Estudio del coste. . n+1) Fproc Proc Flotar(T[1. Suponemos que para el juego del ajedrez hemos programado una función estática perfecta de evaluación eval(u) para cada situación de juego u.355) Gracias a la información perfecta suministrada por la función eval(u) podremos saber en cada momento cuál es la mejor jugada posible.8). El valor de k queda actualizado a 4.n]. incluyendo pseudocódigo si es preciso.2.5. Se compara T[8] con su padre. considerando que si para las blancas será la mejor jugada la marcada como mayor valor de eval(u).v) T[n+1] ← v Flotar(T[1. ya que eval(u) nos asegura que nuestro movimiento es el más acertado.8]. pag.6. Sin embargo no existe una función eval(u) perfecta en el caso del ajedrez.2.n]. las negras ejecutarán aquella que minimice dicho valor. sin importarnos qué decisión puedan tomar las negras tras nuestro movimiento.. Y es aquí donde entra la estrategia MINIMAX.2. minimizar el valor de eval(u) paras las negras y maximizarlo paras las blancas..2.Dado el siguiente montículo [10. . tomaríamos como mejor movimiento el que maximice el valor de eval(u) (suponiendo que eval(u) nos devuelve el valor más grande cuanto mejor sea la jugada para las blancas). El algoritmo de inserción es el siguiente: Proc añadir . Cuestión 2. tomaremos al anterior criterio... luego termina el bucle. eval(u) no nos confirma que el mejor movimiento considerado por ella sea en realidad el más adecuado.3. Veamos como iría cambiando: Se llamaría a flotar (T[1.2.3. Se supone conocida otra función.6..6.5. como programar un algoritmo que juegue al ajedrez.5]. ¿Qué pasa si (como ocurre en la realidad) la función eval(u) no existe?¿Qué papel desempeña entonces la estrategia MINIMAX? (Respuesta: Fundamentos de Algoritmia.6..nodo (T[1.5. En este caso.3.2.3.3.RESPUESTAS EXAMEN Programación III.3. que viene dado por T[8/2]=4. dado el montículo [10.6.3. compleciones (u) que devuelve la lista de las jugadas legales a partir de la posición del tablero u.n+1]. Febrero 2001 (Primera Semana) Cuestión 1. como son iguales no se hace nada y j queda igual que k. De este modo si queremos anticipar un número determinado de jugadas.2].3.. como es mayor se intercambiaría resultando [10. deberemos entonces buscar una función eval aproximada con una relación coste/precisión lo mejor posible..6] y procedemos a comparar y subir T[n+1] para cada sub-árbol hasta no tener que hacer ningún cambio. Explica.i) k ←i Repetir j←k Si j > 1 y T[j/2] < T[k] entonces k ← j/2 Intercambiar T[j] y T[k] Hasta j = k Fproc De este modo.2] se pide insertar el valor 6 describiendo toda la secuencia de cambios en el mismo. Se vuelven a comparar T[4] y T[2]. De este modo si jugaran por ejemplo las blancas dado un estado u. añadimos 6 al final [10. que posteriormente se fusionará con los encontrados en las distintas llamadas. pero en este caso iremos generando un sub-vector con aquellos elementos mayores que m. Un vector T contiene n elementos. Igualmente podemos utilizar otro algoritmo de Ordenación pero sin ordenar el vector. cada vez que encontremos un elemento menor que m lo almacenaremos en un vector resultado. hasta llegar a un tamaño base adecuado (lo suficientemente pequeño) para aplicar en el la búsqueda de todo elemento menor que m. Podemos utilizar un enfoque similar a como hacemos en la ordenación por fusión. Dividimos por tanto el vector original de forma equilibrada y progresivamente. . por ejemplo. si no almacenar en otro vector los índices en el orden correspondiente. Se quieren encontrar los m mayores elementos del vector y se supone que n >>m.Cuestión 3. Describe una forma eficiente de hacer esto sin ordenar el vector y calcula qué coste tiene. 5. 3.. Ordenar el vector mediante este algoritmo detallando cada uno de los pasos. además: Voraz: demostración de optimalidad.n] programar completamente en pseudocódigo una función recursiva flotar(T. (2 puntos). Algoritmo completo a partir del refinamiento del esquema general. Exploración en grafos: descripción del árbol de búsqueda asociado. PROBLEMA (5 puntos). Se tiene que organizar un torneo con n participantes (con n potencia de 2). 4. Y finalmente Día 3: af. bd y ce. be y cf. (2 puntos). 2. Mostrar mediante un ejemplo que el algoritmo de Dijkstra no siempre encuentra el camino mínimo si existe una distancia negativa. (1 punto). Día 2: ae.c} contra {d. Según el esquema elegido hay que especificar.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Febrero 2001 – Segunda semana Cuestión 1. Poner un ejemplo de un vector de 10 elementos que suponga un ejemplo de caso peor para el algoritmo de ordenación Quicksort. Estructuras de datos. Cada participante tiene que competir exactamente una vez con todos los posibles oponentes.i) para flotar el elemento de la posición i del vector T. Sugerencia: dos grupos disjuntos de m jugadores pueden jugar entre ellos en m días mediante rotación. por este orden: 1. Dado un montículo T[1. La resolución del problema debe incluir. Ejemplo: {a.f} juegan: Día 1: ad. Cuestión 3. bf. y cd. Explica como usar esta función para insertar un elemento en el montículo. Descripción del esquema usado e identificación con el problema. Divide y vencerás: preorden bien fundado. Estudio del coste.e. Además cada participante tiene que jugar exactamente 1 partido al día.b. . Cuestión 2. Elección razonada del esquema algorítmico. Se pide construir un algoritmo que permita establecer al calendario del campeonato para que concluya en n-1 días.. . 2. Tenemos para cada paso y tras la inicialización.n] Matriz D[2...4. Febrero 2001 (Segunda Semana) Cuestión 1.n} Para i ← 2 hasta n hacer D[i] ← L[1.4.w]) Finpara FinRepite Finpara FFunción Observando el grafo apreciamos los caminos más cortos desde 1 a cualquier nodo son: 1-2 con coste 2.3.3} {1. . Distancias desde 1 Nodo Precedente Nodo Seleccionado Nodo No Seleccionado Paso Inicializa 1 2 3 4 2 2 2 2 2 2 3 4 4 4 4 4 4 ∞ 3 3 3 3 5 ∞ ∞ ∞ 9 9 6 ∞ ∞ ∞ ∞ 0 2 1 1 1 1 1 3 1 1 1 1 1 4 1 2 2 2 6 5 1 1 1 3 3 6 1 1 1 1 5 {1} {1.6} {5..4} {1.... 1-3-5-6 con coste 0 y 1-3-5-6-4 con coste 1. porque una vez que se añade el nodo al conjunto S establece el camino mínimo y ya no puede modificarse como ocurre aquí.3.RESPUESTAS EXAMEN Programación III.2..1.2.5.5} {2.i] Finpara {Bucle voraz} Repetir n . 224) El algoritmo de Dijkstra nos devuelve los caminos mínimos desde el origen...2 veces v ← algún elemento de C que minimiza D[v] C ← C \ {v} Para cada w ∈ C hacer D[w] ← min (D[w].. (Respuesta: Fundamentos de Algoritmia pag.6} {3. con lo que los caminos serían 1-2 (coste 2).4.2} {1.Mostrar mediante un ejemplo que el algoritmo de Dijkstra no siempre encuentra el camino mínimo si existe una distancia negativa..4..n.5.n] {Inicialización} C ← {2. 1-3-5(coste 9) y 1-3-5-6 (coste 0). 1-3 (coste 4).n]) : matriz [2. veremos si el algoritmo de Dijkstra nos devuelve esta solución. D[v] + L[v.. y su pseudo código es: Probaremos este algoritmo para el siguiente grafo: F Dijkstra (L[1.6} {6} Observamos como la solución devuelta no es la correcta ya que los costes no son los mínimos. 1-3 con coste 4. 1-2-4 (coste 3) aquí está el fallo.6} {3. 1-3-5 con coste 9.5.3. Poner un ejemplo de un vector de 10 elementos que suponga un ejemplo de caso peor para el algoritmo de ordenación Quicksort. se mueve k hasta 2. k=1.5. Llamamos al resto del vector.2..0]).10])..6.. Ignoramos la primera llamada al ser de un tamaño 0.. como L apunta a 1. A continuación se llamaría a: Quicksort(T[1.6. {1..3.10]). (Respuesta Fundamentos de Algoritmia.9. una de ellas para un caso de tamaño 0: Quicksort(T[2..L .2..7.8...10} Pivote(T[1..1]) Quicksort(T[L +1.5. la segunda llamada tendría el mismo efecto que la primera vez..Cuestión 2.7. L llega hasta 1.L) Quicksort (T[i..1]). Como vemos el proceso se repite hasta llegar al último elemento..j]) Si j . produciéndose tantas llamadas como elementos posee el vector.10} El algoritmo Quicksort es. no existe por tanto intercambio alguno. ya que es el único elemento tq T[L]<=p Llegamos al 3er bucle k=2 y L=1 (k>L). Ordenar el vector mediante este algoritmo detallando cada uno de los pasos.. L=11 1.j] ) Sino Pivote (T[i. primer bucle. Proc pivote(T[i.9.j]. L) Luego i=1 y j=10 p=1. segundo bucle..10].. j]) Fsi Fin_proc T[1. L ← j +1 repetir k ← k +1 hasta que T[k] > p o k >= j fin_repite repetir L ← L − 1 hasta que T[L] <= p fin_repite mientras k < L hacer Intercambiar T[k] y T[L] repetir k ← k +1 hasta que T[k] > p fin_repite repetir L ← L+1 hasta que T[L] <= p fin_repite fmientras intercambiar T[i] y T[L] Fin_proc Proc quicksort(T[i... Quicksort (T[2. y vuelve a hacerse una tercera llamada a Quicksort. ya que T[2]>p 2. en este caso en el procedimiento pivote L descendería hasta llegar al T[2].4. pag 261) Tomaremos un vector con 10 elementos ya ordenados como peor caso.i es suficientemente pequeño entonces insertar (T[i.3. excepto la última instrucción Intercambiar T[i] por T[L]. . e i es uno T[L] queda igual.4..10]={1. no se provoca cambio alguno. Quicksort(T[3..j].. y k quedaría en el tercer elemento.. Llamada a un caso de tamaño cero. y otra para el resto del vector.var L ) p ← T[i] k ← i .8. Flotar ( i_padre. 188) Tomar el algoritmo iterativo de la pag 188 y transformar en recursivo. pag.Cuestión 3. 2. Elección razonada del esquema algorítmico. i ) crear_monticulo (T.i ) si i > n devuelve (T ) sino flotar (T . Proc Flotar ( i. Estructuras de datos.. Fundamentos de Algoritmia. Si ( i > 1) y T [i ] > T [i_padre ] entonces Intercambiar (T [i ] . T [i_padre ]) . Además cada participante tiene que jugar exactamente 1 partido al día. 2 ) .. La resolución del problema debe incluir. PROBLEMA (5 puntos). Descripción del esquema usado e identificación con el problema. Cada participante tiene que competir exactamente una vez con todos los posibles oponentes. Estudio del coste.n] programar completamente en pseudocódigo una función recursiva flotar(T. Exploración en grafos: descripción del árbol de búsqueda asociado. por este orden: 1. Explica como usar esta función para insertar un elemento en el montículo. i_padre := i div 2. Se pide construir un algoritmo que permita establecer al calendario del campeonato para que concluya en n-1 días.n ] . fFlotar. be y cf.n ] . Ejemplo: {a. Sugerencia: dos grupos disjuntos de m jugadores pueden jugar entre ellos en m días mediante rotación.. bd y ce. Según el esquema elegido hay que especificar.i +1) fsi fproc La llamada inicial será crear _ monticulo (T .n+1) .v ) T [ n+1] ← v. Y finalmente Día 3: af. Flotar (T [1.T ) . . Otra versión pero en este caso sin usar funciones auxiliares es sustituir el código de flotar por su versión iterativa e insertarlo en la función anterior.e. Se tiene que organizar un torneo con n participantes (con n potencia de 2)... Dado un montículo T[1. 3. Divide y vencerás: preorden bien fundado.n+1] . y cd.c} contra {d. bf. Día 2: ae...f} juegan: Día 1: ad. 4.b.i) para flotar el elemento de la posición i del vector T.n ]) . T [1. 5. Para insertar un elemento en el montículo utilizo: Proc añadir_nodo (T [1. además: Voraz: demostración de optimalidad. Algoritmo completo a partir del refinamiento del esquema general. (Respuesta. FProc. Proc crear_monticulo (T [1. . Convocatoria de Septiembre de 2001 Original Cuestion 1 (2 punto). Explica en que consiste un problema de plani cacion con plazo jo. por este orden: Eleccion razonada del esquema algor tmico. Cuestion 3 (1 punto). . Para ilustrar el enunciado supongamos un tablero de 4 las y 5 columnas con 4 s mbolos o. Detalla cada paso. Explica porque una estructura de mont culo suele ser adecuada el algoritmo de Kruskal. Pon un ejemplo con n = 4 y resuelvelo aplicando el algoritmo voraz correspondiente. los huecos dejados por esta se rellenan deslizando hacia la base los s mbolos de su columna que queden por encima del hueco dejado por los s mbolos eliminados. para representar el conjunto de candidatos en un algoritmo voraz. Algoritmo completo a partir del re namiento del esquema general. La resolucion de cada problema debe incluir. Estructuras de datos requeridas. ademas: Voraz: demostracion de optimalidad. de n las y m columnas con n m casillas y suponemos que el tablero descansa sobre uno de sus lados de tama~o m al que denominaremos base. Se plantea el siguiente juego: Tenemos un rectangulo (tablero) Se pide programar un algoritmo que resuelva el juego. Breve descripcion del esquema usado e identi cacion con el problema. El objetivo del juego es el de dejar el tablero vac o. Al comienzo del juego el usuario comienza con un tablero lleno de s mbolos. Segun el esquema elegido hay que especi car.*. Explicar ademas (si las hay) las diferencias que habr a que introducir a este algoritmo si se exigiera resolver el juego en el menor numero de movimientos. En cada movimiento el jugador elige un s mbolo del tablero y este es eliminado del mismo junto con (si las hay) las agrupaciones adyacentes (en horizontal o vertical) de su mismo s mbolo siempre que mantengan la continuidad. Divide y venceras: preorden bien fundado entre los ejemplares del problema.representa una casilla vac a. y donde cada casilla puede contener n s mbolos de k tipos diferentes. Estudio del coste. Halla el grafo de expansion m nimo del grafo de la gura mediante Cuestion 2 (1 punto). Exploracion en grafos: descripcion del grafo de busqueda asociado. Una secuencia de juego ser a la siguiente: oox+x o++x+ o**ox oo*xx --x+x --+x+ -+*ox -**xx ---+x ---x+ --xox -++xx -------+--xxx -++o+ -----------+-++o+ -----------+---o+ --------------++----------------- Problema 2 (5 puntos).+.x y donde . Una vez eliminada la agrupacion.Escuela Tecnica Superior de Ingenieros Informaticos de la UNED Ingenier a Tecnica de Sistemas e Ingenier a Tecnica de Gestion Programacion III . . 1 el tiempo corresponde a Θ(a log n) . Cada tarea nos producirá un beneficio mayor que cero. Cuestión 2. En un algoritmo voraz iremos eligiendo el candidato más apropiado a cada paso para la hallar la solución según el valor de una función de selección. ahorrando así tiempo en el bucle más interno del algoritmo. Explica en que consiste un problema de planificación con plazo fijo. siendo la inicialización del montículo Θ ( n ) . podemos ejecutar únicamente una tarea. 240. de forma que el valor considerado para su mantenimiento sea el valor de dicha función de selección. Septiembre 2001 (Original) Cuestión 1. como se ve la solución bastaría con eliminar las tareas 5 y 6 y el resultado sería igual con lo que ya tenemos un ejemplo con n=4 i beneficio tiempo 1 20 3 2 15 1 3 10 1 4 7 3 Observar que tenemos las tareas ya ordenadas según su beneficio de mayor a menor.RESPUESTAS EXAMEN Programación III. es decir. (Respuesta: Fundamentos de Algoritmia pag. cada una de las cuales requiere un tiempo unitario. situándose en O(log n) . (Respuesta.. resulta apropiado utilizar en vez de una matriz de adyacencia. Si el grafo es denso será preferible la implementación con matrices. Pon un ejemplo con n=4 y resuélvelo aplicando el algoritmo correspondiente.. en cualquier instante T=1. Pag 227) Utilizando una matriz de adyacencia y matrices para representar los datos el algoritmo se sitúan en Ο ( n 2 ) (con un tiempo Ο ( n ) para inicializar la matriz de adyacencia y un tiempo Θ ( n 2 ) en los bucles que conforman el algoritmo voraz). Cuestión 3. (Bastaría con aplicar el algoritmo que aparece en la pag.. Explica porqué una estructura de montículo suele ser adecuada para representar el conjunto de candidatos de un algoritmo voraz. De este modo la elección de candidato consistirá en ir escogiendo la cima de dicho montículo y actualizar este cuando así proceda. Si se produce la eliminación de la raíz del montículo n-2 veces (el bucle se ejecuta n-2 veces) y hay que flotar un máximo de a nodos (siendo a el número de aristas) obtenemos un tiempo total de Θ((a + n) log n) .. ilustrado con un ejemplo para seis tareas. si no fuera así para utilizar el algoritmo convendría proceder a esta ordenación) . Para agilizar esa elección podemos tener dichos candidatos almacenados en un montículo. Si resulta que el número de aristas a es mayor que el número de nodos al cuadrado. sólo en el caso en el que su ejecución sea en un instante anterior a di.2. si el grafo es disperso es mejor la implementación con montículos. operaciones estas que resultan más eficientes en los montículos que en otros tipos de estructura de datos. n 2 . Si el grafo es conexo.Comenta de qué formas se puede mejorar la eficiencia del algoritmo de Dijkstra mediante el uso de estructuras de datos apropiadas. una lista de adyacencia. Habrá que buscar la secuencia de tareas más apropiada de manera que el beneficio obtenido sea mayor.233) Un problema de planificación con plazo fijo consiste en: Dado un conjunto de n tareas. a >= n . Igualmente las operaciones empleadas en el bucle más interno del algoritmo reducirán su coste (al ser D un montículo). Fundamentos de Algoritmia. evitando examinar entradas innecesarias -dónde no existe arista. Por otro lado podemos utilizar un montículo invertido para representar el camino mínimo que se irá generando (que llamaremos D). esto hace que buscar un nodo que minimice el costo requiera sólo eliminar la raíz del montículo lo que conlleva un gasto de O(log n) . . . Según el esquema elegido hay que especificar.n] (Se supone que salvo por T[i]. el vector T posee la propiedad del montículo). La resolución del problema debe incluir. Algoritmo completo a partir del refinamiento del esquema general.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Septiembre 2001 Reserva Cuestión 1. 5. (Respuesta Fundamentos de Algoritmia. además: Voraz: demostración de optimalidad. En los algoritmos de vuelta atrás explica la diferencia entre una condición de poda y una condición de retroceso. Divide y vencerás: preorden bien fundado. Descripción del esquema usado e identificación con el problema. 2.. pag 188) Cuestión 3.Compara la eficiencia de los algoritmos de ordenación Quicksort y Mergesort. Exploración en grafos: descripción del árbol de búsqueda asociado. 4. por este orden: 1. Cuestión 2. Estudio del coste. 3. Elección razonada del esquema algorítmico. Programa un algoritmo recursivo para implementar la operación de hundir un elemento i en un montículo representado por el vector T[1. Estructuras de datos. . . n ] .. . sólo comprobación de que las soluciones parciales son k-prometedoras antes de continuar la exploración del grafo.. Programa un algoritmo recursivo para implementar la operación de hundir un elemento i en un montículo representado por el vector T[1.. Además el algoritmo Mergesort requiere de un espacio extra para tratar los distintos casos sin perder eficiencia (hacer la ordenación in situ lleva asociado un incremento de la constante oculta bastante alto). pag 188) Proc crear_monticulo (V [1. si el recorrido del árbol no tiene éxito porque la solución parcial hasta ese momento no puede ser completada se produce un retroceso. el vector T posee la propiedad del montículo).n]. var aux.Compara la eficiencia de los algoritmos de ordenación Quicksort y Mergesort. en la práctica Quicksort es más rápido en un tiempo c constante. El algoritmo por fusión Mergesort utiliza un tiempo de nlogn (siempre observando la precaución de equilibrar los subcasos a tratar).. Pese a esto.k). igualmente si ya existiera una solución mejor a la que está siendo actualmente calculado volveríamos atrás.i ) si i < 1 devuelve (V ) sino hundir ( i. aux := V[j]. En los algoritmos de vuelta atrás explica la diferencia entre una condición de poda y una condición de retroceso.v) T[n+1] ← v Flotar(T[1. En vuelta atrás no hay condición de poda..n] (Se supone que salvo por T[i]. dado un determinado problema intentamos encontrar información que nos permita decidir detener la búsqueda (volviendo consecuentemente atrás) si hay claros indicios de que el estado actual no nos conducirá a una solución. Lourdes Araujo. Si queremos limitar más aún nuestro espacio de búsqueda podemos utilizar condiciones de poda.V ) crear_monticulo (V. V[1. El algoritmo Quicksort emplea un tiempo promedio de nlogn. V[j] := V[k]. V ) Fin_proc Proc añadir . Cuestión 3. Septiembre 2001 (Reserva) Cuestión 1.nodo (T[1. V[k] := aux..n]) k ←i Si 2i ≤ n y V[2i] > V[k] entonces k ← 2i fsi Si 2i ≤ n y V[2i +1] > V[k] entonces k ← 2i + 1 fsi Si k > i entonces Intercambiar (V[i] y V[k] ) hundir ( k . El algoritmo de vuelta atrás básico consiste en una búsqueda exhaustiva en el árbol.RESPUESTAS EXAMEN Programación III.. en el peor caso de n2. Cuestión 2.i − 1) fsi fproc Proc Hundir(i. (Respuesta Fundamentos de Algoritmia.n+1) Fproc Proc Intercambiar(int j. Fproc Intercambiar.n+1]... . . (Resuelto Universidad de Málaga pag 121. 2. por este orden: 1.5 puntos). Según el esquema elegido hay que especificar.5 puntos).UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Febrero 2002 – Primera semana Cuestión 1 (2 puntos). Exploración en grafos: descripción del árbol de búsqueda asociado. 4.5 puntos). Programar en pseudocódigo un algoritmo que decida si una caja es “aburrida” y devuelva (en su caso) el tipo de bombón que le confirme dicha propiedad. Elección razonada del esquema algorítmico mas eficiente para resolver el problema (0. Describir la estrategia de selección voraz para el problema de la planificación con un plazo fijo. Una caja con n bombones se considera “aburrida” si se repite un mismo tipo de bombón (denominado bombón pesado) más de n/2 veces. Estructuras de datos (0. y EDMA 331). Demuestra que el problema se puede resolver con el esquema elegido (0. Cuestión 3 (2 puntos). Aplicarla a la resolución del siguiente ejemplo detallado cada paso: Tarea i Instante di Beneficios gi 1 4 10 2 3 30 3 1 20 4 1 30 5 2 50 6 2 20 Cuestión 2 (1 puntos). El coste debe ser a lo sumo O(n log n).5 puntos). Divide y vencerás: preorden bien fundado. Problema (5 puntos). 3. Programar en pseudocódigo un algoritmo recursivo para la operación de hundir un elemento en un montículo. Algoritmo completo a partir del refinamiento del esquema general (1. NOTA: Si una caja tiene un bombón pesado. La resolución del problema debe incluir. Estudio del coste (1 punto). 5. Explica la diferencia entre una condición de poda y una condición de retroceso en el esquema de búsqueda vuelta atrás. entonces necesariamente también lo es al menos una de sus mitades. además: Voraz: demostración de optimalidad. . Aplicarla a la resolución del siguiente ejemplo detallado cada paso: Tarea i Instante di Beneficios gi 1 4 10 2 3 30 3 1 20 4 1 30 5 2 50 6 2 20 Lo primero lo ordeno en función de los costes de forma decreciente. Febrero 2002 (Primera Semana) Cuestión 1 (2 puntos). si el recorrido del árbol no tiene éxito porque la solución parcial hasta ese momento no puede ser completada se produce un retroceso. Si queremos limitar más aún nuestro espacio de búsqueda podemos utilizar condiciones de poda. Explica la diferencia entre una condición de poda y una condición de retroceso en el esquema de búsqueda vuelta atrás. El algoritmo de vuelta atrás básico consiste en una búsqueda exhaustiva en el árbol. Con un valor de 120. 4 ) = 4 Aplico el algoritmo y calculo p = min ( 6. Describir la estrategia de selección voraz para el problema de la planificación con un plazo fijo. Cuestión 2 (1 puntos).5.RESPUESTAS EXAMEN Programación III. dado un determinado problema intentamos encontrar información que nos permita decidir deterger la búsqueda (volviendo consecuentemente atrás) si hay claros indicios de que el estado actual no nos conducirá a una solución. . Tarea i Instante di Beneficios gi 5 2 50 2 3 30 4 1 30 3 1 20 6 2 20 1 4 10 p = min ( 6. igualmente si ya existiera una solución mejor a la que está siendo actualmente calculado volveríamos atrás.1.2. max ( d i ) ) → Para d1 = 2 Se asigna la Tarea 5 en la posición 2 Para d2 = 3 Se asigna la Tarea 2 en la posición 3 Para d3 = 1 Se asigna la Tarea 4 en la posición 1 Para d4 =1 No hay posiciones Libres Para d5 = 2 No hay posiciones Libres Para d6 = 4 Se asigna la Tarea 1 en la posición 4 4 4 5 5 5 5 2 2 2 1 La secuencia óptima es 4. n]) k ←i Si 2i ≤ n y V[2i] > V[k] entonces k ← 2i fsi Si 2i ≤ n y V[2i +1] > V[k] entonces k ← 2i + 1 fsi Si k > i entonces Intercambiar (V[i] y V[k] ) hundir ( k .. Proc Hundir(i. (Resuelto Universidad de Málaga pag 121. NOTA: Si una caja tiene un bombón pesado.. y EDMA 331). V[j] := V[k]. . var aux. El algoritmo que busca el mayoritario de V [ c. El coste debe ser a lo sumo O(n log n). podemos mirar de forma recursiva si existe un elemento mayoritario en cada una de las dos mitades del vector y si aparece en más de la mitad de las posiciones. Problema (5 puntos). Utilizando esta idea. como nos piden que el coste sea logarítmico y el problema se puede dividir en subproblemas más pequeños utilizaré el esquema de divide y vencerás. Fproc Intercambiar. sk) fsi ffunción Si el vector tiene un elemento mayoritario.k). 1.Cuestión 3 (2 puntos). aux := V[j]. Programar en pseudocódigo un algoritmo que decida si una caja es “aburrida” y devuelva (en su caso) el tipo de bombón que le confirme dicha propiedad. Elección razonada del esquema algorítmico No es un problema de optimización. entonces necesariamente también lo es al menos una de sus mitades. f ] es el siguiente: .. Una caja con n bombones se considera “aburrida” si se repite un mismo tipo de bombón (denominado bombón pesado) más de n/2 veces. V[1. función divide y vencerás (problema) si suficientemente simple (problema) entonces devolver solución simple (problema) sino hacer {p1 … pk} ← descomponer (problema) para cada pi hacer si ← divide_y_vencerás (pi) fpara devolver combinación (s1.. V[k] := aux. será el elemento mayoritario buscado. Programar en pseudocódigo un algoritmo recursivo para la operación de hundir un elemento en un montículo. ESQUEMA GENÉRICO.. por lo tanto descarto el esquema voraz y ramificación y poda. V ) Fin_proc Proc Intercambiar(int j. este tiene que ser mayoritario en al menos una de las mitades del vector.. f : nat ) dev existe : bool. k=1.V [ c ] sino m := ( c + f ) div2 existe1 . si a = b k ⎪ log a . si a > b k ⎪Θ n b ⎩ ( ) Tenemos a=2. T ( n ) ∈ Θ ( n log n ) . mayor := comprobar (V. si a < b k ⎪ ⎪ T ( n ) ∈ ⎨Θ ( n k log n ) .mayor1 fsi si ¬existe ∧ existe2 entonces {comprobamos el segundo candidato} existe.fun mayoritario (V [1.m+1.. f ) existe := falso si existe1 entonces {comprobamos el primer candidato} existe. x : elemento. mayor1 := mayoritario (V.mayor2 . f ) . c. c.n ] de elemento. mayor : elemento si c = f entonces existe. si n ≥ b ⎩ ⎧Θ ( n k ) ..c +1) div2 ffun Para calcular el coste podemos utilizar la siguiente recurrencia: ⎧cn k .mayor1 . si 1 ≤ n < b ⎪ T (n) = ⎨ k ⎪aT ( n / b ) + cn . mayor2 := mayoritario (V. mayor := cierto. f ) .mayor2 fsi fsi ffun fun comprobar (V [1.c. b=2.m ) existe2 . mayor := comprobar (V.n ] de elemento. f : nat ) dev valido : bool veces := 0 para i = c hasta f hacer si V [i ] = x entonces veces := veces +1 fsi fpara valido := veces > ( f .c.c. . 8]. o o 3. o • Divide y vencer´s: preorden bien fundado.3. En cada paso la unica ´ operaci´n posible es intercambiar dos fichas adyacentes. las casillas est´n ocupadas por o a cuatro O y cuatro X distribuidas de forma aleatoria. En la situaci´n inicial.002 .4. Suponer que los conjuntos no pueden tener elementos repetidos. Problema (5 puntos). X O X X O O O X La resoluci´n del problema debe incluir.´ Escuela Universitaria de Informatica de la UNED ´ Ingenier´ Tecnica de Sistemas e Ingenier´ Tecnica de Gestion ıa ´ ıa ´ Programaci´n III .2. Un algoritmo de coste O(n2 ) tarda 15 segundos o en realizar un determinado procesamiento sobre un ordenador a 450 MHz. por este orden: o 1. Elecci´n razonada del esquema algor´ o ıtmico. Algoritmo completo a partir del refinamiento del esquema general. Escribe la secuencia completa de pasos para oro denar por fusi´n el vector [3. 2. o Cuesti´n 2 (1 punto). adem´s: u a • Voraz: demostraci´n de optimalidad.Febrero 2.Segunda Semana o Cuesti´n 1 (1 puntos). Programar de la o forma m´s eficiente posible el algoritmo que devuelva la secuencia de pasos a m´s corta para ordenar el tablero de forma que todas las fichas tengan al a menos otra igual adyacente. Estructuras de datos.7. Se dispone de un tablero de 8 casillas similar al que muestra la figura.5. o o a u . ¿Cu´nto tiempo se tarda en realizar el mismo procesamiento con el mismo a algoritmo sobre una m´quina 3 veces m´s lenta? a a Cuesti´n 3 (3 puntos). Descripci´n del esquema usado e identificaci´n con el problema.9. Programar en pseudoc´digo todos los proceo o dimientos necesarios para fusionar dos conjuntos implementados con mont´ ıculos. Seg´n el esquema elegido hay que especificar. 4. 5. Estudio del coste. a • Exploraci´n en grafos: descripci´n del ´rbol de b´squeda asociado. . ¿Cuál es el más eficiente en términos de coste asintótico temporal en el caso peor?. 5.10 - 1 2 3 4 5 Tomando el nodo 1 como nodo origen. ¿Cuáles son las mejores y peores disposiciones iniciales de los ejemplos que hay que ordenar en cuanto al tiempo de ejecución? Razonar la respuesta y poner ejemplos. En el algoritmo de ordenación por montículo (heapsort). Cuestión 2 (2 puntos). Exploración en grafos: descripción del árbol de búsqueda asociado. Escribir un algoritmo que descubra cómo encontrar el camino más corto desde la entrada hasta la salida de un laberinto (suponer que hay sólo una entrada y sólo una salida) La resolución del problema debe incluir. Aplicar el algoritmo de Dijkstra al grafo dirigido representado por la siguiente matriz adyacencia. 2. . además: Voraz: demostración de optimalidad. Algoritmo completo a partir del refinamiento del esquema general.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Septiembre 2002 – Original Cuestión 1 (2 puntos). Divide y vencerás: preorden bien fundado. PROBLEMA (5 puntos). Estructuras de datos. Razonar la respuesta. Según el esquema elegido hay que especificar. Estudio del coste. Descripción del esquema usado e identificación con el problema. 3.-30 20 . De los algoritmos de ordenación que has estudiado. 1 2 3 4 5 50 30 100 10 5 . por este orden: 1. ¿Encuentra los caminos mínimos? Si la respuesta es negativa ¿Cuáles serian los caminos mínimos y porque no los encuentra el algoritmo de Dijkstra? ¿Qué pasaría si se invierte el sentido de la arista que une el nodo 3 con el 2?. 4. Cuestión 3 (1 punto). Elección razonada del esquema algorítmico. . Se supone que una vez que se añade un nodo al conjunto S no se puede modificar la distancia.4} {2.4} {1.RESPUESTAS EXAMEN Programación III. Cuestión 2 (2 puntos).4.3.3} {2. Aplicar el algoritmo de Dijkstra al grafo dirigido representado por la siguiente matriz adyacencia. Razonar la respuesta. Quicksort: Mergesort: Montículo: .3} {2} 2 50 50 40 20 3 4 5 30 100 10 30 20 10 30 20 10 30 0 10 2 1 1 4 4 3 1 1 1 1 4 1 5 5 3 5 1 1 1 1 El fallo está en el camino 1-5-4 que tiene como resultado 20. ¿Cuál es el más eficiente en términos de coste asintótico temporal en el caso peor?.3. En el algoritmo de ordenación por montículo (heapsort). Distancias desde 1 Nodo Precedente PASO INICIO Nodo Seleccionado Conjunto S Nodo No Seleccionado Conjunto C 1 2 3 {1} {1.5} {2. pero resulta no ser un camino mínimo al haber el camino 1-3-4 de valor 0. De los algoritmos de ordenación que has estudiado.5} {1. Septiembre 2002(Original) Cuestión 1 (2 puntos). 10 1 1 2 3 4 5 2 3 4 5 50 30 100 10 5 20 -30 10 5 100 10 4 20 5 -30 3 1 50 30 2 Tomando el nodo 1 como nodo origen. ¿Cuáles son las mejores y peores disposiciones iniciales de los ejemplos que hay que ordenar en cuanto al tiempo de ejecución? Razonar la respuesta y poner ejemplos.5. Cuestión 3 (1 punto). ¿Encuentra los caminos mínimos? Si la respuesta es negativa ¿Cuáles serian los caminos mínimos y porque no los encuentra el algoritmo de Dijkstra? ¿Qué pasaría si se invierte el sentido de la arista que une el nodo 3 con el 2?.4.5. . . . j : enteros.3..3. Estudio del coste. valorándose especialmente que sea con un coste más eficiente que Ο ( n 2 ) . Ordenar ascendentemente mediante el algoritmo de Quicksort el vector V = [2.2. Dado un vector T [1.i ] . La resolución del problema debe incluir. Cuestión 2 (2 puntos). Divide y vencerás: preorden bien fundado.n ] que alberga un montículo en T [1. 2. 5. 4.1.4. siendo la posición i de ambos vectores la correspondiente al termino x del polinomio.n ] de enteros. en concreto hay una solución fácil de hallar con coste Ο nlog2 3 ..4. PROBLEMA (5 puntos).UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Diciembre 2002 – Original Cuestión 1 (2 puntos). si n ≤ 1 entonces terminar.8. Estructuras de datos. Se tienen dos polinomios de grado n representados por dos vectores [ 0.7. programar una función recursiva que flote el elemento i + 1 .5. Exploración en grafos: descripción del árbol de búsqueda asociado. Elección razonada del esquema algorítmico. Según el esquema elegido hay que especificar.9. por este orden: 1.. Se pide diseñar un algoritmo que multiplique ambos polinomios. sino { para i ← 1 hasta 7 hacer P ( n div 2 ) para i ← 1 hasta 4n 3 hacer j ← j + 1. ( ) . además: Voraz: demostración de optimalidad.2.6. j ← 1. siguiente algoritmo: Calcular la ecuación de recurrencia y hallar el coste del Procedimiento P(n){ var i. } } Cuestión 3 (2 puntos).4] detallando todos los pasos. Algoritmo completo a partir del refinamiento del esquema general. Descripción del esquema usado e identificación con el problema. 3. . i+1) Cuestión 2 (2 puntos). Calcular la ecuación de recurrencia y hallar el coste del siguiente algoritmo: Procedimiento P(n){ var i. si a > b k ( ) } } El primer para es: Una asignación y 7 llamadas recursivas a = 7. Flotar ( i_padre. El segundo para será: desde 1 hasta 4n3. Proc Flotar ( i. Por lo que el grado k del polinomio será 3 ( k = 3 ). Si ( i > 1) y T [i ] > T [i_padre ] entonces Intercambiar (T [i ] . j ← 1. si n ≤ 1 entonces terminar. k = 3. T [i_padre ]) . T [1. La ecuación de recurrencia quedaría: a = 7. si a < b k .i ] .n ]) . b=2 y k=3 OK . Llamada inicial (T. ⎧cn k . si n ≥ b ⎩ ⎧Θ ( n k ) ⎪ ⎪ T ( n ) ∈ ⎨Θ ( n k logn ) ⎪ log a ⎪Θ n b ⎩ . Diciembre 2002 Cuestión 1 (2 puntos).. Autor: MIGUEL RODRIGUEZ ARTACHO Θ(n 3 ) 7 veces p(n/2) y luego un proceso de coste 4n^3 a=7. ( b = 2).n ] que alberga un montículo en T [1. b = 2.. si 1 ≤ n < b ⎪ T (n) = ⎨ k ⎪aT ( n / b ) + cn . programar una función recursiva que flote el elemento i + 1 . fFlotar. El problema se llama recursivamente con ejemplares de tamaño n/2. si a = b k . j : enteros.RESPUESTAS EXAMEN Programación III... Dado un vector T [1. sino { para i ← 1 hasta 7 hacer P ( n div 2 ) para i ← 1 hasta 4n 3 hacer j ← j + 1.T ) . i_padre := i div 2. 1.2. Algoritmo completo a partir del refinamiento del esquema general. siendo la posición i de ambos vectores la correspondiente al termino x del polinomio. por este orden: 1.9.3. 3.Cuestión 3 (2 puntos).5. 2. valorándose especialmente que sea con un coste más eficiente que Ο ( n 2 ) . Estructuras de datos. Exploración en grafos: descripción del árbol de búsqueda asociado. Según el esquema elegido hay que especificar.7. Ordenar ascendentemente mediante el algoritmo de Quicksort el vector V=[2. Divide y vencerás: preorden bien fundado. Elección razonada del esquema algorítmico.4] detallando todos los pasos. ( ) La resolución del problema debe incluir. Descripción del esquema usado e identificación con el problema. en concreto hay una solución fácil de hallar con coste Ο nlog2 3 . Se tienen dos polinomios de grado n representados por dos vectores [ 0.. 4. Se pide diseñar un algoritmo que multiplique ambos polinomios. 5. Estudio del coste.8.3.6.n ] de enteros. .4.2. Pivote 2 2 2 2 2 1 1 1 1 1 1 3 3 3 3 1 2 2 2 2 2 2 8 4 4 4 4 4 2 2 2 2 2 1 1 1 1 3 3 3 2 2 2 2 9 9 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 3 3 3 2 2 2 2 2 2 2 3 4 4 4 2 2 2 2 2 2 4 4 4 4 4 6 6 6 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 4 4 4 6 6 6 6 6 6 6 6 3 3 9 9 9 9 9 9 9 7 7 7 7 7 7 7 7 7 7 7 9 8 4 8 8 8 8 8 8 8 8 8 9 PROBLEMA (5 puntos).4. además: Voraz: demostración de Optimalidad. En cada punto. 4. Teseo se adentra en el laberinto en busca de un minotauro que no sabe dónde está. 2. Algoritmo completo a partir del refinamiento del esquema general (1. 3. Según el esquema elegido hay que especificar.5 puntos). Dado el grafo de la figura. Divide y vencerás: preorden bien fundado. aplicar el algoritmo de Dijkstra para hallar los caminos más cortos desde el nodo 1 hasta cada uno de los otros nodos. nodos no seleccionados. Demuestra que el problema se puede resolver con el esquema elegido (0. Elección razonada del esquema algorítmico mas eficiente para resolver el problema (0.5 puntos). además: Voraz: demostración de optimalidad. y devuelve el mensaje original a. La función ariadna debe devolver la secuencia de casillas que componen el camino de regreso desde la casilla ocupada por el minotauro hasta la casilla (1. Distancias desde 1 PASO Nodo Seleccionado Nodo No Seleccionado 2 3 4 5 Nodo Precedente 2 3 4 5 INICIO 1 2 3 Cuestión 3 (2 puntos). la clave privada s y la clave pública z. El laberinto debe representarse como una matriz de entrada a la función cuyas casillas contienen uno de los siguientes tres valores: 0 para “camino libre”. vector de distancias y vector de nodos precedentes. por este orden: 1. . Teseo sale de la casilla (1. El mensaje original se recompone con la fórmula: Problema (5 puntos). 1 para “pared” (no se puede ocupar) y 2 para “minotauro”.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Febrero 2003 – Primera semana Cuestión 1 (2 puntos). La función desencriptar recibe tres enteros: el mensaje cifrado c. Teseo puede tomar la dirección Norte. Se trata de implementar una función ariadna que le ayude a encontrar el minotauro y a salir después del laberinto.5 puntos).1).1) y debe encontrar la casilla ocupada por el minotauro. Se desea implementar una función para desencriptar un mensaje numérico.5 puntos). Estudio del coste (1 punto). indicando en cada paso: nodos seleccionados. Exploración en grafos: descripción del árbol de búsqueda asociado. Este u Oeste siempre que no haya una pared. La resolución del problema debe incluir. 5. ¿Para qué se pueden utilizar montículos en el algoritmo de Kruskal? ¿Qué mejoras introduce en términos de complejidad? Cuestión 2 (1 puntos). Estructuras de datos (0. Sur. . 3. s.s 2 ) ⎤ ⎣ ⎦ sino dev c ⋅ expoDV ( c. Febrero 2003 (Primera Semana) Cuestión 1 (2 puntos).3} {2.4. Esto permite efectuar una inicialización en un tiempo Θ ( a ) . La función desencriptar recibe tres enteros: el mensaje cifrado c. Si es un grafo denso a tiende a n ( n − 1) / 2 y necesita un tiempo Θ n 2 log n .5} {2. Pag 220 y 223) Para tener en la raíz del montículo la arista más corta. s .1) } 2 . y devuelve el mensaje original a. desencriptar (c. Si es un grafo disperso a tiende a n y necesita un tiempo Θ ( n log n ) .3. Se desea implementar una función para desencriptar un mensaje numérico. nodos no seleccionados. ( ) Distancias desde 1 PASO Nodo Seleccionado Nodo No Seleccionado Nodo Precedente 2 1 1 1 3 3 1 4 4 4 4 1 1 1 1 5 1 1 1 1 2 20 20 20 19 INICIO 1 2 3 {1} {1.4.3} {2} ∞ 12 12 12 3 4 5 5 5 5 5 7 7 7 7 Cuestión 3 (2 puntos).s) mod z si ( s = 1) entonces dev c si ( s es par ) entonces dev ⎡expoDV ( c. Dado el grafo de la figura. aplicar el algoritmo de Dijkstra para hallar los caminos más cortos desde el nodo 1 hasta cada uno de los otros nodos. 5} {1. página 276. ¿Para qué se pueden utilizar montículos en el algoritmo de Kruskal? ¿Qué mejoras introduce en términos de complejidad? (Respuesta. El mensaje original se recompone con la fórmula: a := c s mod z Sabiendo que no se dispone del operador de potencia. Esta en Θ ( a log n ) .4} {1. z : entero){ devolver expoDV(c. Esto es ventajoso si se encuentra el árbol de recubrimiento mínimo en un momento que quede por probar un número considerable de aristas. implementar la función utilizando el esquema divide y vencerás.RESPUESTAS EXAMEN Programación III. vector de distancias y vector de nodos precedentes.4.5. Utilizando montículos necesita un tiempo Θ ( a log n ) . El algoritmo original perdería bastante tiempo ordenando aristas inútiles. indicando en cada paso: nodos seleccionados. a es el número de aristas. Fundamentos de Algo.5} {2. a) expoDV en Brassard. la clave privada s y la clave pública z. Cuestión 2 (1 puntos). una exploración en anchura tendrá un coste menor siempre que no se visiten nodos ya explorados.b) implementarlo como expomod. Todas las aristas tienen el mismo valor asociado (por ejemplo. como mucho se recorrerá todo el tablero una vez (coste lineal con respecto al número de nodos versus coste cuadrático para Dijkstra). las particularidades del problema hacen que el camino más corto coincida con el camino de menos nodos y. En segundo lugar. sin pérdida de generalidad). . es previsible esperar que el minotauro no esté cerca de la entrada (estará en un nivel profundo del árbol de búsqueda) por lo que los posibles caminos solución serán largos.1). no se exige hallar el camino más corto entre la entrada y el minotauro. Este u Oeste siempre que no haya una pared. La función ariadna debe devolver la secuencia de casillas que componen el camino de regreso desde la casilla ocupada por el minotauro hasta la casilla (1. sino que el enunciado sugiere. 1). Teseo se adentra en el laberinto en busca de un minotauro que no sabe dónde está. el algoritmo de Dijkstra queda descartado. y ya que se sugiere utilizar únicamente una matriz. S. O). que el algoritmo tarde lo menos posible en dar una de las posibles soluciones (y ayudar a salir a Teseo cuanto antes). Como no es necesario encontrar el camino más corto. por tanto.s. Sur. página 279. Se trata de implementar una función ariadna que le ayude a encontrar el minotauro y a salir después del laberinto. funcion desencriptar ( c.z ) {Calculamos c s mod z} mientras ( i > 0 ) hacer si ( i es impar ) entonces r ← x mod z x ← x 2 mod z i ←i÷ 2 devolver r Problema (5 puntos). en todo caso. Por otra parte. Teseo sale de la casilla (1. El tablero puede verse como un grafo en el que los nodos son las casillas y en el que como máximo surgen cuatro aristas (N. E. Solución: 5.1) y debe encontrar la casilla ocupada por el minotauro.1 Elección razonada del esquema algorítmico Como no se indica nada al respecto de la distancia entre casillas adyacentes. Tras estas consideraciones previas ya es posible elegir el esquema algorítmico más adecuado. Teseo puede tomar la dirección Norte. En cada punto. sino encontrar un camino lo antes posible. Brassard. El laberinto debe representarse como una matriz de entrada a la función cuyas casillas contienen uno de los siguientes tres valores: 0 para “camino libre”. es lícito suponer que la distancia entre casillas adyacentes es siempre la misma (1. En primer lugar. 1 para “pared” (no se puede ocupar) y 2 para “minotauro”. No se pide el camino más corto y si se hiciera. Por último. ensayo). Si se supone que el laberinto es infinito entonces una búsqueda en profundidad no sería adecuada porque no garantiza que se pueda encontrar una solución. se puede esperar que en media una búsqueda en profundidad requiera explorar menos nodos que una búsqueda en anchura. solución). solución) si válido (ensayo) entonces solución ← crear_lista(). pero ya que buscamos un nodo profundo. solución). ensayo). 5. se ha elegido el esquema de vuelta atrás. fsi ffun . es posible que una casilla no tenga salida por lo que es necesario habilitar un mecanismo de retroceso.2. mientras ¬ es_solución ∧ ¬ vacia (hijos) hijo ← primero (hijos) si cumple_poda (hijo) entonces (es_solución. la secuencia de casillas desde el minotauro hasta la salida). solución ← añadir (solución. devolver (verdadero. fun vuelta-atrás (ensayo) dev (es_solución. es necesario que no se exploren por segunda vez casillas ya exploradas anteriormente. Por estos motivos. si no hijos ← crear_lista().una búsqueda en profundidad resulta más adecuada que una búsqueda en anchura. Descripción del esquema usado Vamos a utilizar el esquema de vuelta atrás modificado para que la búsqueda se detenga en la primera solución y para que devuelva la secuencia de ensayos que han llevado a la solución en orden inverso (es decir. En el peor de los casos en ambas habrá que recorrer todo el tablero una vez. fsi devolver (es_solución. solución) ← vuelta-atrás(hijo) fsi fmientras si es_solución entonces solución ← añadir (solución. En tercer lugar. En este enunciado se puede presuponer que el laberinto es finito. hijos ← compleciones (ensayo) es_solucion ← falso. fregistro tipoLista fun vuelta-atrás ( laberinto: vector [1.x. solución ← añadir (solución. mientras ¬ es_solución ∧ ¬ vacia (hijos) hijo ← primero (hijos) si ¬ visitados [hijo. solución) ← vuelta-atrás (laberinto.LARGO.visitados).. casilla). fsi fmientras si es_solución entonces solución ← añadir (solución. ) dev (es_solución: booleano.y: entero. tipoCasilla = registro x.y] entonces (es_solución. Para llevar control de los nodos visitados bastará una matriz de igual tamaño que el laberinto pero de valores booleanos.hijo.5.y] ← verdadero.LARGO. casilla.x.. hijo.. Vamos a utilizar una lista de casillas para almacenar la solución y otra para las compleciones.ANCHO] de entero.y] == 2 entonces solución ← crear_lista(). hijos ← compleciones (laberinto. solución). solución: tipoLista) visitados [casilla. 1. casilla). casilla: tipoCasilla visitados: vector [1.. devolver (verdadero.ANCHO] de booleano. fsi ffun . casilla.4 Algoritmo completo Suponemos “laberinto” inicializado con la configuración del laberinto y ”visitados” inicializado con todas las posiciones a falso. casilla). casilla) es_solución ← falso. 1. si no hijos ← crear_lista(). fsi devolver (es_solución.3 Estructuras de datos Para almacenar las casillas bastará un registro de dos enteros x e y. Será necesario implementar las funciones de lista: • crear_lista • vacia • añadir • primero 5. si laberinto[casilla.x. las llamadas no se realizan si la casilla ya ha sido visitada.y=casilla. Sin embargo. pueden realizarse hasta 4 llamadas. Como las operaciones para una casilla son de complejidad constante.5 Estudio del coste Todas las operaciones son constantes salvo la llamada recursiva a vuelta-atrás.y] <> 1 entonces casilla_aux. La función compleciones comprobará que la casilla no es una pared y que no está fuera del laberinto fun compleciones ( laberinto: vector [1. tal como pedía el enunciado. hijos ← añadir (solución. fsi fsi si casilla.x.LARGO.x=casilla.x-1. En cada nivel.x.y-1.y=casilla.x=casilla.ANCHO] de entero. casilla_aux. si casilla. casilla_aux.casilla.y+1] <> 1 entonces casilla_aux. hijos ← añadir (solución. fsi fsi si casilla. .y+1. fsi fsi ffun 5.. sólo se visitará una vez cada casilla.x=casilla. fsi fsi si casilla. hijos ← añadir (solución.1).x=casilla.x+1.casilla. casilla_aux. hijos ← añadir (solución. casilla: tipoCasilla) dev tipoLista hijos ← crear_lista(). casilla_aux).y+1 <= ANCHO entonces si laberinto[casilla. casilla_aux).. en el caso peor. lineal con respecto al número de casillas.y-1 >= 1 entonces si laberinto[casilla. casilla_aux).y] <> 1 entonces casilla_aux. Esto quiere decir que. casilla_aux).y=casilla.x-1. 1.casilla. Como se añaden al final de la lista.En el caso de encontrar al minotauro se detiene la exploración en profundidad y al deshacer las llamadas recursivas se van añadiendo a la solución las casillas que se han recorrido.x+1.y.x+1 <= LARGO entonces si laberinto[casilla.casilla. la primera será la del minotauro y la última la casilla (1. la complejidad será O(ANCHO*LARGO).y.y=casilla.y-1] <> 1 entonces casilla_aux.x.x. casilla_aux.x-1 >= 1 entonces si laberinto[casilla. . Tarea ai Beneficios gi Instante di 1 20 4 2 10 5 3 7 1 4 15 1 5 25 2 6 15 3 7 5 1 8 30 2 PROBLEMA (5 puntos). Estudio del coste. Cuestión 3 (3 puntos). Detallar todos los pasos con claridad. Explica cómo pueden ordenarse n valores enteros positivos en tiempo lineal. Aplicar el algoritmo de planificación con plazo fijo para las actividades ai maximizando el beneficio gi en el plazo di. Estructuras de datos. 4. Sugerencia: Pudiera ser de utilidad razonar el problema utilizando la siguiente igualdad entre matrices: ⎡ a b ⎤ ⎡ f n −1 ⎤ ⎡ f n ⎤ ⎢1 0⎥ ⋅ ⎢ f ⎥ = ⎢ f ⎥ ⎣ ⎦ ⎣ n − 2 ⎦ ⎣ n −1 ⎦ La resolución del problema debe incluir. Se pide diseñar completamente un algoritmo que calcule en tiempo logarítmico el valor de f n de la sucesión definida como f n = af n-1 +bf n-2 con f0 = 0 y f1 = 1. sabiendo que el rango de dichos valores es limitado. por este orden: 1. Exploración en grafos: descripción del árbol de búsqueda asociado. Elección razonada del esquema algorítmico. 5.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Febrero 2003– Segunda semana Cuestión 1 (2 puntos). Según el esquema elegido hay que especificar. Explica las ventajas e inconvenientes de este método Cuestión 2 (1 punto). Algoritmo completo a partir del refinamiento del esquema general. En caso negativo justificar la respuesta. . además: Voraz: demostración de optimalidad. Divide y vencerás: preorden bien fundado. 3. Descripción del esquema usado e identificación con el problema. ¿Puede un grafo tener dos árboles de recubrimiento mínimo diferentes? En caso afirmativo poner un ejemplo. 2. . 2. es decir. Encontrar un árbol de recubrimiento mínimo consiste en hallar un subconjunto T de las aristas de G tal que utilizando solamente las aristas de T.A) un grafo conexo no dirigido en donde N es el conjunto de nodos y A es el conjunto de aristas. a. Cuestión 2 (1 punto). ¿Puede un grafo tener dos árboles de recubrimiento mínimo diferentes? En caso afirmativo poner un ejemplo. Febrero 2003 (Segunda Semana) Cuestión 1 (2 puntos).Recorremos el vector generado mostrando los valores generados en el paso anterior (2) y omitiendo aquellas posiciones del vector que contengan un 0. Explica las ventajas e inconvenientes de este método. (Página 79 Brassard) Suponiendo que el rango de los valores a ordenar es limitado. sabiendo que el rango de dichos valores es limitado.RESPUESTAS EXAMEN Programación III. sabemos que por ejemplo el rango de números a ordenar va de 0 a 2000. Por cada valor i extraído de la lista. 3. Explica cómo pueden ordenarse n valores enteros positivos en tiempo lineal. Siendo G=(N. (Página 215 Brassard) Si.El vector esta inicializado a 0 (O(n)). incrementamos el valor de la posición i del vector. Suponiendo que cada arista posee una longitud no negativa. 1. En caso negativo justificar la respuesta. . y además la suma de las longitudes de las aristas de T debe ser tan pequeña como sea posible. todos los nodos deben quedar conectados.Recorremos la lista de valores a ordenar (O(n)). podemos generar un vector de 2000 elementos de tipo entero que almacenará almacenará el número de ocurrencias de cada valor de la lista a ordenar en la posición del vector correspondiente. Tarea ai Beneficios gi Instante di 1 20 4 2 10 5 3 7 1 4 15 1 5 25 2 6 15 3 7 5 1 8 30 2 Inicialmente procederemos a ordenar la matriz de costes y plazos de mayor a menor en función de los costes. procederemos a aplicar el algoritmo rápido (páginas 237-241 Brassard) de planificación con plazo fijo. Una vez realizado este paso. Aplicar el algoritmo de planificación con plazo fijo para las actividades ai maximizando el beneficio gi en el plazo di.Cuestión 3 (3 puntos). Detallar todos los pasos con claridad. Resultado de la ordenación: i Tarea ai Beneficios gi Instante di 1 8 30 2 2 5 25 2 3 1 20 4 4 4 15 1 5 6 15 3 6 2 10 5 7 3 7 1 8 7 5 1 . 3.2 3 3 4 4 5 5 1 2 2 1 3 0 4 0 5 0 j[] i=3.2 3 3.1.5 Resto de tareas rechazadas. Seleccionamos K(5) 0 1 2 2 1 3 5 4 3 5 6 j[] 0.4 5 5 1 2 2 1 3 0 4 3 5 0 j[] i=4. d[2]=2. (Página 237-241 Brassard) Problema (5 Puntos) Se pide diseñar completamente un algoritmo que calcule en tiempo logerítmico el valor de fn de la sucesión definida como fn=afn-1+bfn-2 con f0=0 y f1=1.i=2. d[6]=5. d[3]=4.1. Seleccionamos K(1) 0 0. a1. a2. a8. Seleccionamos K(3) 0 0. Orden de ejecución de las tareas: a5.1. Sugerencia: Pudiera ser de utilidad razonar el problema utilizando la siguiente igualdad entre matrices:  a b  f n−1   f n    1 0  f  =  f        n−2   n−1  .4 5 5 1 2 2 1 3 5 4 3 5 0 j[] i=6. d[4]=1.2. a6.2. d[5]=3.3.4. Tarea rechazada i=5.1. Fin del Algoritmo. Seleccionamos K(4) 0 0.   f   f2    = F • 1   f  f    1  0  Con esta simplificación... aplicada sobre: F n = F ndiv 2 F n mod 2 ( ) 2   n 2   F 2  si n es par    =   2 n −1   2  F  F  si n es impar       Como puede observarse........ = F n−1 • 1     f  f   n−2   n−3   f n−1     n−3   0 ... El esquema algorítmico de divide y vencerás se basa en la idea de dividir un problema en varios subproblemas del mismo tipo cuya solución será combinada posteriormente para obtener la solución al problema inicial... Descripción del Esquema Algorítimico Para resolver el problema de elevar una matriz F a un determinado exponente utilizaremos la técnica de divide y vencerás aplicada a la fórmula de potencia descrita en el apartado anterior... reducimos el problema n a uno de n/2 que nos permite obtener una eficiencia de O(log n) frente a O(n) como ocurría si aplicábamos el algoritmo inicial.. ..  fn   f    = F • n−1   f  f   n−1   n−2    f n−1   f n−2    f  f  f    f  = F • f  ⇒  n  = F 2 • n−2  = ...... vamos a intentar encontrar una fórmula que nos    permita expresar la solución del problema en función de los casos base que se proporcionan en el enunciado que son f0=0 y f1=1. La forma más eficiente de calcular exponenciaciones es mediante la técnica de divide y vencerás..Solución La solución trivial se basa en resolver recursivamente el caso n resolviendo los n términos anteriores...... Planteamiento  a b Si llamamos F a la matriz   1 0  . es posible calcular el valor de fn con sólo calcular Fn-1 y hacer una multiplicación por el vector de casos base.. lo cual supondría un coste lineal que no es lo que nos piden en el enunciado del problema. 3.2]. Suponiendo que conocemos a. fun f(n:entero) dev entero F . r:entero. n mod 2 T . n div 2 r .Descomposición: Fn siempre lo vamos a descomponer en un único subproblema Fn/2.2] dev TT*Mr ffun Donde M1=M y M0=   1 0   0 1   . En nuestro caso utilizaremos enteros y matrices de 2x2. el algoritmo de divide y vencerás realiza una reducción en lugar de una descomposición. nuestro tamaño umbral lo podemos poner en n=1. M:vector[2. b. por tanto.M) fsi ffun fun combinación (T:vector[2.Como en toda función que resuelva un problema recursivamente.Tamaño umbral y solución simple: En nuestro caso.n) si no hacer p .2]. para n=1 y n=0 existen soluciones triviales y. caso  a b    1 0   n=0: dev f0 n=1: dev f1 verdadero: hacer S .p) dev combinacion(T.Combinación: La función de combinación en nuestro caso será la que hemos desarrollado al final del apartado anterior.n-1) S  f1   f   0 dev s[1] fcaso ffun fun exp_mat(M:vector[2.2]) dev vector[2. Algoritmo Completo. 2. s . Estructuras de Datos. exp_mat(F. f0 y f1. n:entero) dev vector[2.2] si n <= 1 entonces dev solucion_simple(M. exp_mat(M. En nuestro caso concreto: 1. En este caso.r. existirán casos umbral para los cuales la solución del problema pueda ser obtenida directamente mediante el uso de una sencilla función. b .fun solucion_simple (M:vector[2. {0}. n:entero) dev vector[2. J. c . k . podemos concluir que la complejidad del problema solucionado será de O(log n) como nos pedían en el enunciado. N . R . a=1  Τ n k si a < b k  T (n ) = Τ n k •log n si a = b k  Τ n log b a si a > b k  ( ( ) ( ) ) De acuerdo a los valores extraídos del caso particular de nuestra función. R . b=2. Rodríguez Artacho) .2]. Gonzalo Arroyo y M.2] si n=1 dev M si no dev fsi ffun  1 0    0 1   Estudio del Coste Función de recurrencia:  c •n k si 1 = n < b T (n ) =  k a •T (n / b ) + c •n si n = b + + a. (Páginas 55-59 Esquemas Algorítmicos: Enfoque Metodológico y Problemas Resueltos. n. b > 1 Resolución de la función de recurrencia: k=0. Estudio del coste Según el esquema elegido hay que especificar.r-1.k:entero):entero.j ∈{1.k-1). Diseñar un algoritmo que resuelva el problema (4 puntos) y aplicarlo a los datos del enunciado (1 punto). Algoritmo completo a partir del refinamiento del esquema general 5.r:entero.k-1). La operadora quiere reducir gastos. r! r + uno(n DIV 3. Gestión: 41204UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Nacional Original Septiembre de 2003 Duración: 2 horas Material permitido: NINGUNO DNI: _______________________ Prueba Presencial Apellidos: ___________________________________________________________________________________ Nombre: _____________________________________ Centro Asociado en el que entregó la práctica: _______________________ Cuestión 1 (2 puntos). para lo cual está planificando asegurar la conectividad de su red de nodos minimizando el coste. Hallar el coste de los siguientes algoritmos.k+2).r:entero. COMIENZO SI n<4 ENTONCES DEVOLVER(1).k+1). DEVOLVER(r). Explicar cómo hacer esto de la manera más eficiente. Estructuras de datos 4. COMIENZO SI n<3 ENTONCES DEVOLVER(1).j)= (i + j) MOD 8.k:entero):entero. Problema (5 puntos). por este orden: 1.i) r ! r + h(n. Cuestión 3 (1 puntos). Se desea encontrar los m elementos más pequeños de T (con m<<n). VAR i. VAR i.k+1). FIN FIN PROCEDIMIENTO dos(n. Explicar de qué manera se puede implementar mediante un esquema voraz el conocido problema de la búsqueda del camino más corto hacia la salida a un laberinto descrito por una matriz rectangular de casillas de tipos libre y ocupada. Cada conexión c(i.i) FIN r ! r + dos(n DIV 4. PARA i! 1 HASTA n HACER COMIENZO r ! h(n. FIN FIN Cuestión 2 (2 puntos). siendo h(n. además: • Voraz: demostración de optimalidad • Divide y Vencerás: preorden bien fundado • Exploración en grafos: descripción del árbol de búsqueda asociado .r.10}) tiene un coste asignado que sigue la fórmula c(i. La resolución del problema debe incluir. Compararlo en términos de coste con otras soluciones. SINO COMIENZO r!uno(n DIV 3. PROCEDIMIENTO uno(n.Programación III Códigos de asignatura: Sistemas: 402048. Una matriz T contiene n elementos. SINO COMIENZO r ! dos(n DIV 4.r. y otras dos de tipo entrada y salida. Elección razonada del esquema algorítmico 2. r ! r + dos(n DIV 4. DEVOLVER(r). Una operadora de telecomunicaciones dispone de 10 nodos conectados todos entre sí por una tupida red de conexiones punto a punto de fibra óptica.j) entre el nodo i y j ( Con i..k)∈O(n). Descripción del esquema usado e identificación con el problema 3. . r. //En el segundo caso de la llamada recursiva hay otra instrucción simple añadida. FIN FIN PROCEDIMIENTO dos (n. i) de coste lineal. a=2 y b=3 queda que 2 > 30 y por tanto la función T(n) tiene un coste O n ( log3 2 ) De forma análoga. PROCEDIMIENTO uno (n.k:entero):entero. r ← r + dos (n DIV 4. si a < b k ⎪ ⎪ . lo que equivale a T(n) = 3T(n/4) + 2n2 Aplicando la resolución genérica de las expresiones del tipo T(n) = aT(n/b) + cnk y siendo 3 < 42 el coste es O(n2). SINO COMIENZO r ← uno (n DIV 3. La expresión queda T(n) = T(n/3) + T(n/3) + 1 lo que equivale a que T(n) = 2T(n/3) + c. siendo h(n. Septiembre 2003(Original) Cuestión 1 (2 puntos). k+1). r ← r + uno (n DIV 3. Hallar el coste de los siguientes algoritmos. COMIENZO SI n < 3 ENTONCES DEVOLVER(1). VAR i.r:entero. VAR i.i). PARA i ← 1 HASTA n HACER COMIENZO r ← h (n. FIN r ← r + b (n DIV 4. Dentro de la condición tiene: o bien una instrucción constante. k-1). /*más una instrucción simple*/.k:entero):entero. //(ii) una instrucción simple.r-1. si a = b k T ( n ) ∈ ⎨Θ ( n k log n ) ⎪ log a . a = 3.k) ∈ O(n) . o bien dos llamadas recursivas. b = 4. r. Sumando los términos nos sale T(n) = T(n/4) +T(n/4)+n (2n) +T(n/4). (iii) otra llama recursiva de tamaño n/4. Aplicando la resolución genérica de las expresiones del tipo T(n) = aT(n/b)+cnk con k = 0. si 1 ≤ n < b ⎪ T (n) = ⎨ k ⎪aT ( n / b ) + cn .r. si a > b k ⎪Θ n b ⎩ ( ) . k+1). k-1). DEVOLVER (r).r:entero. k = 2 ⎧cn k . si n ≥ b ⎩ ⎧Θ ( n k ) . FIN FIN El procedimiento uno tiene una instrucción condicional de coste constante. el segundo algoritmo: está formado por una instrucción condicional de coste constante cuyo cuerpo incluye secuencialmente: (i) una llamada recursiva de tamaño n/4. DEVOLVER (r). k+2).RESPUESTAS EXAMEN Programación III. SINO COMIENZO r ← dos (n DIV 4. (iv) un bucle en el que se repite n veces un cálculo consistente en llamar dos veces a una función h(n. que no tenemos en cuenta para el cálculo. COMIENZO SI n < 4 ENTONCES DEVOLVER(1).i). r ← r + h (n. ambas invocan la función con un tamaño n/3. y por último (v) una instrucción simple /* que no tenemos en cuenta para el calculo*/ y otra llamada recursiva de tamaño n/4. De esta forma. para lo cual está planificando asegurar la conectividad de su red de nodos minimizando el coste. y otras dos de tipo entrada y salida.. Se trata de un grafo no dirigido de 10 nodos n1 . y en este caso el algoritmo de selección puede ser más eficiente. Compararlo en términos de coste con otras soluciones. Cuestión 3 (1 punto).j) entre el nodo i y j ( Con i. Explicar cómo hacer esto de la manera más eficiente. La operadora quiere reducir gastos. . Si m ≈ n . dentro de la familia de los algoritmos voraces. Casillas libres adyacentes tendrían aristas dirigidas en ambas direcciones. n10 con una matriz simétrica de costes: 1 2 3 4 5 6 7 8 9 10 1 3 4 5 6 7 0 1 2 3 2 3 5 6 7 0 1 2 3 4 3 4 5 7 0 1 2 3 4 5 4 5 6 7 1 2 3 4 5 6 5 6 7 0 1 3 4 5 6 7 6 7 0 1 2 3 5 6 7 0 7 0 1 2 3 4 5 7 0 1 8 1 2 3 4 5 6 7 1 2 9 2 3 4 5 6 7 0 1 3 10 3 4 5 6 7 0 1 2 3 - Se trata de conseguir minimizar el coste de los enlaces asegurando únicamente la conectividad de la red.. Cada conexión c(i. el coste vendría a ser cuadrático.j) = (i + j) MOD 8. Descripción del esquema: Se elige cualquiera de los algoritmos expuestos en el temario Kruskal o Prim.. Un procedimiento parcial de ordenación por selección nos da los m elementos más pequeños con coste O(m ⋅ n) . incluyendo el nodo salida.Cuestión 2 (2 puntos). Las casillas de tipo ocupada no tienen aristas origen ni destino. El enunciado describe un problema de optimización en el que se nos pide que el grafo sea conexo ("asegurar la conectividad de la red") y contenga un árbol de expansión mínimo ("que el coste sea mínimo"). Una ordenación eficiente sin embargo lo haría en O(n ⋅ log ⋅ n) . Una matriz T contiene n elementos. Se desea encontrar los m elementos más pequeños de T (con m<<n).. En términos de coste.10}) tiene un coste asignado que sigue la fórmula c(i. n2 . Cada casilla se asimila a un nodo.. El peso sería unitario para cada arista. el grafo tendrá v = n 2 nodos y alrededor de a = 4n 2 aristas. Elección del esquema: Con las condiciones descritas podemos usar algoritmos que resuelvan el problema del árbol de expansión mínimo. ya que la conectividad se asegura no dejando subgrafos no conexos. por ejemplo éste último. sin embargo es necesario tener en cuenta que si el laberinto es un cuadrado de lado n.j 0{1. Explicar de qué manera se puede implementar mediante un esquema voraz el conocido problema de la búsqueda del camino más corto hacia la salida a un laberinto descrito por una matriz rectangular de casillas de tipos libre y ocupada. un algoritmo de Dijkstra puede hallar el camino más corto de un nodo llegada a todos los demás. sin embargo con m << n el orden O(m ⋅ n) se puede considerar lineal. En el análisis de coste de la resolución de Dijkstra si v (número de nodos del grafo) es lo suficientemente grande hace cierta la expresión a << v 2 y por tanto podemos aproximarnos al coste O((a + v) ⋅ log v) Problema (5 puntos). lo cual nos haría desechar el procedimiento de selección. Una operadora de telecomunicaciones dispone de 10 nodos conectados todos entre sí por una tupida red de conexiones punto a punto de fibra óptica. Diseñar un algoritmo que resuelva el problema (4 puntos) y aplicarlo a los datos del enunciado (1 punto). Algoritmo completo a partir del esquema general: función Prim(G : grafo) : T : conjunto de aristas T ←∅ B ←1 para i ← 2 hasta n hacer masProximo[i] ← 1 distanciaMin[i] ← G : distancia[i. 1] repetir n − 1 veces{ min ← ∞ para j ← 2 hasta n hacer { \* Selecciona la mejor arista entre B y N \ B * \ si (distanciaMin[j] ≥ 0) ^ (distanciaMin[j] < min) ent { distanciaMin[k] ← G : distancia(j.función Prim(G : grafo) : T : conjunto de aristas T ←∅ B ←1 mientras B ≠ N hacer { buscar e = {u. La estructura de datos tendrá un método que implementa el cálculo de la distancia entre dos nodos. y su coste O(1). Estructuras de datos: El grafo se representará mediante una matriz de costes. kg \* Añade la arista * \ distanciaMin[k] ← −1 para j ← 2 hasta n hacer { si G : distancia(j. El conjunto B va a ir conteniendo los nodos del subgrafo ya conexo y el conjunto T irá teniendo en cada iteración aquellas aristas del árbol de expansión mínimo que contiene los nodos de B. El conjunto de candidatos es B. la condición de finalización es que B = N y la función de optimización es elegir aquella arista del subgrafo B que conecte con algún nodo de N\B con menor coste. k) masProximo[j] ← k } } T ← T SfmasProximo[k]. v} de longitud minima tal que u∈B y v∈ N \ B T ← T ∪ {e} B ← B ∪ {v} } dev T ffunción Hemos tomado 1 como nodo arbitrario. k) masProximo[j] ← k } } } dev T . En el caso de esta implementación la distancia entre dos nodos i y j es el valor de la matriz de distancias. k) < distanciaMin[j] ent { distanciaMin[k] ← G : distancia(j. Coste: El coste del algoritmo de Prim es O(n2).9. 5) Coste: 0 B = {1.8. Aplicación al problema: Tenemos los siguientes conjuntos inicialmente B = {1} y la arista mínima entre un nodo de B y otro de N\B es u = (1.9} u = (2.2.2.10} u = (6.9} u = (6.3.7. 7) con valor 0.6. 8) Coste: 1 Coste del árbol de expansión mínimo: 4 .9} u = (7. 3) Coste: 0 B = {1.10} u = (6. 2) Coste: 1 B = {1. 6) Coste: 0 B = {1.6. 3) Coste: 1 B = {1.2.5.7.9.9.3.6. Los valores de B y la u elegida en cada momento evolucionan como sigue: B = {1.2. que puede mejorarse utilizando una representación de montículos para el vector distanciaMin[] Optimalidad: El algoritmo de Prim encuentra la solución óptima.6. 10) Coste: 0 B = {1. 8) Coste: 1 B = {1.9.3.6.7.3.2.7.10} u = (9.10} u = (3.7.3.5.7.7.7} u = (7.5.6.2. Se puede demostrar por inducción sobre T que añadir la arista más corta {e} que sale de T (Lema 6.10} u = (9.7.2.4.9.1 del texto base) forma en T ∪ {e} un árbol de recubrimiento mínimo que contendrá al final n-1 aristas y todos los nodos del grafo G. 9) Coste: 0 B = {1.8. Ordenar completamente el vector en orden no decreciente por el método de Quicksort indicando claramente cual es el contenido del vector en cada paso. Algoritmo completo a partir del refinamiento del esquema general (1.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Septiembre 2003 Reserva Cuestión 1 (2 puntos). 184). 3 4 5 1 3 7 6 2 Cuestión 2 (2 puntos). Cada objeto i ocupa un volumen Vi y tiene un valor sentimental Si para él. Evidentemente. el madelman. Estructuras de datos (0. Daniel no está dispuesto a romper en pedazos sus tesoros. 179. Problema (5 puntos).5 puntos). 4. Cuestión 3 (1 puntos). 5. Daniel se va de veraneo y tiene que decidir qué tesoros se lleva (el coche de hojalata. maximizando el valor sentimental de los objetos que contiene. el pañuelo de María. Su madre le ha dado una bolsa de Vb cm3 con la orden expresa de que no se puede llevar nada que no quepa en la bolsa. Estudio del coste (1 punto).5 puntos). 211 y Esquemas algorítmicos Pág. (Respuesta: Fundamentos de Algoritmia. pag. 3. Daniel tiene N objetos candidatos. por este orden: 1. pag. etc). 12). 2.5 puntos). La resolución del problema debe incluir. . (Respuesta: Fundamentos de Algoritmia. Demuestra que el problema se puede resolver con el esquema elegido (0. Con el criterio de tomar primero la moneda de mayor valor que sea menor o igual que el cambio que queda por devolver. 255. ¿existe un algoritmo voraz para el problema de devolver el cambio con el menor número de monedas en cualquier sistema monetario? Justifique su respuesta. Se trata de llenar la bolsa. ¿Se puede aplicar el procedimiento de búsqueda binaria sobre árboles con estructura de montículo? Razonar la respuesta. Elección razonada del esquema algorítmico mas eficiente para resolver el problema (0.5 puntos). . Para aplicar el esquema voraz. si tomamos las monedas inglesas en peniques C = {30. 10 5 1}. (Respuesta: Fundamentos de Algoritmia. está situado en el nivel 1 y posee un hijo izquierdo.1}. si existe uno.n ] una matriz ordenada por orden no decreciente. 12).24}. ¿existe un algoritmo voraz para el problema de devolver el cambio con el menor número de monedas en cualquier sistema monetario? Justifique su respuesta. Se dice que un árbol binario es esencialmente completo si todo nodo interno. .6. Esto se llama propiedad de montículo.3. con la posible excepción de un nodo especial.12. Montículo: Es un árbol binario esencialmente completo. C = {100.. pag. Se debe distinguir un conjunto de candidatos y que la solución pase por ir escogiéndolos o rechazándolos. Sea T [1. por orden no decreciente. el problema ha de ser de optimización. 3 3 3 1 1 1 4 2 2 2 2 2 5 5 3 3 3 3 1 1 1 3 3 3 3 3 5 5 5 4 7 7 7 7 4 5 6 6 6 6 6 6 2 4 4 4 7 7 Cuestión 2 (2 puntos). En el problema de las monedas. nuestro algoritmo nos daría un conjunto solución S = {30. a continuación haré una breve reseña de cada uno: Procedimiento de búsqueda binaria: El vector tiene que estar ordenado totalmente. 184). tenemos T [i ] ≤ T [ j ] . No. 3 4 5 1 3 7 6 2 Solución: Tomo como pivote el primer elemento. El motivo es que la ordenación de los nodos es distinta. El nodo especial. No. 25.24. 211 y Esquemas algorítmicos Pág. ¿Se puede aplicar el procedimiento de búsqueda binaria sobre árboles con estructura de montículo? Razonar la respuesta. (Respuesta: Fundamentos de Algoritmia.RESPUESTAS EXAMEN Programación III.6}. no euros como ahora). cada nodo incluye un elemento de información denominado valor del nodo y la propiedad de que el valor de cada nodo interno es mayor o igual que los valores de sus hijos. la solución es óptima tomando el conjunto de monedas españolas (cuando se utilizaban pesetas. siempre que sea 1 ≤ i ≤ j ≤ n . Con el criterio de tomar primero la moneda de mayor valor que sea menor o igual que el cambio que queda por devolver. pero la solución óptima sería S = {24. Sin embargo.12. es decir. Septiembre 2003 (Reserva) Cuestión 1 (2 puntos). 255. pero no tiene hijo derecho. para un cambio de 48 peniques. tiene exactamente dos hijos. La función de selección debe asegurar que la solución alcanzada es la óptima. pag. puede que hayamos confundido el problema con uno de exploración de grafos. Si no. Cuestión 3 (1 puntos). 179. Ordenar completamente el vector en orden no decreciente por el método de Quicksort indicando claramente cual es el contenido del vector en cada paso. . tengo que descartar el esquema voraz ya que no se encuentra una función de selección que sea óptima para resolver el problema. Montículo de mínimos tipos nodo = reg sol[1. Elección razonada del esquema algorítmico mas eficiente para resolver el problema. Evidentemente. por lo tanto descarto divide y vencerás y vuelta atrás. beneficio:real beneficio-opt:real {prioridad} freg ftipos . eligiéndolos por orden decreciente de vi/wi con un coste total de Θ ( nlogn ) . 1.n peso.n]de 0. maximizando el valor sentimental de los objetos que contiene.. Estructuras de datos. Se trata de un problema de optimización. el pañuelo de María. Daniel no está dispuesto a romper en pedazos sus tesoros. etc). Por lo tanto elijo para resolver este problema el esquema de Ramificación y Poda. Daniel tiene N objetos candidatos. Cada objeto i ocupa un volumen Vi y tiene un valor sentimental Si para él. el madelman. ya que se exige en el enunciado que no se pueden romper los tesoros. 2. Daniel se va de veraneo y tiene que decidir qué tesoros se lleva (el coche de hojalata. se podría utilizar el esquema voraz en el casos que se pudieran trocear los tesoros..Ejemplo de montículo: 10 7 9 4 7 5 2 2 1 6 Problema (5 puntos). Se trata de llenar la bolsa.1 k:0. Su madre le ha dado una bolsa de Vb cm3 con la orden expresa de que no se puede llevar nada que no quepa en la bolsa. n]de 0.k+1.peso :=0. k: 0.beneficio-opt.X) beneficio-mejor := max(beneficio-mejor. Y. M: real. las estimaciones coinciden con las de Y} {beneficio-opt(X) = beneficio-opt(Y) ≥ beneficio-mejor } X.opt. Y.k] X.C:colapr[nodo] {generamos raíz} X.beneficio + V[X. fun tesoros-rp(P[1.beneficio := Y.beneficio:=0. M: real)dev (sol-mejor[1.beneficio) si X.beneficio-opt ≥ beneficio-mejor entonces X.sol..beneficio si X. V.peso.peso:= Y.k]:=1. por tanto.peso.k] := 0. X.peso X.k:=0.k = n entonces { beneficio(X) = beneficio-opt(X) ≥ beneficio-mejor } sol-mejor:=X. {probamos a meter el objeto en la mochila} si Y.beneficio-opt si X.n] de real. beneficio-mejor:real) var X.beneficio) C:= cp-vacia(). beneficio-mejor := X.beneficio sino añadir(C. añadir(C. pes:= pes + V[j] j := j+1 .peso + [X...X) {no se puede mejorar beneficio mejor} fsi fsi {probamos a no meter el objeto (siempre es factible)} (X. Algoritmo completo a partir del refinamiento del esquema general (1.beneficio-opt := Y.k = n enteonces sol-mejor := X. pes) fsi fsi fmientras ffun fun calculo-estimaciones (P[1.peso + P[X.sol[X. pes := beneficio.beneficio-opt ≥ beneficio-mejor) hacer Y:= maximo C).beneficio-mejor):= calculo-estimaciones(P. Y. M.k] ≤ M entonces {es factible y.beneficio. Y.k]. M. X. .sol.k.Y) mientras ¬es-cp-vacia?(C)^(minimo(C). peso. Y.n]. Y.sol[X. j := k+1 mientras j ≤ n ^ P[j] ≤ hueco hacer {podemos coger el objeto j entero} hueco := hueco-P[j] opt := opt + V[j]. Y. fmientras si j ≤ n entonces {quedan objetos por probar} {fraccionamos el objeto j (solucion voraz)} opt := opt + (hueco/P[j]*V[j] {extendemos a una solución en la versión 0/1} j := j+1 mientras j ≤ n ^ hueco > 0 hacer si P[j] ≤ hueco entonces hueco := hueco – P[j] pes := pes + V[j] fsi j := j+1 fmientras fsi ffun Estudio del coste.k. opt := beneficio.5 puntos).beneficio:= Y. beneficio:real) dev (opt. eliminar-max(C) X. X. pes: real) hueco := M-peso.sol.Y: nodo. pes) := calculo-estimaciones (P. V. X.n.n].n]de real.4.sol:=Y... Y.. beneficio-mejor:= X. V[1.1.beneficio sino añadir(C.. V[1.peso := Y.k:=Y. (Y. . Elección razonada del esquema algorítmico 2.Programación III Códigos de asignatura: Sistemas: 402048. la satisfacción de sus clientes es lo que importa: es mejor tener satisfechos al mayor número de ellos. ¿Qué significa que el tiempo de ejecución de un algoritmo está “en el orden exacto de f(n)”?. Descripción del esquema usado e identificación con el problema 3. Demostrar que T(n)=5·2n+n2 está en el orden exacto de 2n. ¿Cuáles son los casos mejor y peor para el algoritmo de ordenación rápida (Quicksort)? ¿Cuál es el orden de complejidad en cada uno de ellos? Razona tu respuesta. La resolución del problema debe incluir. Problema (4 puntos). Como siempre. Algoritmo completo a partir del refinamiento del esquema general 5. Pero al jefe de taller no le da lo mismo. Gestión: 41204UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Extraordinario Diciembre de 2003 Prueba Presencial Duración: 2 horas Material permitido: NINGUNO DNI: _______________________ Apellidos: ___________________________________________________________________________________ Nombre: ______________________________ Centro donde entregó la práctica: ____________________ Especialidad: ____________ Cuestión 1 (2 puntos). Estructuras de datos 4. ¿Qué diferencias hay entre un montículo y un árbol binario de búsqueda? Cuestión 3 (2 puntos). la planificación la hace él y. Al fin y al cabo. Estudio del coste . por este orden: 1. Hoy es un día duro para el taller Sleepy. Cuestión 2 (2 punto). Llegan las vacaciones y a las 8:00 de la mañana n clientes han pedido una revisión de su coche. evidentemente. Cada coche necesita un tiempo de revisión ri y al mecánico le da lo mismo por cuál empezar: sabe que en revisar todos los coches tardará lo mismo independientemente del orden que elija. un cliente estará más satisfecho cuanto menos tarden en devolverle el coche. Implementar un programa que decida el orden en el que revisar uno a uno los coches para maximizar la satisfacción de los clientes de Sleepy. todos necesitan que les devuelvan el coche en el menor tiempo posible. . Si lim n →∞ n →∞ f (n) ∈ 0 . Si lim 2. entonces f ( n ) ∈ Θ ( g ( n ) ) g ( n) n →∞ f ( n) ∈ +∞ . Theta de f ( n ) y lo denotamos como t ( n ) ∈ Θ ( f ( n ) ) . decimos que t ( n ) está en Ω ( f ( n)) .RESPUESTAS EXAMEN Programación III. 20 20 ≥ 12 12 34 ≥ 27 12 ≥ 6 20 ≤ 34 34 27 6 18 12 ≤ 18 35 34 ≤ 35 . Diciembre 2003 Cuestión 1 (2 puntos). Demostrar que T ( n ) = 5 ⋅ 2n + n 2 está en el orden exacto de 2n . Si lim 3. entonces f ( n ) ∈ Ω ( g ( n ) ) pero f ( n ) ∉ Θ ( g ( n ) ) g ( n) 2 f (n) f ′( n) 5 ⋅ 2n log ( 2 ) + 2n 5 ⋅ 2n log ( 2 ) + 2 5 ⋅ 2n + n 2 = lim = lim = lim = lim = lim 2 n →∞ g ( n ) n →∞ g ′ ( n ) n →∞ n →∞ n →∞ 2n 2n log ( 2 ) 2n log ( 2 ) lim 5 ⋅ 2n log ( 2 ) 2n log ( 2 ) 3 3 n →∞ =5 Por lo tanto: f ( n ) ∈ Θ ( g ( n )) Cuestión 2 (2 puntos). entonces f ( n ) ∈ O ( g ( n ) ) pero f ( n ) ∉ Θ ( g ( n ) ) g ( n) f ( n) ∈ℜ+ . si pertenece tanto a O ( f ( n ) ) como a Θ ( f ( n )) = O ( f ( n )) ∩ Ω ( f ( n)) REGLA DEL LÍMITE: 1. representada por Θ . Hace referencia a la notación Theta. ¿Qué significa que el tiempo de ejecución de un algoritmo está “en el orden exacto de f(n)”?. ¿Qué diferencias hay entre un montículo y un árbol binario de búsqueda? Árbol binario de búsqueda: Un árbol binario es un árbol binario de búsqueda si el valor contenido en todos los nodos internos es mayor o igual que los valores contenidos en su hijo izquierdo o en cualquiera de los descendientes de ese hijo y menor o igual que los valores contenidos en su hijo derecho o cualquiera de los descendientes de ese hijo. Página 261. si existe uno. tiene exactamente dos hijos. cada nodo incluye un elemento de información denominado valor del nodo y la propiedad de que el valor de cada nodo interno es mayor o igual que los valores de sus hijos. Se dice que un árbol binario es esencialmente completo si todo nodo interno. está situado en el nivel 1 y posee un hijo izquierdo. con la posible excepción de un nodo especial.Montículo: Es un árbol binario esencialmente completo. entonces es probable que la mayoría de los subejemplares que haya que ordenar estén suficientemente bien equilibrados. Para el mejor caso el orden de complejidad es O ( nlogn ) . Si la matriz que hay que ordenar se encuentra inicialmente en orden aleatorio. . pero no tiene hijo derecho. Todas las hojas se encuentran en el nivel 0 ó bien están en los niveles 0 y 1 y ninguna hoja del nivel 1 está a la izquierda de un nodo interno del mismo nivel. Esto se llama propiedad de montículo. ¿Cuáles son los casos mejor y peor para el algoritmo de ordenación rápida (Quicksort)? ¿Cual es el orden de complejidad en cada uno de ellos? Razona tu respuesta. En el caso peor si la matriz se encuentra ordenada implica una llamada recursiva a un caso de tamaño cero y otra a un caso cuyo tamaño sólo se reduce en una unidad. El nodo especial. Ejemplo de montículo: 10 7 9 4 7 5 2 2 1 6 Cuestión 3 (1 puntos). Para el peor caso el orden de complejidad es Ω ( n 2 ) . Cada coche necesita un tiempo de revisión ri y al mecánico le da lo mismo por cuál empezar: sabe que en revisar todos los coches tardará lo mismo independientemente del orden que elija.. evidentemente.. para i=1 hasta n hacer F[i]:= C[i]+D[i].n]1. D[1. final := F[I[1]]. .. para este problema se puede encontrar una función de selección que lo resuelva.n . todos necesitan que les devuelvan el coche en el menor tiempo posible. sol[i]:= falso..n]1. este problema se corresponde con el problema de minimización del tiempo en el sistema.indice.n]nat) dev sol[1. un cliente estará más satisfecho cuanto menos tarden en devolverle el coche.n) ffun Estudio del coste El bucle voraz es de complejidad lineal respecto al número de clientes y el orden de complejidad del algoritmo completo corresponde al de la ordenación del vector de tiempos finales Θ ( nlogn ) . final := F[I[i]]. por lo tanto descarto el esquema de divide y vencerás. la satisfacción de sus clientes es lo que importa: es mejor tener satisfechos al mayor número de ellos. Esquema general: fun voraz (C: conjunto) dev (S: conjunto) S ← ∅ mientras ¬ solucion (S) ∧ C ≠ ∅ hacer x ← elemento que maximiza objetivo (x) C ←C \ {x} si completable (S ∪ {x}) entonces S ← S ∪ {x} fsi dev S ffun Estructuras de datos: Tres vectores de enteros.Problema (4 puntos).n] bool var F[1.. Se trata de un problema de optimización. Llegan las vacaciones y a las 8:00 de la mañana n clientes han pedido una revisión de su coche. Como siempre.. para i=2 hasta n hacer si C[I[i]]≥ final entonces sol[I[i]]:= cierto. Implementar un programa que decida el orden en el que revisar uno a uno los coches para maximizar la satisfacción de los clientes de Sleepy. Pero al jefe de taller no le da lo mismo.n]nat . debemos elegir a los clientes por orden creciente de tiempo de finalización.n]nat.n merge-indice(V. Algoritmo completo a partir del refinamiento del esquema general fun taller (C[1. Elección razonada del esquema algorítmico más eficiente para resolver el problema. fsi fpara ffun fun ordenar-indices(V[1. de esta manera descarto el esquema de ramificación y poda.. la planificación la hace él y.. I[1. fpara I:= ordenar-indices(F) sol[I[1]]:= cierto. Al fin y al cabo.n])dev indice [1. Hoy es un día duro para el taller Sleepy.1. un vector booleano y la función auxiliar ordenar índices.. . 21. . Tenemos un camión que carga un máximo de 55 Kgs. Resolver mediante el algoritmo de Kruskal el árbol de expansión mínimo del grafo definido por la siguiente matriz de adyacencias: 1 . p3. 2. . mediante divide y vencerás con coste en Θ ( log n ) .UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Febrero 2004 – Primera semana Cuestión 1 (2 puntos). verde. 5 9 1 1 ∞ .5 puntos). . Según el esquema elegido hay que especificar. .3. 4. Estudio del coste (1 punto). Demuestra que el problema se puede resolver con el esquema elegido (0. . Estructuras de datos (0. . p2.5 Kgs. 3 5 6 . además: Voraz: demostración de optimalidad. Exploración en grafos: descripción del árbol de búsqueda asociado. (Respuesta: Cuestión 2 (1 puntos). Se tienen 4 productos infraccionables p1. . Una solución es una tabla con una fila llena de valores iguales.5 puntos). por este orden: 1.5 puntos). 5. 1 2 3 4 5 Problema (5 puntos). Cuestión 3 (2 puntos). Se supone que no existe la operación potencia y que el coste de una operación de multiplicación es Ο (1) .5 puntos). 11 € y cuyos pesos son respectivamente 2.m)” que halle nm. p4 en cantidades ilimitadas cuyo beneficio es respectivamente 23. Programar Una función “potencia (n. 12. El problema consiste en llenar un camión con la carga de mayor valor. Divide y vencerás: preorden bien fundado. . La resolución del problema debe incluir. 4 ∞ ∞ 3 . Algoritmo completo a partir del refinamiento del esquema general (1. Desarrollar un algoritmo que dada una matriz inicial averigüe cuantas soluciones se pueden encontrar aplicando movimientos permitidos a partir de aquella. Elección razonada del esquema algorítmico mas eficiente para resolver el problema (0. 3.4. Se tiene una matriz de n x n cuyas casillas contienen valores del conjunto C = {rojo. 2 4 . El único movimiento permitido consiste en que cada casilla de valor ‘blanco’ puede intercambiarse por cualesquiera de sus adyacentes no diagonales. . . . amarillo} excepto una que es ‘blanco’. ¿Qué algoritmo nos permite resolver el problema? Aplicando al enunciado y detallarlo paso por paso. . mediante divide y vencerás con coste en Θ ( log n ) . pag. n: nat) dev y: numero casos n=0 → y:= 1 n=1 → y:= x n>1 ^ par(n) → {xn = x2(n div 2) = (xn div 2)2 } y:= potencia (x. public int potencia(int x. n div 2). si 1 ≤ n < b . si a > b k ( ) a = 1. k = 0 → T ( n ) ∈ Θ n k log n → T ( n ) ∈ Θ ( log n ) ( ) . si n ≥ b . si n ≥ b . si a = b k .m)” que halle nm. } } ⎧cn k ⎪ T (n) = ⎨ k ⎪aT ( n − b ) + cn ⎩ . si 0 ≤ n < b . (Respuesta: Fundamentos de Algoritmia. Programar Una función “potencia (n. si a = 1 . si a < b k . } else{ return x * potencia(x. 276 y EDMA 342). Se supone que no existe la operación potencia y que el coste de una operación de multiplicación es Ο (1) . y:= x(y*y) fcasos ffun ⎧cn k ⎪ T (n) = ⎨ k ⎪aT ( n / b ) + cn ⎩ ⎧Θ ( n k ) ⎪ ⎪ T ( n ) ∈ ⎨Θ ( n k log n ) ⎪ log a ⎪Θ n b ⎩ . n div 2). y:= y*y n>1 ^ impar(n) → {xn = x2(n div 2)+1 = x(xn div 2)2 } y:= potencia (x. n .RESPUESTAS EXAMEN Programación III. si a > 1 ⎧Θ ( n k ) ⎪ ⎪ T ( n ) ∈ ⎨Θ ( n k +1 ) ⎪ n div b ) ⎪Θ ( a ⎩ a = 1. b = 1. k = 0 → T ( n ) ∈ Θ n k → T ( n ) ∈ Θ ( n ) ( ) Versión del Libro Estructura de datos y métodos algorítmicos fun potencia (x: numero. b = 2. si a < 1 .1). int n){ if ( n == 0 ){ return 1. Febrero 2004 (Primera Semana) Cuestión 1 (2 puntos). . Haré un pequeño gráfico. 598 2. por esta rama ya no puedo continuar ya que me pasaría del peso en una unidad 56 y me exigen 55..0 2. wi vi p1 p2 p3 p4 2 4 3 5 23 12 21 1 Ya que el enunciado impone que los productos sean infraccionables aplicaré el algoritmo de Vuelta Atrás. Tenemos un camión que carga un máximo de 55 Kgs. el algoritmo de vuelta atrás explora el árbol como un recorrido en profundidad.... . p3. ¿Qué algoritmo nos permite resolver el problema? Aplicando al enunciado y detallarlo paso por paso. El problema consiste en llenar un camión con la carga de mayor valor.4. que es lo que pretendemos optimizar. 11 € y cuyos pesos son respectivamente 2. Quedando de la siguiente manera: p1 2 23 11. por lo tanto retrocedo al nodo anterior y sigo la búsqueda por la siguiente rama que se corresponde con 26 pesos con 2 y 1 peso con 3 que hacen un total de 55 Kg. .Cuestión 2 (2 puntos).2. p4 en cantidades ilimitadas cuyo beneficio es respectivamente 23. p2. tal como me piden y un valor de 619 € que resulta la solución óptima para este ejemplo. 12.5 Kgs.3. Con la siguiente notación: cada cuadro es un nodo. 23 2. 619 Inicio el recorrido en profundidad hasta que tengo 27 pesos con 2 que hace un total de 54.3. Se tienen 4 productos infraccionables p1. 21..2 wi vi vi wi Inicialmente la solución parcial está vacía.5 p3 p2 3 4 21 12 7 3 p4 5 1 0.2. los números a la izquierda del punto y coma son los pesos de los objetos y los de la derecha el valor de la carga. construyendo nodos y soluciones parciales a medida que avanza. Lo Primero que haré ya que el algoritmo me permite ordenar los objetos en cualquier orden los ordenaré por orden decreciente de su valor/peso ya que tras hacer varias comprobaciones con más ejemplos funciona igual pero reduzco el tamaño del árbol. 5).5) 1 {(2.5).5)} {1}{2. (3. .( 1.5} (1. .5}{3}{4} (2.5). .(3. pag.2. (3.5).4. .2) 4 {(2.4) 3 {(2.4).3. 3 5 6 .5).Cuestión 3 (2 puntos).4)} {1.( 3.5).(1.5} (3. Resolver mediante el algoritmo de Kruskal el árbol de expansión mínimo del grafo definido por la siguiente matriz de adyacencias: (Respuesta: Fundamentos de Algoritmia. (3. 1 9 4 2 1 6 1 5 4 3 3 5 Se ordenan las aristas de menor a mayor coste: (2.( 3.2) EVOLUCION EVOLUCION COMPONENTES SOLUCION {1}{2}{3}{4}{5} INICIO ∅ {1}{2. . 4 ∞ ∞ 3 . 1 2 3 4 5 1 .5}{4} (3.5) 2 {(2.5)} {1}{2. 217. 218). .3. . 5 9 1 1 ∞ .4. .4). 2 4 .(3. .5).3. .2)} Proceso terminado porque sólo queda una única componente conexa PASO ARISTA . Se tiene una matriz de n x n cuyas casillas contienen valores del conjunto C = {rojo. Desarrollar un algoritmo que dada una matriz inicial averigüe cuantas soluciones se pueden encontrar aplicando movimientos permitidos a partir de aquella. 4. Descripción del esquema usado e identificación con el problema. 5. Estudio del coste. . Elección razonada del esquema algorítmico. Estructuras de datos. El único movimiento permitido consiste en que cada casilla de valor ‘blanco’ puede intercambiarse por cualesquiera de sus adyacentes no diagonales. amarillo} excepto una que es ‘blanco’. verde. Algoritmo completo a partir del refinamiento del esquema general. Una solución es una tabla con una fila llena de valores iguales. La resolución del problema debe incluir. 3. por este orden: 1.Problema (4 puntos). 2. h(n . 5.6 .i . con ciclos y con todas las aristas de coste unitario.1.1. Dado un grafo dirigido. j). por este orden: 1. Elección razonada del esquema algorítmico. 3.6 . implementar un algoritmo que devuelva el número de nodos que contiene el camino más largo sin ciclos que se puede recorrer desde un determinado nodo. j) si n > 0 entonces h(n . 2. ¿En qué orden está el tiempo de ejecución del siguiente algoritmo? Justifica tu respuesta. Algoritmo completo a partir del refinamiento del esquema general.j. 4. Aplica el algoritmo de Kruskal al siguiente grafo indicando claramente en cada paso qué arista se selecciona. Cuestión 3 (2 puntos). la evolución de las componentes conexas y la evolución de la solución. ¿Cuándo resulta más apropiado utilizar una exploración en anchura que en profundidad? Problema (5 puntos). Procedimiento h(n.i. .i.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Febrero 2004 – Segunda semana Cuestión 1 (1 punto). La resolución del problema debe incluir. escribir i " → " j. Estudio del coste.i . Estructuras de datos. finito. Descripción del esquema usado e identificación con el problema. fsi. Cuestión 2 (2 puntos).j). . 3).3) (4.5.6)} EVOLUCION EVOLUCION PASO ARISTA COMPONENTES SOLUCION INICIO {1}{2}{3}{4}{5}{6} ∅ 1 (2. escribir i " → " j.3) .3)} 2 (4.5) 7 (1.2.5).3.6 .(2. fsi.5}{6} {(2.6).5.(3.3).5) (2.(4. h(n .5)} 3 (2.6} {(2. (3.4) (3.6 .1.(4.3) {1}{2.4.4.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Febrero 2004 – Segunda semana Cuestión 1 (1 punto).6} {(2. j).6) {1}{2.5).i.3.3). Procedimiento h(n.b)+ cn k luego T(n)= 2·T(n . k = 0 Aplicando la recurrencia para el caso cuando a > 1 : T(n) ∈ T(a n div b ).3}{4}{5}{6} {(2.5) {1}{2.2)} Proceso terminado porque sólo queda una única componente conexa . Se ordenan las aristas de menor a mayor coste: {(2.5).(1.3.4). Aplica el algoritmo de Kruskal al siguiente grafo indicando claramente en cada paso qué arista se selecciona.5).4. la evolución de las componentes conexas y la evolución de la solución.6) (1. (2.4).1.5}{6} {(2.(2. j) si n > 0 entonces h(n .2) {1.(1.i .i.4) {1}{2.3}{4.(4. T(n) ∈ T(2 n ) Cuestión 2 (2 puntos).2).4)} Se rechaza por formar ciclo 4 (3. T(n)= a·T(n .3). (4. (2. ¿En qué orden está el tiempo de ejecución del siguiente algoritmo? Justifica tu respuesta.j.(5.6)} Se rechaza por formar ciclo 6 (2.1)+1 número de llamadas: a=2 reducción por sustracción: b=1 c·n k = 1.(3.5).i .5) 5 (3.j). Que exista una solución quiere decir que existe un camino desde el nodo inicial al nodo final. almacenando la longitud del más largo encontrado hasta el momento. el caso en que un nodo genere infinitos hijos es un caso excepcional que no debería darse.Si existen ramas infinitas sin nodos finales puede que la exploración en profundidad quede atrapada en una de ellas y no encuentre solución aunque ésta exista. Para ello. para cada hijo en adyacentes[nodo] hacer si visitado[nodo] = falso entonces rp(hijo) fsi fpara . la exploración en anchura siempre encuentra la solución. 1997) se presenta el esquema de recorrido en profundidad: procedimiento rp(nodo) {nodo no ha sido visitado anteriormente} visitado[nodo] := cierto. ¿En que casos puede que la exploración en anchura no encuentre solución aunque ésta exista? .Cuando los nodos finales se encuentran cerca del nodo raíz. . entonces.Cuando se busca el camino de menor número de nodos o aristas. Problema (5 puntos). Descripción del esquema e identificación con el problema. Por otro lado. ¿Cuándo resulta más apropiado utilizar una exploración en anchura que en profundidad? . . En la página 330 del libro de texto (Brassard.Cuestión 3 (2 puntos). Dado un grafo dirigido. Elección del esquema. Por todo ello. ¿Y la exploración en profundidad? Razona tus respuestas. . si ésta existe.Cuando el grafo tiene ramas infinitas. Hallar el camino más largo desde un nodo en un grafo finito puede verse como un problema de determinar cuál es la profundidad máxima del árbol. No tiene sentido. con ciclos y con todas las aristas de coste unitario. El esquema de búsqueda exhaustiva en profundidad nos permite resolver este problema. y salvo esta última excepción. implementar un algoritmo que devuelva el número de nodos que contiene el camino más largo sin ciclos que se puede recorrer desde un determinado nodo. finito. será necesario recorrer todos los caminos sin ciclos del grafo. hablar de que la “solución” esté en una componente conexa diferente. La llamada inicial se realiza con el nodo inicial. 4 Estructuras de datos Necesitaremos una estructura para grafo.Así planteado. se explora el nodo 5.visitados) dev long {nodo no ha sido visitado anteriormente} visitados[nodo]:=cierto. Si suponemos un grafo denso (en el que todos los nodos están interconectados entre sí). El nuevo camino encontrado tiene 4 nodos en vez de 5 que sería lo correcto. tenemos que la longitud del camino máximo será n. Cada . long_max:=0. se detiene la exploración porque 3 está marcado como visitado. el 6.visitados). Algoritmo completo procedimiento longitud(nodo. Este problema lo podemos corregir si el vector de visitados tiene un ámbito local en vez de global. Veamos un ejemplo: 1 5 2 6 3 La exploración llega al nodo 1 y lo marca como visitado. simplemente. hallando un camino de longitud 4. para cada hijo en adyacentes[nodo] hacer si visitados[nodo]=falso entonces long:=longitud(hijo. necesitaremos un vector de nodos visitados por rama. Por tanto. fsi fpara devolver long_max+1. una lista de enteros. 3 y 4. y se pasa una copia de padres a hijos (paso de parámetro por valor). también necesitaremos implementar una lista de nodos que puede ser. pero cuando llega al nodo 3. si long>long_max entonces long_max:=long fsi. Análogamente sigue marcando como visitados los nodos 2. y los elementos del vector de visitados inicializados a falso. Además. un nodo no se exploraría 2 veces aunque llegáramos a él desde una rama distinta. Estudio del coste Sea n el número de nodos del grafo. Cuándo el control regresa al nodo 1 para explorar ramas alternativas. La más compacta y sencilla de usar es un vector en el que la componente i tiene un puntero a lista de nodos adyacentes al nodo i. Esto es incorrecto y se debe a que el vector de nodos visitados se plantea de forma global. Por tanto. T(n)∈O(nn) Al mismo resultado se puede llegar razonando sobre la forma del árbol de exploración.llamada recursiva. entonces. k=1 Aplicando la recurrencia para el caso cuando a>1: T(n)∈O(an div b). supondrá una reducción en uno del problema. Así mismo. el número de llamadas recursivas por nivel también ira disminuyendo en uno puesto que en cada nivel hay un nodo adyacente más que ya ha sido visitado. podemos establecer la siguiente recurrencia: T(n)=(n-1)·T(n-1)+n número de llamadas: a=n-1 reducción por sustracción: b=1 c·nk=n. Por último. dentro del bucle se realizan al menos n comparaciones. . . . RESPUESTAS EXAMEN Programación III.T ) crear_monticulo (T. ¿Qué significa que el tiempo de ejecución de un algoritmo está “en el orden exacto de f(n)”? Demostrar que T(n)= n 3 + 9·n 2 ·log(n) está en el orden exacto de n3 .T ) . T [i_padre ]) . Proc crear_monticulo (T [1. Si ( i > 1) y T [i ] > T [i_padre ] entonces Intercambiar (T [i ] .. fFlotar. Otra versión pero en este caso sin usar funciones auxiliares es sustituir el código de flotar por su versión iterativa e insertarlo en la función anterior. La definición formal es Θ(f(n)) = O(f(n)) ∩ Ω (f(n)) . Flotar ( i_padre. Implementar una versión recursiva de una función que tome un vector y le dé estructura de montículo.i ) si i > n devuelve (T ) sino flotar ( i..i +1) fsi fproc La llamada inicial será crear _ monticulo (T . entonces f ( n ) ∈ Θ ( g ( n ) ) g (n) según la relación del apartado 3.n ] .100) Cuestión 2 (2 puntos). . T [1. i_padre := i div 2. Septiembre 2004 (Original) Cuestión 1 (2 puntos). y considerando que si n →∞ lim f (n) ∈ ℜ+ .3 (Ver p. 2 ) . 100 del texto base) y además aplicamos el teorema de L´Hopital (p. 38) obtenemos que: n →∞ lim f (n) f ′( n) con lo que: = lim g ( n ) n→∞ g ′ ( n ) f (n) 3n 2 +18·n·log(n) + 9n 6n+18·log(n) + 27 6 +18 / n n3 + 9·n 2 ·log(n) = lim = lim = lim = lim = 3 2 n →∞ n →∞ n →∞ 3n 6n 6 g ( n ) n→∞ n n →∞ lim = lim ( 6n+18 ) 6 n n →∞ = lim n →∞ ( 6n+18) = 1 6n con lo que n 3 + 9·n 2 ·log(n) ∈ Θ ( n3 ) También será válido hallar las constantes c y d según la definición de la notación Theta (p..n ]) . Proc Flotar ( i. En segundo lugar en términos de coste. PROBLEMA (5 puntos). cuantas veces sea necesario. En el caso de Prim la solución es siempre un ARM y en el otro caso. el algoritmo de Kruskal requiere un tiempo que está en Θ(a· logn) con a el número de aristas. por lo que en el caso peor si el grafo es denso y a se acerca a n 2 . ocurriendo lo contrario para grafos dispersos. los siguientes tres tipos de operaciones.¿En qué se diferencian los algoritmos de Prim y de Kruskal? Discute tanto los algoritmos como su complejidad en los casos peores de cada uno. El primero se denomina texto y el segundo consulta. En primer lugar difieren en la forma de crear el camino mínimo. salvo al final del mismo.Cuestión 3 (2 puntos). que añaden cada una un coste diferente a la edición de la consulta: • Intercambio de dos caracteres consecutivos: coste de edición igual a 1 • Sustitución de un carácter por otro cualquiera: coste de edición igual a 2 • Inserción de un carácter cualquiera en una posición cualquiera: coste de edición igual a 3 Implementar una función que escriba la secuencia de operaciones con menor coste total que hay que realizar sobre el vector consulta para que coincida exactamente con el vector texto. entonces es menos eficiente que el de Prim que es cuadrático. Sean dos vectores de caracteres. La . Al vector consulta se le pueden aplicar. lo son las componentes conexas pero sin referencia al grafo inicial. siendo éste de igual o menor longitud que el primero. valor_sol_actual). sino devolver Solución fsi. Descripción del esquema Función RamificaciónPoda (nodo_raíz) dev nodo inicializarSolución(Solución. si es_mejor(cota. Montículo:=montículoVacío(). 1.Montículo). long: cardinal. Solución:=nodo. último_coincidente: cardinal. poner((cota. el esquema adecuado es Ramificación y Poda. 4. nodo=tupla acciones: lista de Strings. mientras no vacío(Montículo) hacer (cota.nodo):=quitarPrimero(Montículo).Montículo). si no para cada hijo en compleciones(nodo) hacer cota:=acotar(hijo). 3.hijo). /*termina el bucle. poner((cota. montículo no tiene mejores*/ fmientras devolver Solución.función devolverá el coste total de estas operaciones. fpara. Algoritmo completo inicializarSolución .nodo_raíz). fsi. la suma de los costes asociados a cada operación realizada. 2. Debido a que hay un criterio de optimalidad. cota:=acotar(nodo_raíz). existe una función que decide si un nodo puede llevar a una solución mejor que la encontrada hasta el momento. Elección razonada del esquema algorítmico La solución es resultado de una secuencia de pasos o decisiones pero no se puede establecer un criterio óptimo de selección de cada decisión por lo que no puede ser un esquema voraz. es decir. es decir. valor_sol_actual) entonces si válido(nodo) entonces /*cota es el valor real de la mejor solución hasta ahora*/ valor_sol_actual:=cota. Estructuras de datos • • • • Vector de texto Vector de consulta Montículo de mínimos en el que cada componente almacene una solución parcial (nodo) con su cota correspondiente. Por tanto hay que realizar una exploración de las posibles soluciones y buscar la óptima. fsi. coste: cardinal. el menor coste que podría tener completar la solución: que el resto de caracteres de consulta coincidieran (coste=0) y realizar tantas inserciones como caracteres nos falten (coste=2*(long_texto-nodo. “insertar en i. basta con realizar sustituciones de los caracteres de la consulta (coste=2*long_consulta) y realizar la inserción de los caracteres que faltan (coste=3*(long_texto-long_consulta)). long_texto. Función inicializarSolución(long_consulta. acotar(nodo) es: nodo.La solución inicial debe tener un coste asociado mayor o igual que la solución final. • Intercambiarlo por el siguiente si éste coincide con el texto. la estimación es peor que la solución actual. Sin embargo. un nodo será válido (aunque no sea la mejor solución todavía) si: nodo. De esta manera sabremos que si. Solución:=listaVacia(). para i desde long_consulta+1 hasta long_texto hacer añadir(Solución. valor_sol_actual). una cota será mejor que el valor de la solución actual si: cota<valor_sol_actual acotar(nodo) Se trata de realizar una estimación que sea mejor o igual que la mejor solución que se puede alcanzar desde ese nodo. Aún así. aún así.último_coincidente todos los caracteres coinciden. fpara. siempre que la consulta no haya alcanzado el tamaño del texto. no pasaría nada si se incluyen. por esa rama no encontraremos nada mejor y se puede podar. no hay garantías . Además tenemos que construir la solución inicial: la secuencia de sustituciones e inserciones. “sustituir i por texto[i]”). se trata de considerar las posibilidades para que el siguiente carácter de la consulta coincida con el texto: • No hacer nada si ya coinciden de antemano. valor_sol_actual:= 2*long_consulta+3*(long_texto-long_consulta). Si se da el primer caso. fpara. texto[i]”).long) compleciones(nodo) Sabiendo que hasta nodo. no es necesario generar el resto de compleciones porque no se puede encontrar una solución mejor con ninguna de las otras alternativas. vamos a ir haciendo coincidir la solución desde el principio del vector hasta el final.long)). válido(nodo) Un nodo será válido (como solución) si se han hecho coincidir los long_texto caracteres de texto. • Sustituirlo por el correspondiente del texto • Insertar el correspondiente del texto y correr el resto del vector. Es decir. por tanto. De acuerdo con el problema. valor_sol_actual) Como se trata de encontrar la solución de menor coste.último_coincidente==long_texto es_mejor(cota. para i desde 1 hasta long_consulta hacer añadir(Solución. La mejor estimación será sumar al coste ya acumulado. Para ello. para el resto de alternativas. Solución.coste+2*(long_texto-nodo. texto. fsi. hijo). hijo. hijo).acciones=nodo.último_coincidente] entonces hijo:=crearNodo(). Por tanto. insertar(hijo.coste.último_coincidente+1. hijo.último_coincidente.último_coincidente:=nodo. long_texto. hijo).último_coincidente+1]”). /* inserción */ si (nodo.último_coincidente:=nodo.coste+2. si consulta[hijo.coste+3. devolver lista.último_coincidente]”). hijo.acciones=nodo.acciones. hijo).long.coste=nodo.long=nodo.acciones=nodo. hijo. si no /* intercambio */ si consulta[hijo. hijo.coste=nodo.último_coincidente:=nodo. hijo. hijo. añadir(lista.último_coincidente] por consulta[hijo. hijo. hijo. añadir(lista. .acciones.long. hay que incluir todas las alternativas. consulta) dev lista_nodos lista:=crearLista(). insertar(hijo.acciones=nodo. hijo. hijo. consulta[hijo.acciones.último_coincidente+1. hijo:=crearNodo().último_coincidente por texto[hijo.de que una permita encontrar mejor solución que otra. hijo.último_coincidente+1]).”intercambiar consulta[hijo.long+1.acciones. hijo. Función compleciones(nodo. hijo.coste=nodo.long=nodo.coste+1. hijo.”sustituir hijo.acciones.último_coincidente+1]==texto[hijo.último_coincidente+1. hijo. fsi.long.”insertar en hijo.último_coincidente]”).acciones.acciones.long<long_texto) entonces hijo:=crearNodo(). texto[hijo.coste=nodo.último_coincidente:=nodo.último_coincidente] entonces intercambiar(consulta[hijo.long=nodo.último_coincidente].long=nodo. fsi.último_coincidente+1. añadir(lista. añadir(lista. añadir(hijo.último_coincidente]==texto[hijo. /* sustitución */ hijo:=crearNodo(). texto. aunque el coste de la acción puntual sea menor. Montículo). texto. fsi.long).acciones. long_texto. valor_sol_actual).último_coincidente==long_texto entonces valor_sol_actual:=cota. devolver valor_sol_actual. Por tanto. Estudio del coste En este caso únicamente podemos hallar una cota superior del coste del algoritmo por descripción del espacio de búsqueda.long=long_consulta.La función principal quedaría entonces como sigue: Función ajustar(consulta. poner((cota. En el caso peor se generan 3 hijos por nodo hasta llegar a una profundidad de long_texto. nodo. fmientras escribir(solucion).acciones=listaVacia(). si cota<valor_sol_actual entonces si nodo.Montículo). sino /* Ya no puede haber una solución mejor */ escribir(solución). fpara.nodo). long_consulta. devolver valor_sol_actual. Solución.coste+2*(long_texto-nodo. texto. nodo. si no para cada hijo en compleciones(nodo. consulta) hacer cota:= nodo. long_texto. nodo.coste=0. solución:=nodo.long). texto.último_coincidente=0.hijo). mientras ¬vacío(Montículo) hacer (cota. . 5. Montículo:=montículoVacío(). long_texto) dev coste inicializarSolución(long_consulta. el espacio a recorrer siempre será menor que 3long_texto. nodo.coste+2*(long_texto-nodo. fsi. cota:= nodo.nodo):=quitarPrimero(Montículo). poner((cota. por este orden: 1.12] una matriz tal que T [i ] = i para todo i ≤ 12 . minimizando el tiempo global de descarga de todos los archivos. 3.se pide diseñar un algoritmo capaz de repartir la descarga de los n archivos entre los n servidores disponibles.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Septiembre 2004 Reserva Cuestión 1 (2 puntos). a diferentes velocidades de transmisión. (Respuesta: Fundamentos de Algoritmia. de tamaño Ti Kilobytes. Cada tipo de producto tiene asociado un peso y un beneficio concreto. El tamaño de los 3 ficheros es T1=100K. 5. A2. Sea una red de compartición de ficheros. ¿Sería posible aplicar un algoritmo voraz a este planteamiento? Responder razonadamente y plantear un ejemplo que justifique la respuesta. (Respuesta: Fundamentos de Algoritmia.Crear un montículo en tiempo lineal. 2. Elección razonada del esquema algorítmico. Defina qué es un árbol de recubrimiento mínimo. Descripción del esquema usado e identificación con el problema. 215-223). T2=200K. La velocidad de transmisión de datos de cada uno de los servidores viene determinada por una tabla de velocidades de transmisión S. 227. especificando claramente cada paso y mostrando en todo momento el estado de la matriz T. Estructuras de datos. 4. infraccionables y en cantidades ilimitadas. siendo todos ellos capaces de distribuir un número n de archivos. Deseamos cargar un camión. S3). Algoritmo completo a partir del refinamiento del esquema general. Cuestión 3 (2 puntos). La función deberá indicar el tiempo óptimo de descarga. pag. que puede transportar un peso máximo PMAX. PROBLEMA (5 puntos). así como los servidores desde los que serán descargados los n archivos.. A3) en 3 servidores diferentes (S1. pags. Págs. Tome como ejemplo ilustrativo de los datos de entrada una red de compartición de 3 ficheros (A1. T3=300K y la velocidad de transmisión de los 3 servidores viene dado por la matriz: La resolución del problema debe incluir. donde. maximizando el beneficio de los productos transportados por este. Se dispone de n productos diferentes. Estudio del coste. (Respuesta: Fundamentos de Algoritmia. explique alguno de los algoritmos propuestos en la asignatura para hallarlos. aplicándolo paso a paso a un ejemplo. Sij es la velocidad de transmisión del servidor i para el archivo j (en K/seg) . Sea T [1. 343. . 353). similar a las que actualmente se utilizan para intercambiar globalmente archivos por internet. lo que significa que no es posible descargar más de un archivo al mismo tiempo. S2. 189). Esta red se encuentra formada por n servidores. Cuestión 2 (2 puntos). Suponga que la descargase lleva a cabo de manera secuencial. . EVOLUCION COMPONENTES {1} {1.2. aplicándolo paso a paso a un ejemplo. lo son las componentes conexas pero sin referencia al grafo inicial. para un grafo disperso a tiende a n por lo que Kruskal requiere un tiempo que está en Θ ( nlogn ) y el algoritmo de Prim es menos eficiente en este caso. Septiembre 2004 (Reserva) Cuestión 1 (2 puntos). por lo que en el caso peor si el grafo es denso y a se tiende a n ( n . (2.2}{3}{4}{5}{6}{7} {1.5}{6.( 6.4} {1.3)} {(1.2} {1. en cada fase se añade una nueva rama al árbol construido con el valor más pequeño posible.3. debemos obtener un nuevo grafo que sólo contenga las aristas imprescindibles para que todos los nodos queden conectados y la suma de las longitudes de las aristas de del nuevo grafo debe ser tan pequeña como sea posible.6) EVOLUCION SOLUCION ∅ {(1.(4.5).4.2.2.RESPUESTAS EXAMEN Programación III. comenzando por una raíz arbitraria. pags.3.7). Se ordenan las aristas de menor a mayor coste: PASO INICIO 1 2 3 4 5 6 7 ARISTA (1.2.7) EVOLUCION COMPONENTES {1}{2}{3}{4}{5}{6}{7} {1.(1.5).7) (1.4). (2.7)} PRIM: En este algoritmo el árbol de recubrimiento mínimo crece de forma natural.2.5. explique alguno de los algoritmos propuestos en la asignatura para hallarlos. El algoritmo se detiene cuando solo queda una componente conexa. salvo al final del mismo.3.2).7).5).( 4.2)} {(1.7)} {(1.7). Defina qué es un árbol de recubrimiento mínimo.3} {1.5.( 6.2).2). (2.2). (2.4).7)} {(1.3) (4.3).2). el algoritmo de Kruskal requiere un tiempo que está en Θ(a ⋅ logn) con a el número de aristas.3).7) (7.( 4.3). en este caso los dos algoritmos están en Θ ( a ⋅ logn ) . En segundo lugar en términos de coste. KRUSKAL: Partimos del conjunto de aristas T que inicialmente está vacío.2. conexa {(1.3}{4}{5}{6}{7} {1.2.4.5}{6}{7} {1. 215-223).2).( 4.3).5}{6.2).( 4.7} {1.( 6.5} {1.2.(7.(1. con un tiempo que está en Θ ( n 2logn ) entonces es menos eficiente que el de Prim que es cuadrático.2) (2.4)} de la arista ya están en la misma comp.4).3). En el caso de Prim la solución es siempre un AEM y en el otro caso.( 1. (2.4. Dado un grafo.2). Los dos algoritmos se pueden implementar con montículos. el árbol se detiene cuando se han alcanzado todos los nodos.(4.3) (1.5).4.3.4.5.( 4.3).5) (4.4)} {(1.(1.7} PASO INICIO 1 2 3 4 5 6 ARISTA (1.4).5).4) (4.7} EVOLUCION SOLUCION ∅ Se rechaza porque los extremos {(1.5)} {(1. se aplica a problemas que tienen que ver con distribuciones geográficas Hay dos algoritmos que podemos utilizar para resolver este tipo de problemas: Kruskal y Prim.3).5) (6. (2.2).6. (2.5) (4.(1. (2.6.3}{4.5)} {(1. se selecciona en cada paso la arista de menor etiqueta que no provoque ciclo.3. (Respuesta: Fundamentos de Algoritmia. es decir en orden creciente de longitud de sus aristas.2) (2. (2.3.7} {1.( 1. (2.3}{4.2.7} {1.3)} {(1.(4.1) 2 .(4.(4.4) (2.6)} Estos algoritmos difieren en la forma de crear el camino mínimo.2)} {(1.2.3).2). 11.8.16.11. 12.15.15. .31.Inserto el elemento 14 y llamo al procedimiento flotar.18.15]. tiempo lineal.32.. Inserto el elemento 20.11.8....Inserto el elemento 32. Estado de la matriz T [5. Estado de la matriz T [5.20.11.25]. Estado de la matriz T [5. 9.. Estado de la matriz T [5. 15.25. 12.20. 7. Estado de la matriz T [5.12] una matriz tal que T [i ] = i para todo i ≤ 12 .Inserto el elemento 18 y llamo al procedimiento flotar. Estado de la matriz T [11.. 12.15. Estado de la matriz T [5.20.25. Sea T [1.8.20. Estado de la matriz T [5. 15.15.18.20]. 12.i) k ←i Repetir j←k Si j > 1 y T[j ÷ 2] > T[k] entonces k ← j ÷ 2 Intercambiar T[j] y T[k] Hasta j = k Fproc { Añade un elemento cuyo vlor es v al del montículo T[1.n+1].8. especificando claramente cada paso y mostrando en todo momento el estado de la matriz T. Estado de la matriz T [11.32.20.5.16..12].15.12.n]} T[n+1] ← v Flotar(T[1.v) Proc Flotar(T[1.n+1) Fproc final Detallo paso por paso: 12345Inserto el elemento 15.16.11.15.20.18.20.8]..16.15.16].8. 12.11.Inserto el elemento 25. 189). Inserto el elemento 5 y llamo al procedimiento flotar dos veces.32.nodo (T[1. Estado de la matriz T [5.Cuestión 2 (2 puntos).31]. Estado de la matriz T [11. Para Crear un montículo Se inserta un nuevo elemento al final del montículo (primera posición libre) Si se mantiene la propiedad del montículo no hay que hacer ninguna operación Si no se mantiene la propiedad del montículo hay que restaurarla Se restaura la propiedad del montículo intercambiando el nuevo elemento con su padre cuantas veces sea necesario. 10.32.11.12].Inserto el elemento 31.20].18.8. 12.16]. a esta operación de subir en el montículo se la denomina flotar un elemento El nuevo elemento sube en el montículo (flota) y sus padres bajan en el montículo (se hunden) A la operación de bajar en un montículo se la denomina hundir Por ejemplo con el vector T [15. Inserto el elemento 12.14. 15]. 12.11. pag.11.14] Proc añadir .20.Inserto el elemento 8 y llamo al procedimiento flotar.12.32].16.32. 12. 8. Inserto el elemento 11 y llamo al procedimiento flotar.18.n]. 12. Después de realizar estas operaciones se puede observar que el vector tiene estructura de montículo de mínimos..31. Estado de la matriz T [15]. 6.Crear un montículo en (Respuesta: Fundamentos de Algoritmia. 11.31.Inserto el elemento 16.16. Págs. PROBLEMA (5 puntos). a diferentes velocidades de transmisión. S3). Siendo esta la solución óptima. Descripción del esquema usado e identificación con el problema. Elección razonada del esquema algorítmico. 4. T2=200K.Cuestión 3 (2 puntos). minimizando el tiempo global de descarga de todos los archivos. Deseamos cargar un camión. Tome como ejemplo ilustrativo de los datos de entrada una red de compartición de 3 ficheros (A1. donde podemos fragmentar los objetos. lo que nos lleva a una solución óptima. A3) en 3 servidores diferentes (S1. Algoritmo completo a partir del refinamiento del esquema general. ¿Sería posible aplicar un algoritmo voraz a este planteamiento? Responder razonadamente y plantear un ejemplo que justifique la respuesta.se pide diseñar un algoritmo capaz de repartir la descarga de los n archivos entre los n servidores disponibles. queda aún espacio para el objeto c. La variante que no admite solución óptima es la que no nos permite fragmentar los objetos. infraccionables y en cantidades ilimitadas. La sucesión a. (Respuesta: Fundamentos de Algoritmia. 3. La variante del problema de la mochila que admite solución voraz es la variante continua. de tamaño Ti Kilobytes. así como los servidores desde los que serán descargados los n archivos. 5. a 6 8 b 5 5 c 5 5 wi vi Según el algoritmo voraz de la variante continua tomaríamos los objetos según su orden decreciente en función de la relación valor/peso. Cada tipo de producto tiene asociado un peso y un beneficio concreto. 353). el valor conseguido será entonces de 8. 2. Esta red se encuentra formada por n servidores. Suponga que la descargase lleva a cabo de manera secuencial.333) . Dada la siguiente relación de objetos valor-peso para una mochila de capacidad 10 (W=10. . Sea una red de compartición de ficheros. La velocidad de transmisión de datos de cada uno de los servidores viene determinada por una tabla de velocidades de transmisión S. Sij es la velocidad de transmisión del servidor i para el archivo j (en K/seg) . b (vi/wi= 1) y c(vi/wi=1) . que puede transportar un peso máximo PMAX. donde. veamos esto con un ejemplo. Esta variante admite solución voraz porque encontramos una función de selección que nos permite escoger del candidato a cada paso de forma que obtengamos una solución óptima. La función deberá indicar el tiempo óptimo de descarga. por este orden: 1. Estructuras de datos. 343. El tamaño de los 3 ficheros es T1=100K. 227. lo que significa que no es posible descargar más de un archivo al mismo tiempo. A2. S2. Vemos con este ejemplo como el criterio seguido en la variante continua del problema no puede aplicarse en el caso en el que los objetos no puedan fragmentarse. Dicha función consiste en escoger los objetos por orden decreciente (de mayor a menor) según su relación valor/peso. Estudio del coste. De este modo tendríamos: a (vi/wi = 1. T3=300K y la velocidad de transmisión de los 3 servidores viene dado por la matriz: La resolución del problema debe incluir. siendo todos ellos capaces de distribuir un número n de archivos. Se dispone de n productos diferentes. peso máximo de la mochila) . Sin embargo como en esta ocasión NO podemos fragmentar los objetos al introducir en la mochila el objeto a de peso 6 ya no podemos introducir ninguno más. similar a las que actualmente se utilizan para intercambiar globalmente archivos por internet. mientras que si introducimos primero el objeto b. NO. b y c. maximizando el beneficio de los productos transportados por este. con lo que en esta ocasión hemos utilizado el peso total máximo de la mochila y el valor conseguido es de 10. . . . ..... . ¿una estrategia voraz basada en la selección de ficheros de mayor a menor tamaño obtendría en todos los casos la solución óptima?. de forma que continúe siendo óptima. xn). obligatoriamente j = k ya que en caso contrario la solución óptima incluiría todos los ficheros escogidos por la estrategia voraz y alguno más.. b) En caso de que quisiéramos ocupar la mayor cantidad de espacio en el disquete independientemente del número de ficheros almacenados. en caso negativo ponga un contraejemplo. que es menor que el número de ficheros seleccionados por nuestra estrategia voraz como solución al problema ∑x i =1 j i = j . z2. donde . De este modo. entonces podremos afirmar que la solución obtenida por el algoritmo es óptima. un disquete con el mayor número posible de ficheros. i . Si consiguiéramos igualar ambas soluciones en un número finito de pasos. ∑z i =1 n i indicará el número de ficheros seleccionados como solución al problema. ¿el algoritmo propuesto siempre obtendría la solución óptima?. En caso afirmativo demuestre la optimalidad. En caso afirmativo demostrar la optimalidad y en caso negativo ponga un contraejemplo.x i = 1 y 1 .. recordamos que los ficheros se encuentran inicialmente ordenados de menor a mayor tamaño. .. la solución X será (x1. xk. Solución: Apartado A El algoritmo voraz obtendría la solución óptima. Siendo X la solución devuelta por la estrategia voraz e Y la solución óptima al problema.n}.. pero asemejándola cada vez más con la obtenida por el algoritmo voraz. Si ambas soluciones no fueran iguales... {k + 1. { . I2. El fichero k+1 es rechazado puesto que ya no es posible incluir un solo fichero más. De este modo.. es decir... zn) donde zi=0 implica que el fichero fi no ha sido seleccionado como parte de la solución. . In y de un disquete con una capacidad total de almacenamiento de d<I1+I2+. Este modo. f2.. yj implica que yi=0. . En este caso. por lo que ∑y i =1 j i = j − 1 .. vamos a demostrar la optimalidad de la solución comparando una solución óptima con una solución obtenida por el algoritmo voraz. Como suponemos que Y es una solución óptima. fn con tamaños I1. Gestión: 41204UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Primera Semana Febrero 2005 Duración: 2 horas Material permitido: NINGUNO DNI: _______________________ Prueba Presencial Apellidos: ___________________________________________________________________________________ Nombre: _____________________________________ Centro Asociado en el que entregó la práctica: _______________________ Cuestión 1 (2 puntos). yj . a) Suponiendo que se desea maximizar el número de ficheros almacenados y que se hace uso de un planteamiento voraz basado en la selección de ficheros de menor a mayor tamaño.. x2. lo que se contradice con el hecho de que los ficheros del k+1 al n se rechazan por la estrategia voraz porque no caben.k }. xj . iremos transformando la solución óptima de partida.. i . Se dispone de un conjunto de ficheros f1. Comenzando a comparar X con Y de izquierda a derecha. . Demostración: Suponiendo que los programas se encuentran inicialmente ordenados de menor a mayor tamaño.. supongamos que j = 1 sea la primera posición donde xj . Supongamos que la estrategia voraz propuesta selecciona los k primeros ficheros (con 1 = k = n).+In. Notación: Una solución cualquiera viene representada por Z=(z1.Programación III Códigos de asignatura: Sistemas: 402048..x i = 0 . Apartado B El algoritmo voraz no obtendría la solución óptima en todos los casos. Realizando este cambio en la solución óptima Y.7)=7.∑ i =1 n yi = ∑x i =1 n i = k . Esta operación implica fusionar la estructura en la cual se ha incluido la tarea con la estructura de partición inmediatamente anterior. sabemos que lj = ll. hasta alcanzar la posición k. El alumno debe haberlo expuesto y explicado. Repitiendo este proceso. Por la ordenación impuesta a los ficheros. Como en este caso concreto queremos únicamente planificar las 5 primeras tareas p puede reducirse a 5. existe un fichero posterior para compensar el que no se ha cogido antes. si hubiéramos seleccionado los ficheros F2 y F3 hubiera sido posible maximizar el espacio ocupado en el disco. Dada la tabla adjunta de tareas con sus beneficios (gi) y caducidades (di) asociados. Creamos el número apropiado de estructuras de partición. 3. F2 30 F3 15 Cuestión 2 (2 punto). Aplique paso a paso el algoritmo propuesto. p=min(9. esto significa que existe un l > k = j tal que yl = 1. Inicialmente ordenamos la tabla propuesta por orden decreciente de beneficios. únicamente podríamos almacenar el fichero F1. y’l=0 y para el resto y’i = yi. i gi di 1 30 5 2 10 3 3 2 2 4 11 2 5 10 1 6 9 2 7 2 7 8 56 5 9 33 4 Solución: Apartado A El algoritmo más apropiado es el algoritmo secuencia2 explicado y desarrollado en pg 240-241 del texto base y que ha sido utilizado en la práctica (Bloque 1). 2. obtenemos otra solución Y’ en la cual y’j= 1 = xj. Exponga y explique el algoritmo más eficiente que conozca para realizar una planificación de tareas con plazo fijo maximizando el beneficio. es decir. El algoritmo termina cuando ya no queda ninguna estructura de partición libre para asignar tarea.max(di))=min(9. es decir. Aplicando la estrategia voraz propuesta. podemos ir igualando los ficheros en la solución óptima a los de la solución voraz X. suponiendo que se desea realizar una planificación en un tiempo t=5. Contraejemplo: Supongamos la siguiente lista de ficheros con tamaños asociados: Fichero F1 Tamaño 40 Supongamos que la capacidad máxima del disquete es 45. podemos poner en su lugar fj sin sobrepasar la capacidad total. 4. Esta nueva solución es más parecida a X. i gi di 8 9 1 4 5 2 6 3 7 56 33 30 11 10 10 9 2 2 5 4 5 2 1 3 2 2 7 Tabla de costes y caducidades ordenada . que si fl cabe en el disco. ocupando 40 de los 45 de capacidad que tiene el disquete. Sin embargo. Vamos extrayendo cada una de las tareas por orden decreciente de beneficios e incluyéndolas en su correspondiente estructura de partición. por lo que sigue siendo óptima. y tiene el mismo número de ficheros que Y’. Apartado B 1. El proceso puede esquematizarse del siguiente modo: 0 0 1 1 2 2 3 3 4 4 5 5 0 Res[] 1 2 3 4 0 0 1 1 2 2 3 3 4 4 Selecciono tarea 8 0 Res[] 5 1 2 3 4 8 0 0 1 1 2 2 3 3 Selecciono tarea 9 0 Res[] 4 5 1 2 3 9 4 8 0 0 1 1 2 2 Selecciono tarea 1 0 Res[] 3 4 5 1 2 1 3 9 4 8 0 0 1 1 Selecciono tarea 4 0 Res[] 2 3 4 5 1 4 2 1 3 9 4 8 . Exponga un algoritmo iterativo para cada uno de los recorridos explicando las estructuras de datos asociadas. como un algoritmo iterativo para cada uno de ellos basado en el uso de PILAS y COLAS como estructuras de datos asociadas. Solución: En las páginas 338 y 339 del texto base puede encontrarse una explicación tanto de las diferencias entre ambos tipos de recorrido. así como su coste.0 Selecciono tarea 5 0 Res[] 1 2 3 4 5 5 1 4 2 1 3 9 4 8 0 Cuestión 3 (1 punto). Explique las diferencias entre un recorrido en anchura y un recorrido en profundidad. . c) las operaciones que den como resultado valores negativos o números no enteros NO deberán tenerse en cuenta como secuencia válida para obtener una solución./} con las operaciones aritméticas básicas. En nuestro caso. Sólo en el caso de que no exista solución. siendo P=960 y N={1.3.*. como en la mayor parte de los casos va a existir por lo menos una solución y además el enunciado del problema solicita una solución al problema y no todas. La alternativa de aplicar un algoritmo de ramificación y poda no es válida en este caso pues este tipo de algoritmos se caracteriza por obtener la solución óptima a un problema concreto.. En este caso no es necesario optimizar absolutamente nada. mostrando la secuencia de operaciones para obtener el número objetivo P. se trata de un problema de exploración de grafos donde deberemos construir el grafo implícito al conjunto de operaciones posibles con el fin de encontrar una solución al problema. Partiendo de un conjunto N={n1. lo cual implica una exploración exhaustiva del grafo implícito y. Sólo en el caso de que no exista solución al problema. debe tenerse en cuenta que: a) los números del conjunto N pueden utilizarse en la secuencia de operaciones 0 o 1 vez. puesto que dispone de condiciones de corte que lo detienen en cuanto se encuentra una solución. además. Como el alumno ya conoce. pero de menor tamaño. Si P=970. . Como restricciones al problema.    Obviamente no se trata de un problema que pueda ser resuelto por divide y vencerás. Solución: Elección Razonada del Esquema Algorítmico. el algoritmo deberá mostrar la secuencia de operaciones que dé como resultado el valor más próximo. por debajo.2. nm} compuesto por m número positivos y de un conjunto O={+. puesto que no existe ninguna manera de atacar el problema de manera directa que nos lleve a la solución sin necesidad de. se pide obtener una secuencia de operaciones factible para conseguir un número objetivo P. del número objetivo P. . es deseable que la exploración se detenga en el momento en el que encuentre alguna de ellas. la secuencia de operaciones que obtiene la solución exacta es: ((((6*5)*4)*2)*(3+1))=960. en algún momento. n2.-. el conocimiento por parte del algoritmo de cual ha sido la operación más aproximada realizada hasta el momento. este tipo de algoritmos se basan en un recorrido en profundidad o en anchura que no construye el grafo implícito de manera exhaustiva.. Por ejemplo. el algoritmo no encontraría la solución exacta con el conjunto de números inicial y la secuencia más próxima por debajo de P sería ((((6*5)*4)*2)*(3+1))=960. deshacer alguna de las decisiones tomadas. pues la solución es el número objetivo que nos solicitan y no van a existir. por tanto. el problema nos pide la más aproximada por debajo. En caso de no existir solución alguna. Por tanto. la estrategia más apropiada parece la de aplicar un esquema del tipo backtracking o vuelta atrás. b) los resultados parciales de las operaciones pueden utilizarse como candidatos en operaciones siguientes..4. soluciones mejores o peores. De acuerdo a este razonamiento. basaremos el algoritmo en un recorrido en profundidad y no en anchura puesto que en la mayor parte de las ocasiones es necesario combinar prácticamente la totalidad de los elementos de N para obtener la solución. por tanto. Descartamos una exploración ciega en profundidad o en anchura puesto que. que con algún tipo de combinación nos permita encontrar la solución del problema. puesto que no es posible descomponer el problema en subproblemas iguales.Problema (5 puntos). Diseñe un algoritmo que obtenga una solución al problema propuesto.6}. Tampoco se trata de un algoritmo voraz. a partir del conjunto N inicial.5. el recorrido deberá ser completo. Descripción del Esquema Algorítmico de Vuelta Atrás. fun vuelta-atrás(e: ensayo) si valido(e) entonces dev e sino listaensayos . complecciones(e) mientras ← vacia(listaensayos) . ← resultado hacer hijo . primero(listaensayos) listaensayos . resto(listaensayos) si condicionesdepoda(hijo) entonces resultado . vuelta-atrás(hijo) fsi fmientras dev resultado fsi ffun Estructuras de Datos Necesarias La estructura de datos principal para llevar a cabo nuestro algoritmo va a ser aquella encargada de almacenar la información relativa a cada uno de los ensayos generados: Tipo Tensayo= candidatos: vector de int operaciones: vector de TpilaOperaciones solucion: boolean vacio: boolean Operaciones Asociadas --------------------getCandidatos():vector Devuelve el vector de candidatos para operar con él. getOperaciones():vector Devuelve el vector de operaciones(pilas) para operar con él. getCandidato(indexCand int):int Devuelve el candidato que se encuentra en la posición indexCand. removeCandidato(indexCand int):void Elimina el candidato que se encuentra en la posición indexCand. setCandidato(candidato int,indexCand int):void Inserta el candidato candidato en la posición indexCand del vector de candidatos. getOperacion(indexOp int):TPilaOperaciones Devuelve la operación(pila) que se encuentra en la posición indexOp. removeOperacion(indexOp int):void Elimina la pila de operaciones que se encuentra en indexOp. setOperacion(operacion TpilaOperaciones, indexOp int):void Inserta la pila de operaciones operación en la posición indexOp del vector de operaciones. setSolucion(solucion boolean):void Marca el ensayo como solución válida. isSolucion():boolean Devuelve un boolean que indica si el ensayo es o no solución. isVacio():bolean Devuelve un bolean que indica si el ensayo es o no vacio. setVacio(vacio boolean)void Marca el ensayo como vacio. Tipo TpilaOperaciones= pila: pila de String Operaciones Asociadas --------------------pushNumber(value int):void Añade un número a la pila. La lógica de la operación transforma el entero de entrada en una cadena de caracteres para poder insertarlo en la pila. pushOperator(oper char):void Añade un operador a la pila. La lógica de la operación transforma el entero de entrada en una cadena de caracteres para poder insertarlo en la pila. El principal problema del ejercicio se encuentra en determinar cómo vamos a ir construyendo el grafo implícito y cómo vamos a representar las operaciones que ya han sido llevadas a cabo. Para ello vamos a tener en cuenta lo siguiente: 1. Nuestro algoritmo siempre va a trabajar sobre un conjunto de candidatos que recogerá inicialmente los valores asociados y, posteriormente, los valores obtenidos al ir realizando cada una de las operaciones. Esta es la función del elemento candidatos de Tensayo. 2. Para poder recordar qué operaciones se han llevado a cabo y mostrárselas al usuario al fin del algoritmo, es necesario desplegar un almacén de información paralelo a candidatos que, para cada uno de los candidatos recoja las operaciones que éste ha soportado hasta el momento. Con este fin se crea el elemento operaciones, que no es más que un vector donde cada elemento representa una pila de operaciones y operandos que, en notación postfija, representan el historial de operaciones de dicho elemento. 3. Finalmente, el elemento solución marca el ensayo como solución o no, dependiendo si alberga la solución al problema. Veamos con un ejemplo el funcionamiento de esta estructura de datos. Supongamos que nuestro conjunto inicial es N={1, 2, 3, 4}. El ensayo correspondiente a esta situación inicial vendría descrito por: Tipo Tensayo= candidatos: vector de int operaciones: vector de TpilaOperaciones solucion: bolean ENSAYO -----candidatos:<1,2,3,4> operaciones < 1 2 3 4 > solucion: false Supongamos ahora que operamos el candidato 2 y el candidato 4 con el operador ‘+‘. El nuevo formato del ensayo sería el siguiente: ENSAYO -----candidatos:<1,6,3> 2 4 operaciones < 1 + 3 > solucion: false vacio: false Nótese que: 1. Desaparece el elemento que ocupa la posición 3 del vector y su pila asociada. 2. El vector de candidatos ahora almacena el valor 6 allí donde se ha realizado la operación. 3. El vector de operaciones ha actualizado la pila de operaciones, reflejando la nueva situación en notación postfija (2,4,+) Supongamos que ahora operamos el candidato 6 con el candidato 3 utilizando el operador ‘-‘. El nuevo ensayo quedaría: ENSAYO -----candidatos:<1,3> 2 4 + 3 operaciones < 1 > solucion: false vacio: false Finalmente si operamos el candidato 1 con el candidato 3 utilizando el operador ‘*’. El ensayo obtenido sería: ENSAYO -----candidatos:<3> 2 4 + 3 1 operaciones < * > solucion: false vacio: false Como podemos observar, el valor final obtenido combinando todos los valores iniciales, y de acuerdo a las operaciones descritas, sería 3 y el historial completo de todas las operaciones realizadas podría mostrarse deshaciendo la pila en formato postfijo generada (2,4,+,3,-,1,*). Algoritmo Completo. fun vuelta-atrás(e: Tensayo):Tensayo si valido(e) entonces solucion . e solucion.setSolucion(true); dev solucion sino listaensayos . complecciones(e) mientras ← vacia(listaensayos) . ← solucion.isSolucion() hacer hijo . primero(listaensayos) listaensayos . resto(listaensayos) si ← podar(hijo) entonces solucion . vuelta-atrás(hijo) sino solucion . mejor(e) fsi fmientras dev solucion fsi ffun Nótese que solución es un ensayo, que inicialmente es vacío, y que contendrá la solución en caso de existir o la serie de operaciones que más se aproximen en caso de que esto no ocurra. Solución se define externamente a la función vuelta-atrás y, por eso, puede manipularse desde cualquiera de las funciones sin ser necesario enviarla a éstas como parámetro. Igualmente, la el valor objetivo P, también es utilizado globalmente por la función vuelta atrás. Las funciones asociadas al algoritmo son las siguientes: valido(e Tensayo):boolean Función que devuelve true si el ensayo que recibe como parámetro es solución al problema, es decir, si contiene algún candidato cuyo valor sea P. Devuelve false en caso contrario. complecciones(e Tensayo):lista Función que devuelve la lista de hijos correspondientes a un ensayo concreto. La política de generación de hijos que seguiremos será la siguiente: Para cada candidato, complecciones genera todas las combinaciones posibles de éste con cada uno de los demás, haciendo uso del conjunto de operaciones posibles. podar(e Tensayo):bolean Función que devuelve un boolean dependiendo si es posible continuar explorando por el ensayo e que recibe como parámetro o no. La única condición de poda que impondremos será que alguno de los candidatos calculados hasta el momento sobrepase el valor de P. mejor(e Tensayo):Tensayo Función que compara el ensayo e, que recibe como parámetro, con la solución calculada hasta el momento. Devuelve a la salida aquel ensayo que contenga el candidato más próximo a la solución solicitada. fun valido(e: Tensayo):boolean para c desde 0 hasta numCandidatos hacer candidato . e.getCandidato(c) si candidato = P entonces dev true fsi fpara dev false ffun fun podar(e: Tensayo):boolean para c desde 0 hasta numCandidatos hacer candidato . e.getCandidato(c) si candidato > P entonces dev true fsi fpara dev false ffun fun mejor(e: Tensayo):Tensayo v1 . valorMax(e) v2 . valorMax(solucion) si v1<v2 entonces dev solucion sino dev e fsi ffun fun valorMax(e: Tensayo):int value . e.getCandidato(0) para cada c desde 1 hasta numCandidatos hacer valAux . e.getCandidato(c) si (valAux>value) . (valAux<=P) entonces value=valAux fsi fpara dev value ffun fun complecciones(e: Tensayo):vector para c1 desde 0 hasta numCandidatos hacer para c2 desde c1+1 hasta numCandidatos hacer hijo=obtieneHijo(e,’+’,c1,c2) si (← hijo.isVacio()) entonces vHijos.addElement(hijo) fsi hijo=obtieneHijo(e,’-’,c1,c2) si (← hijo.isVacio()) entonces vHijos.addElement(hijo) fsi hijo=obtieneHijo(e,’*’,c1,c2) si (← hijo.isVacio()) entonces vHijos.addElement(hijo) fsi hijo=obtieneHijo(e,’/’,c1,c2) si (← hijo.isVacio()) entonces vHijos.addElement(hijo) fsi fpara fpara dev vHijos ffun getCandidato(c1Index) e.getCandidato(c2Index) e nuevoEnsayo . int c2Index):Tensayo c1 . -1 fsi fsi fsi fsi fsi si (res >=0) entonces nuevoEnsayo .getOperacion(c1) pila2=e. c1-c2 sino si (operator=’*’) entonces res . char operator. e pila1=e.setCandidato(res. (c1%c2=0) entonces res .c1) dev nuevoEnsayo sino dev ensayoVacio fsi ffun Nótese como la funcion generaNuevaPila recibe como parámetros las dos pilas ya existentes (pertenecientes a cada uno de los candidatos).pila2. . c2 . así como el operador que va a ser utilizado para combinar ambos candidatos y genera como resultado la nueva pila correspondiente al candidato generado.removeOperacion(c2) nuevoEnsayo. int c1Index.c1) nuevoEnsayo. si (operator=’+’) entonces res . c1*c2 sino si (operator=’/’) entonces si (c2!=0) .setOperacion(pila.getOperacion(c2) pila=generaNuevaPila(pila1.fun obtieneHijo(e: Tensayo. c1/c2 sino res . c1+c2 sino si (operator=’-‘) entonces res .operator) nuevoEnsayo. e.removeCandidato(c2) nuevoEnsayo. . . . Algoritmo completo a partir del refinamiento del esquema general 5. lona(n-2. j: entero) para i desde 1 hasta n div 4 hacer j:=j+i. fsi Planteamos una recurrencia con reducción del problema mediante sustracción n: tamaño del problemas a: número de llamadas recursivas b: reducción del problema en cada llamada recursiva n-b: tamaño del subproblema nk: coste de las instrucciones que no son llamadas recursivas Recurrencia: T(n)= c·nk a·T(n-b)+c·nk Θ(nk) Θ(nk+1) Θ(an div b) si a<1 si a=1 si a>1 si 0≤n<b si n≥b T(n)∈ a=2. Estudio del coste . Elección razonada del esquema algorítmico 2. nk=n. b=2.j).Programación III Solución Prueba Presencial Segunda Semana Enero . Descripción del esquema usado e identificación con el problema 3. fpara si n>1 entonces lona(n-2. k=1 Por tanto. La resolución del problema debe incluir. Demuestra cuál es el orden exacto de complejidad en función de la variable n. escribir “j”. del siguiente programa: 1 2 3 4 5 6 7 8 9 procedimiento lona (n: entero. puesto que se le está aplicando la raíz cuadrada y no el producto de una constante.Febrero de 2005 UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Duración: 2 horas Material permitido: NINGUNO Cuestión 1 (2 puntos).n-j). T(n)∈ Θ(2n div 2) Nota: Θ(2n div 2) no es equivalente a Θ(2n). Estructuras de datos 4. por este orden: 1. 225). Y) dev Y fsi . Si un determinado nodo no es una solución parcial. por muchas más reinas que se coloquen a continuación nunca se va a encontrar una solución final. Brassard. Resolver independientemente cada subejemplar (subproblema) 3. Utiliza el esquema de divide y vencerás para implementar una función que tome un vector de enteros y le dé estructura de montículo con el menor coste posible. entonces la solución final no se puede alcanzar a partir de dicho nodo y la rama se poda.Cuestión 2 (1 punto). 2. Elección del esquema (0 puntos) No es necesario razonar la elección del esquema puesto que viene impuesto en el problema. (Solución en el libro de texto.. X1. El problema de colocar N reinas en un tablero de NxN sin que se amenacen entre sí es un problema que se puede resolver mediante vuelta atrás. Si un nodo no cumple esta condición. El esquema de vuelta atrás es una búsqueda en profundidad pero en la que se articula un mecanismo para detener la búsqueda en una determinada rama (poda). puesto que en cada nivel de la búsqueda se establece un problema parcial: en el nivel i se trata de colocar i reinas en un tablero de NxN sin que se amenacen entre sí. Combinar los resultados para construir la solución del ejemplar original Función DivideVencerás(X) si suficiente_pequeño(X) entonces dev subalgoritmo_básico(X) si no Descomponer(X. Descomponer el ejemplar en subejemplares del mismo tipo que el ejemplar original 2.Xn) para i=1 hasta n hacer Yi:=DivideVencerás(Xi).Yn. Problema (5 puntos). fpara Recombinar(Y1. pág. Cuestión 3 (2 puntos). 1. Demuestra por inducción que el algoritmo de Dijkstra halla los caminos mínimos desde un único origen hasta todos los demás nodos del grafo. Para alcanzar una solución final es necesario que los pasos intermedios sean soluciones parciales al problema. Esquema general (0..5 puntos) 1. Esto se implementa en el esquema de vuelta atrás mediante la función condiciones_de_poda o función de factibilidad. ¿En qué se diferencia una búsqueda ciega en profundidad y un esquema de vuelta atrás? Pon un ejemplo. una para 2i y otra para 2i+1. Ya que estamos en un esquema divide y vencerás.n]. Por último.m/2].. por tanto. Estructuras de datos (0 puntos) No se necesita ninguna estructura adicional a parte del vector de entrada. Únicamente se tiene que decidir si el nodo debe intercambiarse por alguno de sus hijos. Una solución que recorra completamente el vector y proceda a hundir o flotar cada elemento siempre tendrá mayor coste. hay que colocar la raíz i en su lugar.. M[1. M) fsi si (2i≤m) entonces hundir(M. Para ello. Procedimiento crear_montículo(i. dividir el vector en dos mitades M[1. descomponemos el problema en los dos subárboles bajo el nodo i. Procedimiento hundir(T[1. Algoritmo completo (3 puntos) Como se trata de un árbol binario. es decir.. Como puede observarse. Cada subárbol a su vez debe tener estructura de montículo lo que resulta un problema del mismo tipo que el original y.m] y tratar de resolver cada una de ellas supone un error. y en caso afirmativo intercambiarse con el mayor de ellos y realizar la correspondiente llamada recursiva para seguir “hundiéndose”.3.M). i) hmayor:=i si (2i ≤ n) y (T[2i] > T[hmayor]) entonces hmayor=2i . corresponde a sendas llamadas recursivas. 4. M) fsi si (2i+1)<m entonces crear_montículo(2i+1. el que tiene por raíz 2i y el que tiene por raiz 2i+1.m]) si 2i<m entonces crear_montículo(2i. podemos plantear el procedimiento hundir como un problema de reducción. hay que “hundirla”. M[(m/2)+1. i) fsi M[8] 2 M[4] 4 M[5] M[9] 1 6 M[10] 7 5 M[6] M[7] 2 M[2] 7 M[3] 9 M[1] 1 La llamada inicial será: crear_montículo(1.. T(n)= c·nk a·T(n/b)+c·nk Θ(nk) Θ(nk log n) Θ(nlogb a) si 0≤n<b si n≥b si a<bk si a=bk si a>bk T(n)∈ a=1. el problema se reduce en uno. T(n)= c·nk a·T(n-b)+c·nk Θ(nk) Θ(nk+1) Θ(an div b) si a<1 si a=1 si a>1 si 0≤n<b si n≥b T(n)∈ . Estudio del coste (1. k=0. el problema se ha reducido a la mitad. En cada llamada recursiva bajamos un nivel por lo que el problema se puede expresar mediante una recurrencia con reducción del problema por sustracción. ya que hundir prosigue por uno de los dos subárboles y. c·nk=c. T[hmayor]) hundir(T[1.. si en cada paso se baja un nivel. por tanto. a=bk luego T(n)∈Θ(log n) El coste de crear_montículo puede expresarse. hmayor) fsi 5. Es decir. vamos a utilizar un cambio de variable: Sea h la altura del montículo de n nodos: h=log2 n.n]. Para resolverlo. entonces mediante la siguiente recurrencia: T(n)=2·T(n/2)+log n Sin embargo.fsi si (2i < n) y (T[2i+1] > T[hmayor]) entonces hmayor=2i+1 fsi si (hmayor > i) entonces intercambiar(T[i]. b=2. esta recurrencia no se puede resolver con la fórmula anterior puesto que la parte no recursiva no tiene una complejidad polinomial.5 puntos) El coste del procedimiento hundir se puede plantear mediante una recurrencia con reducción del problema por división. Deshaciendo el cambio de variable: 2h=2log2 n=n. por tanto. ahora ya podemos plantear la recurrencia para crear_montículo: T(h)=2·T(h-1)+h. donde a=2 y b=1 y.En el caso de hundir T(h)=T(h-1)+c. luego T(h)∈Θ(h). . T(h)∈Θ(2h). Sin embargo. con a=1 y b=1. que deshaciendo el cambio de variable lleva a un tiempo en función de n: T(n)∈Θ(log n) como habíamos demostrado antes. NOTA: cualquier solución que tenga mayor coste no será puntuada. y T(n)∈Θ(n). que es el menor coste posible para dar estructura de montículo a un vector. . En el contexto de elegir un esquema algorítmico para resolver un problema de optimización con restricciones.5 puntos). Sirva como ayuda que para que un candidato tenga mayoría absoluta considerando todo el vector (al menos N/2+1 de los N votos). es condición necesaria pero no suficiente que tenga mayoría absoluta en alguna de las mitades del vector.. Descripción del esquema divide y vencerás y su aplicación al problema (0. Sea T(n)=4n2-3n+2 el tiempo de ejecución de un algoritmo. ¿Qué algoritmo utilizarías para determinar con un coste lineal si una persona ha obtenido más de la mitad de los votos? Cuestión 2 (1 punto). Estudio del coste del algoritmo desarrollado (1. Sea V un vector en el que la componente V[i] contiene el número del candidato que ha elegido el votante i. que decida si algún candidato aparece en más de la mitad de las componentes (tiene mayoría absoluta) y que devuelva su nombre. Implementa un programa cuya función principal siga el esquema divide y vencerás. Suponga que N personas numeradas de 1 a N deben elegir por votación a una entre ellas.5 puntos) . Sea V[1. Algoritmo completo a partir del refinamiento del esquema general (3 puntos) 3. por este orden: 1. La resolución del problema debe incluir.N] un vector con la votación de unas elecciones. ¿cuándo se puede resolver mediante un esquema voraz y en qué casos sería necesario utilizar un esquema de ramificación y poda? Cuestión 3 (2 puntos). La componente V[i] contiene el nombre del candidato que ha elegido el votante i. 2. Demuestra si es cierta o falsa cada una de las siguientes afirmaciones (0.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Septiembre 2005 – Original Cuestión 1 (2 puntos).5 puntos cada una): T (n) ∉ O(n 2 log n) T ( n) ∉ O ( n 3 ) T (n) ∈ Ω(n log n) T ( n) ∈ O ( n 2 ) PROBLEMA (5 puntos). . Programación III Solución Prueba Presencial Original Septiembre de 2005 UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Prueba Presencial Duración: 2 horas Material permitido: NINGUNO Cuestión 1 (2 puntos). Suponga que N personas numeradas de 1 a N deben elegir por votación a una entre ellas. Sea V un vector en el que la componente V[i] contiene el número del candidato que ha elegido el votante i. ¿Qué algoritmo utilizarías para determinar con un coste lineal si una persona ha obtenido más de la mitad de los votos? Podría utilizarse una estrategia similar a la que emplea para ordenación el algoritmo de la casilla (página 80 del libro), pero trasladado al conteo de elementos. La siguiente función almacena en el vector votos el número de votos que va sumando cada candidato votado. Devuelve un valor TRUE si hay alguno con mayoría indicando de qué candidato se trata: función contar_votos(V[1..N) dev (booleano, elegido) votos[1..N]=0; para i=1 hasta N hacer votos[V[i]]=votos[V[i]]+1; si votos[V[i]]>N/2 entonces devolver (TRUE,V[i]) fsi; fpara devolver (FALSE,0); Cuestión 2 (1 punto). En el contexto de elegir un esquema algorítmico para resolver un problema de optimización con restricciones, ¿cuándo se puede resolver mediante un esquema voraz y en qué casos sería necesario utilizar un esquema de ramificación y poda? Para resolverlo con un esquema voraz es necesario que exista una función de selección de candidatos y una función de factibilidad que decida si se acepta o rechaza el candidato, de manera que la decisión es irreversible. Si no es posible encontrar las funciones de selección y de factibilidad de manera que se garantice que la elección de un candidato lleva a la solución óptima, entonces optaríamos por otro esquema como el de ramificación y poda. Cuestión 3 (2 puntos). Sea T(n)=4n2-3n+2 el tiempo de ejecución de un algoritmo. Demuestra si es cierta o falsa cada una de las siguientes afirmaciones (0.5 puntos cada una): Recordamos la regla del límite: ⎧ c entonces f (n) ⎪ lím = ⎨ 0 entonces n→∞ g ( n ) ⎪ + ∞ entonces ⎩ a) T(n) ∉ O(n2 ln n) f ( n ) ∈ Θ( g ( n )) f ( n ) ∈ O ( g ( n )), f ( n ) ∉ Θ( g ( n )) f ( n ) ∈ Ω( g ( n )), f ( n ) ∉ Θ( g ( n )) 4n 2 − 3n + 2 8n − 3 8 = lím = =0 2 n →∞ n → ∞ 2n ln n + n 2 ln n + 3 n ln n lím Luego pertenece al orden indicado y la cuestión a) es FALSA b) T(n) ∉ O(n3) lím 4n 2 − 3n + 2 8n − 3 8 = lím = =0 3 n →∞ n →∞ 3n 2 6n n Por lo que T(n) pertenece a O(n3 ) y la cuestión b) es FALSA c) T(n) ∈ Ω(n log n) con lo que c) es CIERTO 4n 2 − 3n + 2 8n − 3 8 lím = lím = = +∞ n →∞ n →∞ ln n + 1 1 n ln n n d) T(n) ∈ O(n2) 4n 2 − 3n + 2 8n − 3 8 = lím = = 4 ∈ ℜ+ 2 n →∞ n →∞ 2n 2 n lím En este caso, al ser T(n) ∈ Θ(n2) se cumple también que T(n) ∈ O (n2) luego d) es CIERTO Problema (5 puntos). Sea V[1..N] un vector con la votación de unas elecciones. La componente V[i] contiene el nombre del candidato que ha elegido el votante i. Implementa un programa cuya función principal siga el esquema divide y vencerás, que decida si algún candidato aparece en más de la mitad de las componentes (tiene mayoría absoluta) y que devuelva su nombre. Sirva como ayuda que para que un candidato tenga mayoría absoluta considerando todo el vector (al menos N/2+1 de los N votos), es condición necesaria pero no suficiente que tenga mayoría absoluta en alguna de las mitades del vector. La resolución del problema debe incluir, por este orden: 1. Descripción del esquema divide y vencerás y su aplicación al problema (0.5 puntos). El esquema general Divide y Vencerás consiste en: 1. Descomponer el ejemplar en subejemplares del mismo tipo que el original 2. Resolver independientemente cada subejemplar 3. Combinar los resultados para construir la solución del ejemplar original Más formalmente: Función DivideVencerás(X) dev Y si suficiente_pequeño(X) entonces dev subalgoritmo_básico(X) si no (X1..Xn)=Descomponer(X); para i=1 hasta n hacer Yi:=DivideVencerás(Xi); fpara Y=Recombinar(Y1..Yn); dev Y; fsi 2. Algoritmo completo a partir del refinamiento del esquema general (3 puntos) función contar(V[1..N], i, j) dev (tiene_mayoría, candidato, num_votos) si (i==j) entonces dev (TRUE, V[i], 1) si no /* Descomponer */ (tiene_mayoría1, candidato1, num_votos1)=contar(V, i, (i+j)÷2); (tiene_mayoría2, candidato2, num_votos2)=contar(V, (i+j)÷2+1, j); /* Recombinar */ si tiene_mayoría1 entonces para k desde (i+j)÷2+1 hasta j hacer si es_igual(V[k], candidato1) entonces num_votos1=num_votos1+1; fsi fpara si (num_votos1>(j-i+1)/2) entonces devolver (cierto, candidato1, num_votos1); fsi fsi si tiene_mayoría2 entonces para k desde i hasta (i+j)÷2 hacer si es_igual(V[k], candidato2) entonces num_votos2=num_votos2+1; fsi fpara si (num_votos2>(j-i+1)/2) entonces devolver (cierto, candidato2, num_votos2); fsi fsi devolver (falso,””,0); fsi Llamada inicial contar(V,1,N); 3. Estudio del coste del algoritmo desarrollado (1.5 puntos) Planteamos la ecuación de recurrencia T(n) = 2·T(n÷2) + n÷2 + n÷2 = 2·T(n÷2) + n La reducción del problema se realiza mediante división, cuyos casos son los siguientes: Θ(nk) T(n) = Θ(nk log n) Θ(nlogba) si a<bk si a=bk si a>bk donde: n: tamaño del problema a: número de llamadas recursivas n/b: tamaño del subproblema nk: coste de las instrucciones que no son llamadas recursivas Aplicado a nuestro problema: c·nk=n; k=1; b=2; a=2; bk=21=2 a=bk luego T(n) ∈ Θ(n log n) UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Septiembre 2005– Reserva Cuestión 1 (1 punto). Dado m = [ 2, 6, 4,12, 7, 4, 4] . Comprobar si es o no montículo de mínimos. Si no lo es, programar una función para convertirlo en montículo y aplicarla a ‘m’. Sino, programar una función de añadir elemento mediante la función “flotar” y aplicarlo al valor 3. En ambos casos escribir el montículo resultante y detallar todos los pasos. Cuestión 2 (2 puntos). Demostrar formalmente si existe relación de pertenencia entre f(n) y O ( g ( n ) ) Y también entre g(n) y O ( f ( n ) ) considerando f ( n ) = 2n y g ( n ) = 22 n . Cuestión 3 (2 puntos). Analizar y hallar el coste de los algoritmos siguientes (Considerar de orden Ο ( n 2 ) la función h ( n, r , i ) ) PROCEDIMIENTO a (n,k:entero):entero; VAR i,r:entero; COMIENZO SI n < 3 ENTONCES DEVOLVER(1); SINO COMIENZO r ← a (n DIV 2, k-1); r ← r + a (n DIV 2, k+1); PARA i ← 1 HASTA n^2 HACER r ← r + k; PROCEDIMIENTO b (n,k:entero):entero; VAR i,r:entero; COMIENZO SI n < 4 ENTONCES DEVOLVER(1); SINO COMIENZO r ← r + b (n DIV 2, k+1); PARA i ← 1 HASTA n HACER COMIENZO r ← h (n,r,i); r ← r + h (n,r-1,i); FIN r ← r + b (n DIV 2, k+2); DEVOLVER (r); FIN FIN DEVOLVER (r); FIN FIN Problema (5 puntos). El Sudoku es un pasatiempo consistente en rellenar con cifras del 1 al 9 una cuadrícula de 81 (9x9) casillas distribuidas a su vez en 9 cajas de 3x3. El juego consiste en rellenar cada caja de 9 casillas con cifras del 1 al 9 sin repetirlas. No se pueden repetir tampoco cifras en líneas o columnas de la cuadrícula. Se pide diseñar un algoritmo que complete por nosotros este pasatiempo. La tabla adjunta muestra un ejemplo resuelto. La resolución del problema debe incluir, por este orden: 1. Elección razonada del esquema algorítmico. (0,25) 2. Refinamiento e identificación con el problema. (0,5) 3. Estructuras de datos. (0,25) 4. Algoritmo completo a partir del refinamiento del esquema general. (3,5) 5. Estudio del coste. (0,5) . Sino. Comprobar si es o no montículo de mínimos. 4. V[j] := V[k]. 4. 4. quedando de la siguiente manera m = [ 2. 6.v) T[n+1] ← v Flotar(T[1. 4.nodo (T[1.12. 7.12.3] . 2 6 4 12 7 4 4 Como es un montículo de mínimos inserto el valor 3 al montículo m = [ 2. 6. V[k] := aux. Fproc Intercambiar.n]. aux := V[j]. 4.k). 4.3.. 4] . 6. 7.. 4. 4.RESPUESTAS EXAMEN Programación III. 6. 4. 4. Dado m = [ 2. 4.n+1) Fproc Proc Flotar(V[1.12] Proc añadir . 4. 4.. en este caso no es mayor y por lo tanto la variable j=k terminando el procedimiento. m = [ 2. comparo T [ 4] > T [8] como es mayor entonces k=4 y hago intercambio de j y k.12] Con la variable actualizada k=4 vuelvo a comparar T [ 2] > T [ 4] como es mayor entonces k=2 y hago intercambio de j y k. Septiembre 2005 (Reserva) Cuestión 1 (1 punto). Para que el vector siga manteniendo la estructura de montículo utilizo el procedimiento flotar. var aux.3. 6.n+1].12.n]. 4. m = [ 2. 4. 7..12] Con la variable actualizada k=2 vuelvo a comparar T [1] > T [ 2] . 7.. 4. programar una función para convertirlo en montículo y aplicarla a ‘m’.. 7. Si no lo es.i) k ←i Repetir j←k Si j > 1 y V[j ÷ 2] < V[k] entonces k ← j ÷ 2 Intercambiar V[j] y [k] Hasta j = k Fproc Proc Intercambiar(int j. 6. . 7. El montículo queda así: m = [ 2.3. En ambos casos escribir el montículo resultante y detallar todos los pasos. 4] . programar una función de añadir elemento mediante la función “flotar” y aplicarlo al valor 3. Si lim 2.Y también entre g(n) y O ( f ( n ) ) considerando f ( n ) = 2n y g ( n ) = 22 n . Si lim n →∞ n →∞ f (n) ∈ 0 . entonces f ( n ) ∈ O ( g ( n ) ) pero g ( n ) ∉ O ( f ( n ) ) g ( n) f ( n) ∈ +∞ . entonces f ( n ) ∈ O ( g ( n ) ) y g ( n) g ( n) ∈ O ( f ( n )) n →∞ . Si lim 3. Demostrar formalmente si existe relación de pertenencia entre f(n) y O ( g ( n ) ) lim n →∞ f (n) 2n 2n 1 1 = lim 2 n = lim n n = lim n = lim ∞ = 0 n →∞ 2 n →∞ 2 ⋅ 2 n →∞ 2 n →∞ 2 g ( n) Y por la regla de los límites deducimos que f ( n ) ∈ O ( g ( n ) ) pero g ( n ) ∉ O ( f ( n ) ) En la segunda cuestión compruebo que g(n) está en O ( f ( n ) ) lim n →∞ g ( n) 22 n 2n ⋅ 2n 2n 2∞ = lim n = lim n = lim = lim =∞ n →∞ n →∞ 1 n →∞ 1 2 f ( n ) n→∞ 2 Y por la regla de los límites deducimos que g ( n ) ∉ O ( f ( n ) ) pero f ( n ) ∈ O ( g ( n ) ) Regla del límite: 1. Primer compruebo que f(n) está en O ( g ( n ) ) Cuestión 2 (2 puntos). entonces f ( n ) ∉ O ( g ( n ) ) pero g ( n ) ∈ O ( f ( n ) ) g ( n) f ( n) ∈ℜ+ . Aplicando la resolución genérica de las expresiones del tipo T(n) = aT(n/b) + cnk y siendo 2 < 2 3 el coste es O(n3). Dentro de la condición tiene: o bien una instrucción constante. a = 2.k:entero):entero.r:entero. y otra llamada recursiva de tamaño n/2. VAR i. k+1).Cuestión 3 (2 puntos). //En el segundo caso de la llamada recursiva hay otra instrucción simple añadida. PARA i ← 1 HASTA n HACER COMIENZO r ← h (n. /*más una instrucción simple*/. DEVOLVER (r). b = 2.r-1. DEVOLVER (r). i) de coste cuadrático. k = 3 .i). r.r. FIN FIN El procedimiento uno tiene una instrucción condicional de coste constante. SINO COMIENZO r ← r + b (n DIV 2. FIN FIN PROCEDIMIENTO b (n. k = 2 el segundo algoritmo: está formado por una instrucción condicional de coste constante cuyo cuerpo incluye secuencialmente: (i) una llamada recursiva de tamaño n/2. o bien dos llamadas recursivas. que no tenemos en cuenta para el cálculo. k+1). i ) ) PROCEDIMIENTO a (n. Un bucle en el que se repite n2 veces un cálculo consistente en una instrucción constante La expresión queda T(n) = T(n/2) + T(n/2) + n2 (1) lo que equivale a: T(n) = 2T(n/2) + n2. Aplicando la resolución genérica de las expresiones del tipo T(n) = aT(n/b)+cnk lo que equivale a T(n) = 2T(n/2) + n2 y siendo 2 < 2 2 el coste es O(n2). COMIENZO SI n < 4 ENTONCES DEVOLVER(1). que no tenemos en cuenta para el cálculo. k-1). ambas invocan la función con un tamaño n/2. lo que equivale a T(n) = 2T(n/2) + 2n3 . y por último (v) una instrucción simple. PARA i ← 1 HASTA n^2 HACER r ← r + k. SINO COMIENZO r ← a (n DIV 2.r:entero. Analizar y hallar el coste de los algoritmos siguientes (Considerar de orden Ο ( n 2 ) la función h ( n. (ii) un bucle en el que se repite n veces un cálculo consistente en llamar dos veces a una función h(n. r ← r + a (n DIV 2. b = 2. r .k:entero):entero. VAR i. r ← r + h (n. Sumando los términos nos sale T(n) = T(n/2)+ n (2n2)+T(n/2). k+2). COMIENZO SI n < 3 ENTONCES DEVOLVER(1). a = 2.i). FIN r ← r + b (n DIV 2. Elección razonada del esquema algorítmico. (0. (3. Algoritmo completo a partir del refinamiento del esquema general.5) . La resolución del problema debe incluir. El juego consiste en rellenar cada caja de 9 casillas con cifras del 1 al 9 sin repetirlas. por este orden: 1.25) 2. Estructuras de datos.5) 3. Refinamiento e identificación con el problema. No se pueden repetir tampoco cifras en líneas o columnas de la cuadrícula. (0. El Sudoku es un pasatiempo consistente en rellenar con cifras del 1 al 9 una cuadrícula de 81 (9x9) casillas distribuidas a su vez en 9 cajas de 3x3. La tabla adjunta muestra un ejemplo resuelto. (0.25) 4.Problema (5 puntos). Estudio del coste. (0.5) 5. Se pide diseñar un algoritmo que complete por nosotros este pasatiempo. 1. Distancias desde 1 PASO Nodo Seleccionado Nodo No Seleccionado Nodo Precedente 2 3 4 5 2 3 4 5 Problema (4 puntos).5 puntos) Cuestión 2 (1. por este orden: 1.5 puntos). Estructuras de datos. Dado el siguiente grafo. Algoritmo completo a partir del refinamiento del esquema general.n] en la que el valor cij corresponde al coste de que el montador i realice el montaje j. (2. (0.. ¿En qué se diferencia una búsqueda ciega en profundidad y un esquema de vuelta atrás? (0. Escribir el esquema general. Se trata de asignar los próximos n encargos. Se pide: La resolución del problema debe incluir.5 puntos). uno a cada montador. (0. Cuestión 3 (2 puntos). rellena la tabla adjunta indicando paso a paso cómo el algoritmo de Dijkstra encuentra todos los caminos de menor coste desde el nodo 1.. Para ello se conoce de antemano la tabla de costes C[1. Una empresa de montajes tiene n montadores con distintos rendimientos según el tipo de trabajo. (0. minimizando el coste total de todos los montajes. Elección razonada del esquema algorítmico. Declara en Java o en Módula-2 las clases y/o estructuras de datos que utilizarías en el problema del Sudoku (práctica de este año) para comprobar en un tiempo de ejecución constante respecto a la dimensión n del tablero (nxn) que una casilla contiene un valor factible.5) 3.n.5) 4.5) 2.5) .UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Febrero 2006 – Primera semana Cuestión 1 (2. . En el problema de las N reinas habríamos colocado k reinas sin que se coman entre sí. Los problemas aptos para un esquema de vuelta atrás permiten expresar los nodos intermedios como soluciones parciales al problema. ¿En qué se diferencia una búsqueda ciega en profundidad y un esquema de vuelta atrás? (0. poner N reinas en un tablero de NxN sin que se amenacen entre sí (solución final) Si por una rama no se puede resolver el problema para k.5 puntos). Si se determina que no es posible.5 puntos) La búsqueda ciega explora todas las ramas alternativas mientras que en un esquema de vuelta atrás se establecen condiciones de poda que determinan si una rama puede alcanzar o no una solución final. por tanto.. el problema de “poner N reinas en un tablero de NxN sin que se amenacen entre sí”. ¿qué significa que un nodo sea k-prometedor? (1 punto) Significa que es solución parcial para las k primeras componentes de la solución y. . por tanto. ¿Que hay que hacer para decidir si un vector es k-prometedor sabiendo que es una extensión de un vector (k-1)-prometedor? (1 punto) Si es (k-1)-prometedor quiere decir que es solución parcial para las primeras k-1 componentes y que. poner k reinas en un tablero de NxN sin que se amenacen entre sí . En el espacio de búsqueda. su rama se poda. entonces evidentemente no se podrá resolver para N. para decidir si una extensión considerando la siguiente componente k conforma un nodo k-prometedor. por muchos intentos de añadir reinas hagamos... entonces no se prosigue la búsqueda por dicha rama (se poda). por tanto. Entonces. Febrero 2006 (Primera Semana) Cuestión 1 (2. requiere ir solucionando la siguiente secuencia de soluciones parciales: poner 1 reina en un tablero de NxN sin que esté amenazada (trivial) poner 2 reinas en un tablero de NxN sin que se amenacen entre sí . estas cumplen las restricciones necesarias entre sí y no hay que volver a verificarlas.. Por ejemplo. lo único que hay que hacer es verificar si esta nueva componente k cumple las restricciones respecto a las otras k-1. todavía es posible encontrar una solución final (incluyendo las N componentes). Aquellos nodos que no sean soluciones parciales no permiten alcanzar una solución final y.RESPUESTAS EXAMEN Programación III. boolean val_en_fil[][] = new boolean[N][N]. re return (!val_en_fil[fil][val] && !val_en_col[col][val] && !val_en_reg[reg][val]). En la siguiente solución se declaran tres tablas de booleanos que indican si ya hay o no un determinado valor en una determinada fila.5} {3. columna o región. boolean valorFactible(int fil.2} {1. pero de nada sirve que verificar una casilla se realice en tiempo constante si luego actualizar su valor se realiza en tiempo lineal.4. boolean val_en_col[][] = new boolean[N][N]. int col.sqrt(N).2. Existen varias alternativas.4} {1. } void poner(int fil. } int region(int fil. rellena la tabla adjunta indicando paso a paso cómo el algoritmo de Dijkstra encuentra todos los caminos de menor coste desde el nodo 1.Cuestión 2 (1. val_en_reg[reg][val]=true. val_en_col[col][val]=false. // división entera } } Cuestión 3 (2 puntos). respectivamente. int val){ int g=region(fil. int val) { int reg=region(fil.col). Declara en Java o en Módula-2 las clases y/o estructuras de datos que utilizarías en el problema del Sudoku (práctica de este año) para comprobar en un tiempo de ejecución constante respecto a la dimensión n del tablero (nxn) que una casilla contiene un valor factible.col).4. val_en_fil[fil][val]=true. val_en_col[col][val]=true. entonces es factible poner el valor en la casilla. Dado el siguiente grafo.4} {2. int col.5 puntos).5} {5} 2 3 3 3 3 3 ∞ 9 6 6 4 5 4 4 4 5 ∞ 14 14 7 2 1 1 1 1 3 1 2 4 4 4 1 2 2 2 5 1 2 2 3 . Si no es así. val_en_reg[reg][val]=false.col). int col) { return (col/subN)*subN+fil/subN.2. public class Tablero { int N=9. int val) { int reg=region(fil.3. val_en_fil[fil][val]=false. Tanto la función de verificación como las de actualización tienen un coste computacional constante. } void quitar(int fil. Distancias desde 1 PASO Nodo Seleccionado Nodo No Seleccionado Nodo Precedente 0 1 2 3 {1} {1. int subN=(int)Math. boolean val_en_reg[][] = new boolean[N][N].5} {3. int col.3. uno a cada montador. cota:=acotar(nodo_raíz). (0.costes): posibilidades para la siguiente asignación (valores posibles para asignaciones[último_asignado+1]) 4. Una empresa de montajes tiene n montadores con distintos rendimientos según el tipo de trabajo. filas_no_asignadas: lista de cardinal. c. Determinar qué esquema algorítmico es el más apropiado para resolver el problema.coste + “mínimo coste de las columnas no asignadas” 3. fsi.N].hijo). a. Se trata de asignar los próximos n encargos. Para ello se conoce de antemano la tabla de costes C[1.nodo_raíz). coste: cardinal. mientras no vacío(Montículo) hacer (cota. compleciones(nodo.5 puntos) nodo=tupla asignaciones: vector[1. poner((cota.Montículo). Sin embargo descartamos el esquema voraz porque no es posible encontrar una función de selección y de factibilidad tales que una vez aceptado un candidato se garantice que se va alcanzar la solución óptima.. fmientras devolver Ø Indicar que estructuras de datos son necesarias.n. último_asignado: cardinal.n] en la que el valor cij corresponde al coste de que el montador i realice el montaje j. Montículo). (0. de un algoritmo de ramificación y poda. Se pide: 1. nodo):=quitarPrimero(Montículo). Se trata.1. Por tanto. b. si no para cada hijo en compleciones(nodo) hacer cota:=acotar(hijo). Montículo de mínimos (cota mejor la de menor coste) Desarrollar el algoritmo completo. poner((cota.5 puntos) Las funciones generales del esquema general que hay que instanciar son: 1. (0. solución(nodo): si se han realizado N asignaciones (último_asignado==N) 2. por tanto. fpara.costes): nodo.Problema (4 puntos). (2. ..5 puntos) Función RamificaciónPoda (nodo_raíz) dev nodo Montículo:=montículoVacío(). si solución(nodo) entonces devolver nodo. minimizando el coste total de todos los montajes. acotar(nodo. Escribir el esquema general.5 puntos) Se trata de un problema de optimización con restricciones. podría ser un esquema voraz o un esquema de ramificación y poda.. Razonar la respuesta. N] Montículo:=montículoVacío().. Por tanto.filas_no_asignadas).1.Montículo).costes[1. devolver lista.hijo).nodo). el espacio a recorrer siempre será menor que n!.filas_no_asignadas hacer hijo:=crearNodo(). hijo. Coste: En este caso únicamente podemos hallar una cota superior del coste del algoritmo por descripción del espacio de búsqueda.N.último_asignado+1.costes). poner((cota. cota:=acotar(nodo. fpara devolver cota. hijo. .costes[1. nodo.filas_no_asignadas:=nodo.último_asignado=0..asignaciones. En el caso peor se generan (k-1) hijos por cada nodo del nivel k.coste=0.N.coste+costes[hijo..filas_no_asignadas. fpara. poner((cota.último_asignado.N]) dev lista_nodos lista:=crearLista(). para columna desde nodo.1. mientras no vacío(Montículo) hacer (cota.coste.filas_no_asignadas hacer si costes[columna.Función asignación(costes[1.hijo.último_asignado+1 hasta N hacer minimo=∞. nodo.nodo):=quitarPrimero(Montículo). hijo.asignaciones. para cada fila en nodo.fila].1. habiendo n. si no para cada hijo en compleciones(nodo.asignaciones=nodo.último_asignado]:=fila.lista).N]) dev cota cota:=nodo. eliminar(fila. Función acotar(nodo. añadir(hijo.coste:=nodo. hijo.fila].costes) hacer cota:=acotar(hijo...fila]<mínimo entonces mínimo:=costes[columna. hijo. si nodo. fmientras devolver ∅..costes).asignaciones[hijo.N..último_asignado:=nodo. Función compleciones(nodo.último_asignado==N entonces devolver nodo. fsi.N]) dev solución[1. fsi fpara cota:=cota+mínimo. para cada fila en nodo.Montículo). . nodo.N.último_asignado:=nodo.último_asignado=0.4.5 puntos) Las funciones generales del esquema general que hay que instanciar son: a.1..último_asignado. cota:=acotar(nodo. para columna desde nodo. fsi fpara cota:=cota+mínimo. acotar(nodo. poner((cota.nodo). hijo.asignaciones=nodo. hijo.coste + “mínimo coste de las columnas no asignadas” c.N]) dev lista_nodos lista:=crearLista(). compleciones(nodo. para cada fila en nodo. si nodo.N]) dev cota cota:=nodo.coste.filas_no_asignadas). eliminar(fila.N.coste+costes[hijo.asignaciones.hijo.filas_no_asignadas.costes): nodo.costes) hacer cota:=acotar(hijo.coste=0.coste:=nodo.último_asignado+1. fmientras devolver ∅. .nodo):=quitarPrimero(Montículo).costes[1. Función compleciones(nodo.costes): posibilidades para la siguiente asignación (valores posibles para asignaciones[último_asignado+1]) Función asignación(costes[1. mientras no vacío(Montículo) hacer (cota. fpara devolver cota. hijo. fsi.1.lista). fpara.costes[1. nodo.costes).asignaciones[hijo..último_asignado+1 hasta N hacer mínimo=∞.Montículo). poner((cota.fila].Montículo).hijo)..N] Montículo:=montículoVacío().filas_no_asignadas hacer hijo:=crearNodo().. solución(nodo): si se han realizado N asignaciones (último_asignado==N) b.1. si no para cada hijo en compleciones(nodo.último_asignado]:=fila..último_asignado==N entonces devolver nodo. Función acotar(nodo.fila]<mínimo entonces mínimo:=costes[columna.filas_no_asignadas hacer si costes[columna.costes). Desarrollar el algoritmo completo (2.filas_no_asignadas:=nodo.N]) dev solución[1. devolver lista.asignaciones. hijo.. hijo.N. para cada fila en nodo.fila]. añadir(hijo. . respetando la limitación de peso impuesta. No se piden los algoritmos. i= 1. luego se puede decidir llevar una fracción xi del objeto i. por este orden: La resolución del problema debe incluir. y como el nº de pacientes es fijo. Sea el famoso problema de la mochila.2.5 puntos) 3. Elección razonada del esquema algorítmico. minimizar la espera total equivale a minimizar la espera media. por este orden: 1.2. Cada uno de los n activos que hay que repartir tiene un valor entero positivo. El objetivo es llenar la mochila de tal manera que se maximice el valor de los objetos almacenados. Además de nombrar el esquema o esquemas. Hacer una demostración de la optimalidad de dicha función de selección. explica el porqué de su elección.….5 puntos) Solución: están solucionados en el libro base de la asignatura. En la práctica obligatoria del presente curso 2005/2006 se ha tenido que diseñar y desarrollar un algoritmo para resolver el juego del Su-doku. Los objetos no se pueden fraccionar. por lo que un objeto puede o no ser añadido. Estudio del coste ( 0.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Febrero 2006 – Segunda semana Cuestión 1 (1 punto). apartado 6. El objetivo es minimizar el tiempo total que todos los clientes están en el sistema. Cuestión 3 (3 puntos).n el tiempo requerido por el paciente i. Los socios quieren repartir dichos activos a medias y. el objeto i tiene un peso positivo wi y un valor positivo vi. Cuestión 2 (2 puntos). La mochila puede llevar un peso que no sobrepase W. Estructuras de datos.n. pág 231. de forma que cada uno de ellos tenga el mismo valor. Se pide: 1.….j del tablero. siendo ti . Identificar una función de selección que garantice que un algoritmo voraz puede construir una planificación óptima. Algoritmo completo a partir del refinamiento del esquema general. primero quieren comprobar si el conjunto de activos se puede dividir en dos subconjuntos disjuntos. Problema (4 puntos). pero en éste último caso. tal que 0 ≤ xi ≤ 1 para 1 ≤ i ≤ n. los aspectos destacados de cómo resolverías el problema y el coste asociado. (0. para ello.5 puntos) . Un dentista pretende dar servicio a n pacientes y conoce el tiempo requerido por cada uno de ellos.6. Los objetos se pueden fraccionar. Para i= 1.1. Dos socios que conforman una sociedad comercial deciden disolverla. sólo se añade 1.5 puntos) 2. Indique qué esquema o esquemas considera más adecuados para resolver este problema en los siguientes casos: 1. Codifique en java o en modula-2 un algoritmo iterativo que recorra el cuadrado de 3x3 casillas que corresponda a una casilla que ocupa las posiciones i. 2. (0. (2. (1 punto) 2. La resolución de este problema debe incluir. Se dispone de n objetos y una mochila. (2 puntos) 4. . Se podrían seleccionar los elementos en orden decreciente de vi/wi. luego se puede decidir llevar una fracción xi del objeto i. El objetivo es llenar la mochila de tal manera que se maximice el valor de los objetos almacenados. los aspectos destacados de cómo resolverías el problema y el coste asociado. ya que en el árbol asociado al espacio de búsqueda. Sea el famoso problema de la mochila. La función de selección consiste en considerar los objetos en orden decreciente de vi/wi. respetando la limitación de peso impuesta. por lo que un objeto puede o no ser añadido. Así. una cota superior del valor que se puede alcanzar siguiendo por esa rama se puede calcular suponiendo que la mochila la rellenamos con el siguiente elemento siguiendo el orden decreciente de vi/wi. . incluyendo la ordenación de los objetos.. Codifique en java o en modula-2 un algoritmo iterativo que recorra el cuadrado de 3x3 casillas que corresponda a una casilla que ocupa las posiciones i. Sin embargo. dado un determinado nodo. cada nodo tendrá dos sucesores que representarán si el objeto se añade o no a la mochila. sería de esperar que. es decir. sólo se añade 1. pero en éste último caso. Se dispone de n objetos y una mochila. 0. No se piden los algoritmos. } } Cuestión 2 (2 puntos). Al ser un problema de optimización se puede utilizar el esquema de ramificación y poda. el uso de la cota para podar reduzca el número de nodos que se exploran. El coste está en O(n log n).n.2. O(2n). Solución: Se trataba de encontrar la relación entre las posiciones i. La mochila puede llevar un peso que no sobrepase W. Supongamos que el tablero tiene como índices 0. l < coordColumnaInicioCuadrado+3. En la práctica obligatoria del presente curso 2005/2006 se ha tenido que diseñar y desarrollar un algoritmo para resolver el juego del Su-doku. // división entera ahora sólo queda hacer el recorrido: for (int k= coordFilaInicioCuadrado. Febrero 2006 (Segunda Semana) Cuestión 1 (1 punto).. la relación se puede establecer de la siguiente manera: int coordFilaInicioCuadrado = (i / 3) * 3.…. En el caso b) no se puede utilizar el esquema voraz ya que no existe una función de selección que garantice obtener una solución óptima. el objeto i tiene un peso positivo wi y un valor positivo vi.j del tablero y las posiciones de comienzo del cuadrado de 3x3 que les corresponde en el tablero del Su-doku 9x9. Los objetos se pueden fraccionar. // división entera int coordColumnaInicioCuadrado = (j / 3) * 3. explica el porqué de su elección.j del tablero. Además de nombrar el esquema o esquemas. Indique qué esquema o esquemas considera más adecuados para resolver este problema en los siguientes casos: 1.RESPUESTAS EXAMEN Programación III. Para i= 1. k < coordFilaInicioCuadrado+3.8 y que i y j son de tipo entero. l++){ procesar(tab[k][l]). en la práctica. 2. Ver página 227 del libro base de la asignatura. El coste en el caso peor sería de orden exponencial.8. Los objetos no se pueden fraccionar. tal que 0 ≤ xi ≤ 1 para 1 ≤ i ≤ n. Solución: En el caso a) se puede utilizar el esquema voraz ya que existe una función de selección que garantiza obtener una solución óptima. k++){ for (int l= coordColumnaInicioCuadrado. Cuestión 3 (3 puntos). p2 ...a +1) sb + ( n . Cada uno de los n activos que hay que repartir tiene un valor entero positivo. si intercambiamos la posición de estos dos clientes. porque: T ( P ) − T ( P′ ) = ( n . Si se sirven clientes en el orden P. y como el nº de pacientes es fijo. Dos socios que conforman una sociedad comercial deciden disolverla.a +1)( sa − sb ) + ( n . entonces el tiempo de servicio requerido por el i-ésimo cliente que haya que servir será si. una elección de los activos que cumpla con la restricción del enunciado. obtendremos un nuevo orden de servicio P´ que es simplemente el orden de P después de intercambiar los enteros pa y pb .16 U. Cuando se sirve a los clientes por orden creciente de tiempos de servicio. Hacer una demostración de la optimalidad de dicha función de selección. por este orden: (PROBLEMA 6. Tampoco se puede dividir el problema en subproblemas que al combinarlos nos lleven a una solución. siendo ti . x3. Se pide: 1.k +1) sk k=1 k ≠ a. de forma que cada uno de ellos tenga el mismo valor. Identificar una función de selección que garantice que un algoritmo voraz puede construir una planificación óptima.6. sin tener que reconsiderar decisiones.b n La planificación nueva es preferible a la vieja..b+1)( sb − sa ) = ( b − a )( sa − sb ) > 0 Problema (4 puntos). minimizar la espera total equivale a minimizar la espera media. representa una decisión tomada en la etapa i-ésima. En él una solución puede expresarse como una n-tupla [x1. Entonces se puede encontrar dos enteros a y b con a < b y sa > sb . El objetivo es minimizar el tiempo total que todos los clientes están en el sistema. por ello no se puede aplicar el esquema voraz. i= 1.2. EDMA 470) Solución: 1. = ns1 + ( n − 1) s2 + ( n − 2 ) s3 + . Vuelta atrás es un recorrido en profundidad de un grafo dirigido implícito. 2.…. . pág 231. Sea P = p1 . para ello. el esquema de exploración de grafos más adecuado es el esquema vuelta-atrás.. primero quieren comprobar si el conjunto de activos se puede dividir en dos subconjuntos disjuntos. donde cada xi. = ∑ ( n − k + 1) sk Supongamos ahora que P no organiza a los clientes por orden de tiempos creciente de servicio.… xn].5 puntos) Solución: están solucionados en el libro base de la asignatura. La resolución de este problema debe incluir... Los socios quieren repartir dichos activos a medias y. (0.1. (2. pn cualquier permutación de enteros del 1 al n y sea si = t pi .. Un dentista pretende dar servicio a n pacientes y conoce el tiempo requerido por cada uno de ellos.n el tiempo requerido por el paciente i.b+1) sa + ∑ ( n . No se puede encontrar una función de selección que garantice. apartado 6. 1.5 puntos) 2.M. x2. Al no ser un problema de optimización. El tiempo total transcurrido pasado en el sistema por todos los clientes si se emplea la planificación P´ es: k =1 n T ( P′ ) = ( n . y el tiempo total transcurrido en el sistema por todos los clientes es: T ( P ) = s1 + ( s1 + s2 ) + ( s1 + s2 + s3 ) + .. de entre un conjunto finito de alternativas. k+1]) fsi fpara fsi ffunción En este caso. v3. su valor debe ser par. Para poder dividir el conjunto de activos en dos subconjuntos disjuntos. Descripción de las estructuras de datos necesarias. 3... suma. donde cada vi representa el valor del activo i-ésimo. si el conjunto inicial de activos no tiene un valor par el problema no tiene solución. La solución se representa mediante una array de valores x= [x1. En esta solución se sigue el segundo de los esquemas planteados en el apartado 2.2]) dev booleano . suma: array[1. Cada nodo del i-ésimo nivel tiene dos hijos correspondientes a si el i-ésimo activo va a un socio o al otro. función Solucion (k: entero. Algoritmo completo a partir del refinamiento del esquema general. Así. x3.Descripción algorítmica del esquema: función vuelta-atrás(e: ensayo) si valido(e) entonces dev e sino listaEnsayos ← complecciones(e) mientras ¬ vacia(listaEnsayos) ∧ ¬resultado hacer hijo ← primero(listaEnsayos) listaEnsayos ← resto(listaEnsayos) si condicionesDePoda(hijo) entonces resultado ← vuelta-atrás(hijo) fsi fmientras dev resultado fsi ffunción Otra posible descripción: función vuelta-atrás(v[1. • • • El conjunto de activos y sus valores se representa en un array de enteros v= [v1. podrá tomar el valor 1 o 2 en función de que el activo i-ésimo se asigne al subconjunto del un socio o del otro.… vn]. el espacio de búsqueda es un árbol de grado 2 y altura n+1. Una posible condición de poda consistirá en que se dejarán de explorar aquellos nodos que verifiquen que alguno de los dos subconjuntos que se van construyendo tiene un valor mayor que la mitad del valor total. donde cada xi.… xn].. 2. v2. x2. Un array de dos elementos. de forma que cada uno de ellos tenga el mismo valor.k]: nTupla) si solucion(v) entonces dev v sino Para cada vector w k+1-prometedor hacer si condicionesDePoda(w) entonces vuelta-atrás(w[1. que acumule la suma de los activos de cada subconjunto. k+1. sumaTotal) fsi sino suma[i] ← suma[i] ..0].v[k] fsi fpara fsi ffunción función ProblemaSeparacionSociosMitad (v: n-tupla) dev x: n-tupla.si (k = n) AND (suma[1] = suma [2]) entonces dev Verdadero sino dev Falso fsi ffuncion función SeparacionSociosMitad (v: array[1. Verdadero sino para i desde 1 hasta 2 hacer x[k] ← i suma[i] ← suma[i] + v[k] si suma[i] <= (sumaTotal DIV 2) entonces si k < n entonces x ← SeparacionSociosMitad(v. sumaTotal: entero) dev x: array[1. 4. suma[0. esto es: T(n) ∈ O(2n) . separacion: boolean para i desde 1 hasta n hacer sumaTotal ← sumaTotal + v[i] fpara si par(sumTotal) entonces dev SeparacionSociosMitad (v.n]. suma: array[1. separacion: boolean si Solucion (k. 1.n]. sumaTotal) sino dev 0 fsi ffuncion Llamada inicial ProblemaSeparacionSociosMitad (v).2]. suma. k: entero. En este caso. suma) entonces dev x.. el coste viene dado por el número máximo de nodos del espacio de búsqueda. Estudio del coste del algoritmo desarrollado.. Demuestra también su orden exacto de complejidad (0.5 puntos). 2. pinta (n-1). Dibuja cómo evolucionaría el siguiente vector al ordenarlo mediante el algoritmo de ordenación rápida (Quicksort). Desarrollar un programa que compruebe si es posible que un caballo de ajedrez mediante una secuencia de sus movimientos permitidos recorra todas las casillas de un tablero NxN a partir de una determinada casilla dada como entrada y sin repetir ninguna casilla. (1.5 puntos) . 4. escribir “n-1”. para i desde 1 hasta n hacer para j desde 1 hasta n div i hacer escribir “i.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Septiembre 2006 – Original Cuestión 1 (2 puntos).5 puntos). fpara fpara Cuestión 2 (2 puntos). Se pide: 1. 6 5 1 2 3 4 7 8 9 Problema (4 puntos).5 puntos) Desarrollar el algoritmo completo en el lenguaje de programación que utilizaste para la práctica (2.j.5 puntos) Indicar que estructuras de datos son necesarias (0. 3. Determinar qué esquema algorítmico es el más apropiado para resolver el problema.k”. Demuestra que el tiempo de ejecución en función de n del siguiente fragmento de código está acotado superiormente por Ο ( n 2 ) e inferiormente por Ω ( n ) (1. dado el siguiente código funcion pinta (int n) si n>0 entonces escribir “n”. fsi Cuestión 3 (2 puntos).5 puntos) Hallar el orden de complejidad del algoritmo desarrollado (0. Indica únicamente cada una de las modificaciones que sufriría el vector.5 puntos): Escribe la salida al realizar la llamada “pinta(5)”. Razonar la respuesta y escribir el esquema general (0. Programación III Código de asignatura (marcar con una X): Sistemas: __ 402048 (plan viejo) __ 532044 (plan nuevo) Gestión: __ 41204- (plan viejo) __ 542046 (plan nuevo) Prueba Presencial Ordinario Septiembre de 2006 UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Duración: 2 horas Material permitido: NINGUNO DNI: _______________________ Apellidos: ___________________________________________________________________________________ Nombre: ______________________________ Centro donde entregó la práctica: ____________________ e-mail: ___________________ Cuestión 1 (2 puntos). Demuestra que el tiempo de ejecución en función de n del siguiente fragmento de código está acotado superiormente por O(n2) e inferiormente por Ω(n) (1.5 puntos). Demuestra también su orden exacto de complejidad (0.5 puntos). para i desde 1 hasta n hacer para j desde 1 hasta n div i hacer escribir “i,j,k”; fpara fpara Supón que el coste de “escribir” es constante. Solución: En primer lugar debemos plantear el tiempo de ejecución T(n) en función de n. Para ello, vamos a fijarnos en la instrucción barómetro (la instrucción que se ejecuta más veces) y vamos a contar cuántas veces se ejecuta. Puesto que todas las instrucciones tienen un coste constante, la complejidad del programa estará en el orden del número de veces que se ejecute la instrucción barómetro. T ( n ) = ∑∑ 1 = ∑ i =1 j =1 i =1 n n n /i n n n 1 = n·∑ i i =1 i menor que n. Por tanto, T(n) ≤ n·n, o en otras palabras, T(n) está acotado superiormente por n2: T(n)∈O(n2) como queríamos demostrar. Por otra parte, 1 ∑ i es un sumatorio de n elementos menores o iguales que 1, por lo que su suma total será i =1 ∑i i =1 n 1 es mayor que 1 y, por tanto T(n) ≥ n·1, o en otras palabras, T(n) está acotado inferiormente por n: T(n)∈Ω(n) como queríamos demostrar. Para demostrar el orden exacto es necesario saber cómo crece la serie podemos aproximar la serie con la integral: n ∑i i =1 n 1 . Para ello, como el ln(n). Así pues, se pueden encontrar dos constantes c y d tal que T(n) esté acotado superiormente por c·n·log(n) e inferiormente por d·n·log(n). En conclusión, el orden exacto de T(n) es n·log(n): T(n)∈θ(n log n) Cuestión 2 (2 puntos). Escribe la salida al realizar la llamada “pinta(5)”, dado el siguiente código (1.5 puntos): función pinta(int n) si n>0 entonces escribir “n”; pinta(n-1); escribir “n-1”; fsi Demuestra el coste computacional de la función “pinta” suponiendo que “escribir” tiene coste constante (0.5 puntos). Solución: La salida sería: 5 4 3 2 1 0 1 2 3 4 Para calcular el coste planteamos una recurrencia con reducción del problema mediante sustracción: n: tamaño del problemas a: número de llamadas recursivas b: reducción del problema en cada llamada recursiva n-b: tamaño del subproblema nk: coste de las instrucciones que no son llamadas recursivas Recurrencia: T(n)= c·nk a·T(n-b)+c·nk Θ(nk) Θ(nk+1) Θ(an div b) si a<1 si a=1 si a>1 si 0≤n<b si n≥b 1 ∫ x dx que corresponde al logaritmo natural de n. Por tanto, la serie crece tan rápidamente 1 T(n)∈ a=1; b=1; nk=1; k=0 Por tanto, T(n)∈ Θ(n) Cuestión 3 (2 puntos). Dibuja cómo evolucionaría el siguiente vector al ordenarlo mediante el algoritmo de ordenación rápida (Quicksort). Indica únicamente cada una de las modificaciones que sufriría el vector. 6 5 1 2 3 4 7 8 9 Solución: Si se toma como pivote el primer elemento: 6 4 4 2 2 1 5 5 3 3 1 2 1 1 1 1 3 3 2 2 2 4 4 4 3 3 5 5 5 5 4 6 6 6 6 6 7 7 7 7 7 7 8 8 8 8 8 8 9 9 9 9 9 9 Si se toma como pivote el elemento que ocupa la posición central, en este caso el primer pivote es el elemento que ocupa la posición quinta, que es el 3: 6 2 2 2 1 1 5 5 1 1 2 2 1 1 5 3 3 3 2 6 6 6 6 4 3 3 3 5 5 5 4 4 4 4 4 6 7 7 7 7 7 7 8 8 8 8 8 8 9 9 9 9 9 9 Problema (4 puntos). Desarrollar un programa que compruebe si es posible que un caballo de ajedrez mediante una secuencia de sus movimientos permitidos recorra todas las casillas de un tablero NxN a partir de una determinada casilla dada como entrada y sin repetir ninguna casilla. Se pide: 1. Determinar qué esquema algorítmico es el más apropiado para resolver el problema. Razonar la respuesta y escribir el esquema general (0.5 puntos) 2. Indicar que estructuras de datos son necesarias (0.5 puntos) 3. Desarrollar el algoritmo completo en el lenguaje de programación que utilizaste para la práctica (2.5 puntos) 4. Hallar el orden de complejidad del algoritmo desarrollado (0.5 puntos) Solución: Una solución en pseudocódigo se puede encontrar en la página 86 del libro de problemas de la asignatura: “Esquemas Algorítmicos: Enfoque Metodológico y Problemas Resueltos”. Julio Gonzalo Arroyo y Miguel Rodríguez Artacho. Cuadernos de la UNED. 5 puntos) 2. COMIENZO SI n < 8 ENTONCES DEVOLVER(1). siendo h(n. r ← r + uno (n DIV 6.i).5 puntos) 3. r ← r + uno (n DIV 6. SINO COMIENZO r ← uno (n DIV 6.r. Problema (5 puntos). (3. PARA i ← 1 HASTA n/2 HACER COMIENZO r ← h (n. k+1).UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Septiembre 2006 Reserva Cuestión 1 (3 puntos). VAR i.k) ∈ O(n2). En caso negativo demostrarlo formalmente. r ← r + dos (n DIV 8.r:entero. Construir un algoritmo que devuelva un plan de trabajo para el repartidor que maximice el beneficio. FIN r ← r + dos (n DIV 8. Cuestión 3 (1 punto). Explica cómo pueden ordenarse n valores enteros positivos en tiempo lineal. ¿Puede un grafo tener dos árboles de recubrimiento mínimo diferentes? En caso afirmativo poner un ejemplo. (1 punto) . Un repartidor de pizzas tiene que entregar K pedidos de diferente valor de recaudación como mucho hasta la ranura de tiempo concreta que tiene asignada en la tabla adjunta. COMIENZO SI n < 6 ENTONCES DEVOLVER(1). por este orden: 1.r-1. k-1). DEVOLVER (r). FIN FIN Cuestión 2 (1 punto). (0.r-1. VAR i.r:entero. Algoritmo completo a partir del refinamiento del esquema general. k+1). La resolución del problema debe incluir. PARA i ← 1 HASTA 2*n HACER COMIENZO r ← h(n. k+2). k-1). Explica las ventajas e inconvenientes de ese método. Hallar el coste de los siguientes algoritmos. Pedido Ranura Recaudación 1 2 3 4 5 6 7 8 9 1 5 5 6 6 4 4 2 2 60 70 80 20 20 30 50 50 90 Si un pedido se entrega tarde la recaudación es 0. Estudio del coste. Elección razonada del esquema algorítmico.k:entero):entero.i). k+2).i). Aplíquelo al ejemplo detallando TODOS los pasos. r ← r + h (n. PROCEDIMIENTO uno (n. FIN FIN PROCEDIMIENTO dos (n.k:entero):entero.i)+h(n.r. sabiendo que el rango de dichos valores es limitado.r. FIN DEVOLVER (r). SINO COMIENZO r ← dos (n DIV 8. . y por último (v) una instrucción simple que no tenemos en cuenta para el cálculo. PARA i ← 1 HASTA n/2 HACER COMIENZO r ← h (n. si a > b k ( ) . Septiembre 2006 (Reserva) Cuestión 1 (3 puntos). que no tenemos en cuenta para el cálculo. k = 3 el segundo algoritmo: está formado por una instrucción condicional de coste constante cuyo cuerpo incluye secuencialmente: (i) una llamada recursiva de tamaño n/8. k = 3 ⎧cn k . lo que equivale a T(n) = 3T(n/8) + 2n3 / 2 y siendo 3 < 8 3 el coste es O(n3). si a = b k .i). r ← r + uno (n DIV 6. b = 6. Sumando los términos nos sale T(n) = T(n/8)+T(n/8)+n/2* (2n2)+T(n/8). r ← r + dos (n DIV 8. COMIENZO SI n < 6 ENTONCES DEVOLVER(1). Hallar el coste de los siguientes algoritmos. FIN r ← r + dos (n DIV 8. si a < b k .r-1. PARA i ← 1 HASTA 2*n HACER COMIENZO r ← h(n. Un bucle en el que se repite 2n veces un cálculo consistente en llamar dos veces a una función h(n. y otra llamada recursiva de tamaño n/8. r. La expresión queda T(n) = T(n/6) + T(n/6) + T(n/6) + 2n(n2 + n2 )lo que equivale a que T(n) = 3T(n/6) + 4n3. FIN FIN El procedimiento uno tiene una instrucción condicional de coste constante. COMIENZO SI n < 8 ENTONCES DEVOLVER(1).r:entero. lo que equivale a T(n) = 3T(n/6) + 4n3 y siendo 3 < 63 el coste es O(n3). DEVOLVER (r).RESPUESTAS EXAMEN Programación III. //En el segundo y tercer caso de la llamada recursiva hay otra instrucción simple añadida. siendo h(n. k-1). (iv) un bucle en el que se repite n/2 veces un cálculo consistente en llamar dos veces a una función h(n.r.r. k+2). o bien tres llamadas recursivas. (ii) una instrucción simple. i) de coste cuadrático.r:entero. VAR i. b = 8. FIN DEVOLVER (r). FIN FIN PROCEDIMIENTO dos (n.r. ambas invocan la función con un tamaño n/6.k:entero):entero.i). r ← r + h (n. r ← r + uno (n DIV 6. SINO COMIENZO r ← dos (n DIV 8. VAR i. a = 3. r. (iii) otra llama recursiva de tamaño n/8. si n ≥ b ⎩ ⎧Θ ( n k ) ⎪ ⎪ T ( n ) ∈ ⎨Θ ( n k log n ) ⎪ log a ⎪Θ n b ⎩ . Aplicando la resolución genérica de las expresiones del tipo T(n) = aT(n/b) + cnk.k) ∈ O(n2). k+1).r-1. k-1). a = 3.i)+h(n. si 1 ≤ n < b ⎪ T (n) = ⎨ k ⎪aT ( n / b ) + cn . Dentro de la condición tiene: o bien una instrucción constante. PROCEDIMIENTO uno (n. SINO COMIENZO r ← uno (n DIV 6. k+2). k+1). que no tenemos en cuenta para el cálculo. /*más una instrucción simple*/.i). i) de coste cuadrático.k:entero):entero. es decir. Por cada valor i extraído de la lista. Suponiendo que cada arista posee una longitud no negativa. Suponiendo que el rango de los valores a ordenar es limitado. 1. y además la suma de las longitudes de las aristas de T debe ser tan pequeña como sea posible. Siendo G=(N.15} V : vector[1.length. sabiendo que el rango de dichos valores es limitado.A) un grafo conexo no dirigido en donde N es el conjunto de nodos y A es el conjunto de aristas. ¿Puede un grafo tener dos árboles de recubrimiento mínimo diferentes? En caso afirmativo poner un ejemplo. } Indice 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 valor 1 5 12 15 Cuestión 3 (1 punto).5.Recorremos el vector generado mostrando los valores generados en el paso anterior (2) y omitiendo aquellas posiciones del vector que contengan un 0.max(n(i))] For (i = 1. Encontrar un árbol de recubrimiento mínimo consiste en hallar un subconjunto T de las aristas de G tal que utilizando solamente las aristas de T. Explica cómo pueden ordenarse n valores enteros positivos en tiempo lineal. i ++){ V[n(i)] = n.. Explica las ventajas e inconvenientes de ese método. . Si. incrementamos el valor de la posición i del vector. i <= n. En caso negativo demostrarlo formalmente.Recorremos la lista de valores a ordenar (O(n)).El vector esta inicializado a 0 (O(n)). todos los nodos deben quedar conectados. sin embargo se requiere un determinado espacio de memoria que estará vacío.12. Ejemplo: n={1. 3.Cuestión 2 (1 punto). sabemos que por ejemplo el rango de números a ordenar va de 0 a 2000. Las ventajas de esta ordenación es que el coste en tiempo de búsqueda es constante. 2. podemos generar un vector de 2000 elementos de tipo entero que almacenará el número de ocurrencias de cada valor de la lista a ordenar en la posición del vector correspondiente. La función Solución(S) será tener tantos elementos en el conjunto S como el máximo valor de las ranuras de tiempo. Elección razonada del esquema algorítmico y esquema: El divide y vencerás queda descartado.5 puntos) y estudio del coste desarrollado (1 punto). Se trata de un problema de optimización.5 puntos). por lo que podremos aplicar un voraz o un ramificación y poda. Pedido Ranura Recaudación 1 2 3 4 5 6 7 8 9 1 5 5 6 6 4 4 2 2 60 70 80 20 20 30 50 50 90 Si un pedido se entrega tarde la recaudación es 0. . El esquema general de un algoritmo voraz es: Fun voraz (C: conjunto) dev conjunto S solución vacía mientras ¬vacio(C) y ¬Solucion(S) hacer x seleccionar(C). por este orden: elección razonada del esquema algorítmico y esquema (0.. algoritmo completo a partir del refinamiento del esquema general (3. Aplíquelo al ejemplo detallando TODOS los pasos.k] P=min(n. F[1. C=C-{x} Si completable(S U {x}) entonces S S U {x} Fin SI Fin mientras Fin función Donde el conjunto de candidatos C se ordena previamente por orden decreciente de beneficio aportado. Construir un algoritmo que devuelva un plan de trabajo para el repartidor que maximice el beneficio. ya que no parece posible dividir el problema en subproblemas iguales que puedan resolverse individualmente y posteriormente combinar las soluciones parciales para obtener la solución final.. puesto que siempre se encontrará una solución. Completable es trivial. La resolución del problema debe incluir.Problema (5 puntos). Seleccionar(C) será la función que elige el elemento de menor valor en la ranura de tiempo que no haya sido incorporado a la solución. Cuenta con un conjunto de candidatos que serán los pedidos. por lo que podemos utilizar el esquema voraz que aparece en el libro llamado Secuencia2. max(ranura(i)). Los pedidos deberán ser seleccionados de forma que puedan optimizar el beneficio que genera dicha ordenación y que se realicen dentro de la ranura de tiempo asignada. Se trata de un problema de planificación con optimización del beneficio. Algoritmo completo: Función Secuencia (ranura[1. Un repartidor de pizzas tiene que entregar K pedidos de diferente valor de recaudación como mucho hasta la ranura de tiempo concreta que tiene asignada en la tabla adjunta.n]: matriz) dev k. 6). 0. Si M#0 entonces J[M]=i. 0. F(2)=F(1).k] P=min(9. . Fusionar(K. Pedido 1 2 3 4 5 6 7 8 9 Ranura 2 5 5 1 4 2 4 6 6 Recaudació 90 80 70 60 50 50 30 20 20 n Función Secuencia (ranura[1. J. Fin para Para i 1 hasta n hacer K=buscar(min(p. 3. F : matriz [0. F : matriz [0. M=F(4)=5. L=buscar(1)=1. F[i]=i. Fusionar(K... 0}.. ranura(i)). primero es necesario ordenar la tabla por orden decreciente de recaudación.. 4. Si M#0 entonces J[2]=1. 0. 0.5)=buscar(5)=4. F={0. Indice 0 1 2 3 4 5 6 J 0 0 1 0 0 0 0 F 0 1 3 4 5 6 2 I=2: K=buscar(min(6. 6} Para i 1 hasta 9 hacer I=1: K=buscar(min(6. M=F(2)=2.J. 0. 2. 5. F[1. F(K)=F(L).P] Para i 0 hasta P hacer J[i]=0. Fin SI Para i 1 hasta P hacer Si J[i]>0 entonces k=k+1 F[k]=J[i] Fin Si Fin Para Para que este algoritmo funcione de forma idónea. M=F(K). L). L=buscar(M-1). 1.9]: matriz) dev k. L=buscar(4)=3.6] J={0. Si M#0 entonces J[5]=2.2)=buscar(2)=2. L). 2)=buscar(2)=0. Si M#0 entonces J[3]=5. Si M#0 entonces J[1]=4. Fusionar(K. M=F(1)=1.1)=buscar(1)=1. Fusionar(1. Indice 0 1 2 3 4 5 6 J 0 4 1 5 3 2 0 F 0 6 1 2 3 4 5 I=6: K=buscar(min(6. 0). F(3)=F(2). M=F(3)=4. L=buscar(3)=2.4)=buscar(4)=1. Indice 0 1 2 3 4 5 6 J 0 4 1 0 3 2 0 F 0 3 6 1 4 2 5 I=5: K=buscar(min(6. L=buscar(2)=0. L=buscar(0)=0. F(1)=F(0). L). 0). Indice 0 1 2 3 4 5 6 J 0 0 1 0 3 2 0 F 0 1 3 6 2 4 5 I=4: K=buscar(min(6.F(4)=F(3).5)=buscar(5)=3. Indice 0 1 2 J 0 0 1 F 0 1 3 2 3 4 5 6 0 0 2 0 4 6 5 I=3: K=buscar(min(6. Rechazamos el candidato . 2). Fusionar(3. M=F(1)=3. Si M#0 entonces J[4]=3. F(1)=F(0). Fusionar(1. 5. M=F(1)=6. El beneficio obtenido sería 60+90+50+70+80+20=370 Coste del algoritmo: El coste de ordenar la tabla por orden decreciente de beneficio en el mejor tiempo posible es del orden de O(n log n). 1. 3. F={4. Rechazamos el candidato I=8 K=buscar(min(6. El bucle para se recorre n veces. por tanto el coste total del algoritmo es (n log n)+O(n(2n + n)) = (n log n)+O(n2) = O(n2). 0). Rechazamos el candidato Produce como salida K=6. Indice 0 1 2 3 4 5 6 J 0 4 1 5 3 2 8 F 0 1 2 3 4 5 6 I=9 K=buscar(min(6. 8} donde F contiene el número de pedido que debería atenderse para maximizar el beneficio. . las funciones buscar y fusionar se ejecutarán como máximo 2n y n veces respectivamente. 2. L=buscar(5)=0 F(1)=F(0) Fusionar (1.4)=buscar(4)=0.6)=buscar(6)=1. Si M#0 entonces J[6]=8.6)=buscar(6)=0.I=7 K=buscar(min(6. 10 13 2 26 3 7 1 5 5 8 4 Problema (4 puntos). Explica cómo pueden ordenarse n valores positivos en tiempo lineal. sabiendo que el rango de dichos valores es limitado. y a partir de estos resultados da su orden de ( ) . 2. con canciones de una colección de n elementos. cuyas duraciones . 4. aplica el algoritmo de Dijkstra para hallar los caminos más cortos desde el nodo 1 hasta uno de los otros nodos. Estudio del coste del algoritmo desarrollado (0. Cuestión 3 (2 puntos). Algoritmo completo a partir del refinamiento del esquema general (2 puntos). Ningún Material. de capacidad T. . complejidad. (1) (2) (3) (4) (5) (6) (7) (8) (9) para i desde 1 hasta n hacer para j desde n hasta + 1 dec -1 hacer si [ − 1] > [ ] entonces = [ − 1]. vector de distancias y vector de nodos precedentes. y su orden exacto ( ) . Elección del esquema más apropiado.5 puntos). 3. Dado el grado de la figura. Cuenta el número de operaciones elementales que efectúa el siguiente fragmento de código f en los casos mejor y peor.5 puntos). indicando en cada paso: nodos seleccionados. Cuestión 1 (2 puntos). Se desea grabar un CD de audio. [ − 1] = [ ]. el esquema general y explicación de su aplicación al problema (1 punto). Descripción de las estructuras de datos necesarias (0. La resolución de este problema debe incluir. [ ]= fsi fpara fpara Cuestión 2 (2 puntos). nodos no seleccionados.ESCUELA TECNICA DE INGENIERIA INFORMATICA DE LA UNED (SISTEMAS Y GESTION) Programación III – Diciembre 2. Diseña un algoritmo que permita almacenar el máximo número de canciones en el espacio disponible. … . Puede suponerse que la colección de canciones está ordenada por longitud de menor a mayor. cumplen: ∑ > . por este orden: 1.006 Convocatoria Extraordinaria Tiempo: 2 horas. . por este orden: 1. Estructuras de datos (0. además: Voraz: demostración de optimalidad. Escribir en pseudocódigo una función recursiva de búsqueda binaria en un vector. En caso de utilizar algoritmos conocidos no es necesario codificarlos. Cuestión 2 (2 puntos).UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Febrero 2007 – Primera semana Cuestión 1 (2 puntos). Exploración en grafos: descripción del árbol de búsqueda asociado. 5. 3. Como siempre. y un número entero S. Elección razonada del esquema algorítmico mas eficiente para resolver el problema (0. Demuestra que el problema se puede resolver con el esquema elegido (0. la satisfacción de sus clientes es lo que importa: es mejor tener satisfechos al mayor número de ellos. Cada coche necesita un tiempo de revisión ri y al mecánico le da lo mismo por cuál empezar: sabe que en revisar todos los coches tardará lo mismo independientemente del orden que elija. La resolución del problema debe incluir. Algoritmo completo a partir del refinamiento del esquema general (1. un cliente estará más satisfecho cuanto menos tarden en devolverle el coche.5 puntos). 4. Implementar un programa que decida el orden en el que revisar uno a uno los coches para maximizar la satisfacción de los clientes de Sleepy. Hoy es un día duro para el taller Sleepy. todos necesitan que les devuelvan el coche en el menor tiempo posible.n ] de números enteros distintos.5 puntos). Cuestión 3 (2 puntos)..5 puntos). Pero al jefe de taller no le da lo mismo. (Resuelto en Estructuras de datos y métodos algorítmicos pag 338) Problema (4 puntos). Divide y vencerás: preorden bien fundado. Estudio del coste (1 punto). Según el esquema elegido hay que especificar.5 puntos). Al fin y al cabo. se pide plantear un programa de complejidad en Θ ( nlogn ) que determine si existen o no dos elementos de C tales que su suma sea exactamente S. Implementa en Java o Módula-2 la función de estimación de la cota en el problema del n-puzzle (práctica de este curso). Demuestra el coste que tiene la función implementada (1 punto). la planificación la hace él y. Llegan las vacaciones y a las 8:00 de la mañana n clientes han pedido una revisión de su coche. 2. . evidentemente. suponiendo que en algunos casos el elemento no está en el vector (1 punto). Dado un vector C [1. . si n ≥ b ⎩ ⎧Θ ( n k ) . k = 0 → Θ ( log n ) .. si a > b k ⎪Θ n b ⎩ ( ) Donde a = 1.. fun busquedabin (T [1.x ) si n = 0 ó x > T [ n ] entonces devolver n+1 sino devolver binrec (T [1. si 1 ≤ n < b ⎪ T (n) = ⎨ k ⎪aT ( n / b ) + cn . Implementa en Java o Módula-2 la función de estimación de la cota en el problema del n-puzzle (práctica de este curso).n ] . b = 2.1] < x ≤ T [ j ]} si i = j entonces devolver i k ← (i + j ) ÷ 2 si x ≤ T [ k ] entonces devolver binrec (T [i. Demuestra el coste que tiene la función implementada (1 punto).. Febrero 2007 (Primera Semana) Cuestión 1 (2 puntos). Escribir en pseudocódigo una función recursiva de búsqueda binaria en un vector.j ] .j ] con la seguridad de que T [i . suponiendo que en algunos casos el elemento no está en el vector (1 punto).. si a < b k ⎪ ⎪ T ( n ) ∈ ⎨Θ ( n k log n ) . Cuestión 2 (2 puntos).x ) {Búsqueda binaria de x en la submatriz T [i.n ] .k ] . si a = b k ⎪ log a ..x ) fun binrec (T [i.j ] .x ) sino devolver binrec (T [ k + 1.RESPUESTAS EXAMEN Programación III.x ) fsi ffun Para demostrar el coste utilizo la ecuación de recurrencia: ⎧cn k .. . S : ent ) dev existe : bool . En caso de utilizar algoritmos conocidos no es necesario codificarlos.n ] de ent . utilizando búsqueda binaria el entero S . por lo tanto el coste total es Θ ( nlogn ) . se pide plantear un programa de complejidad en Θ ( nlogn ) que determine si existen o no dos elementos de C tales que su suma sea exactamente S. n ) existe := existe ∧ p ≠ j {no puede usarse el mismo numero dos veces} j := j + 1.Cuestión 3 (2 puntos). (Resuelto en Estructuras de datos y métodos algorítmicos pag 338) Resuelvo el problema de la siguiente manera. Dado un vector C [1. funcion buscar − dos ( C [1. x2 : ent var V [1. x2 := S − x1 . y el coste del segundo paso está en Θ ( nlogn ) . p := busqueda − binaria (V .x .. y un número entero S. En el peor caso se hacen n búsquedas binarias de coste Θ ( logn ) cada una de ellas.n ] de números enteros distintos. x2 . existe. primero ordeno el vector C y segundo para cada elemento x de C buscar. fmientras ffuncion . mientras j ≤ n ∧ ¬existe hacer x1 := V [ j ] .n ] de ent V := C . ordenar (V ) j := 1. Si alguna de las búsquedas tiene éxito habremos encontrado dos elementos de C que suman S. existe := falso. Utilizando la ordenación por fusión el coste del primer paso está en Θ ( nlogn ) .. x1 .1. la satisfacción de sus clientes es lo que importa: es mejor tener satisfechos al mayor número de ellos. Elección razonada del esquema algorítmico más eficiente para resolver el problema.n] bool var F[1.n ..indice.n]nat) dev sol[1..n) ffun Estudio del coste El bucle voraz es de complejidad lineal respecto al número de clientes y el orden de complejidad del algoritmo completo corresponde al de la ordenación del vector de tiempos finales Θ ( nlogn ) . final := F[I[1]].1. Pero al jefe de taller no le da lo mismo. . Llegan las vacaciones y a las 8:00 de la mañana n clientes han pedido una revisión de su coche. para i=1 hasta n hacer F[i]:= C[i]+D[i]. Esquema general: fun voraz (C: conjunto) dev (S: conjunto) S ← ∅ mientras ¬ solucion (S) ∧ C ≠ ∅ hacer x ← elemento que maximiza objetivo (x) C ←C \ {x} si completable (S ∪ {x}) entonces S ← S ∪ {x} fsi dev S ffun Estructuras de datos: Tres vectores de enteros. Al fin y al cabo. I[1. Como siempre. todos necesitan que les devuelvan el coche en el menor tiempo posible. evidentemente. este problema se corresponde con el problema de minimización del tiempo en el sistema. un vector booleano y la función auxiliar ordenar índices.. sol[i]:= falso.n merge-indice(V.. Hoy es un día duro para el taller Sleepy. fsi fpara ffun fun ordenar-indices(V[1.n]nat.. D[1.. Cada coche necesita un tiempo de revisión ri y al mecánico le da lo mismo por cuál empezar: sabe que en revisar todos los coches tardará lo mismo independientemente del orden que elija. para este problema se puede encontrar una función de selección que lo resuelva. Algoritmo completo a partir del refinamiento del esquema general fun taller (C[1. final := F[I[i]]. debemos elegir a los clientes por orden creciente de tiempo de finalización. por lo tanto descarto el esquema de divide y vencerás. de esta manera descarto el esquema de ramificación y poda.n]1.Problema (4 puntos). Implementar un programa que decida el orden en el que revisar uno a uno los coches para maximizar la satisfacción de los clientes de Sleepy. fpara I:= ordenar-indices(F) sol[I[1]]:= cierto.n]1. Se trata de un problema de optimización. la planificación la hace él y...n]nat .. un cliente estará más satisfecho cuanto menos tarden en devolverle el coche. para i=2 hasta n hacer si C[I[i]]≥ final entonces sol[I[i]]:= cierto.n])dev indice [1. . 5 puntos). tipo vector = array de enteros. 2. . si (x = a[mitad]) entonces devolver cierto si no si (x < a[mitad]) entonces devolver examen(a. Estructuras de datos (0. Aplica el algoritmo de Kruskal al siguiente grafo indicando claramente en cada paso qué arista se selecciona. mitad-1. la evolución de las componentes conexas y la evolución de la solución.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Febrero 2007 – Segunda semana Cuestión 1 (2 puntos). ult. Elección razonada del esquema algorítmico mas eficiente para resolver el problema (0.5 puntos). Disponemos de un conjunto A de n números enteros (tanto positivos como negativos) sin repeticiones almacenados en una lista. siendo m < n se desea resolver el problema de encontrar un subconjunto de A compuesto por exactamente m elementos y tal que la suma de los valores de esos m elementos sea C. por este orden: 1. si (prim >= ult) entonces devolver a[ult] = x si no mitad = (prim + ult) div 2. procedimiento examen(var a:vector. Estudio del coste (1 punto). además: Voraz: demostración de optimalidad. x: entero): boolean. 4.5 puntos). 3. x) fsi fsi Cuestión 2 (2 puntos). Algoritmo completo a partir del refinamiento del esquema general (2. Dados dos valores enteros m y C. var mitad: entero. prim. Calcula el orden de complejidad del algoritmo en función de dicho tamaño (1. Escribe en Java el algoritmo principal del esquema de ramificación y poda utilizado en la práctica del presente curso (no es necesario implementar las funciones auxiliares).5 puntos).ult. Divide y vencerás: preorden bien fundado. prim. Exploración en grafos: descripción del árbol de búsqueda asociado. La resolución del problema debe incluir. Problema (4 puntos). mitad+1. Cuestión 3 (2 puntos). n. Según el esquema elegido hay que especificar.5 puntos). que determina el orden de complejidad del siguiente procedimiento? (0. ¿Cual es el tamaño del problema. x) si no devolver examen(a. . 5 puntos). puede irse por la la linea (6) (coste cte). tenemos que los valores son a = 1.ult. por la l´ ınea (8) (coste t(n/2) + cte) o por la l´ ınea (10) (coste t(n/2) + cte).Programaci´n III o Febrero de 2007 NOMBRE: APELLIDOS: DNI: Cuesti´n 1 (2 puntos) o ¿ Cual es el tama˜ o del problema. b = 2. prim. T(n) = T(n/2) + cte. d De donde T(n) ∈ Θ(logn). x) (9) si no (10) devolver examen(a. Θ(nk ) Θ(nk logn) T (n) ∈   Θ(nnlogb a ) . (5) si (x = a[mitad]) entonces (6) devolver cierto (7) si no si (x < a[mitad]) entonces (8) devolver examen(a. mitad+1. Planteamos la recurrencia con reducci´n del problema mediante divisi´n: o o n: tama˜ o del problema a: n´ mero de llamadas recursivas n/b: tama˜ o del subpron u n k blema cn : coste de las instrucciones que no son llamadas recursivas T (n) = entonces cnk aT (n/b) + cnk    si 0 ≤ n < b si n ≥ b si a < bk si a = bk si a > bk En nuestro caso.. mitad-1. n.prim)+1 b) Contando las instrucciones tenemos que si se cumple la condici´n de la l´ o ınea (1) el coste es cte. var mitad: entero. (1) si (prim >= ult) entonces (2) devolver a[ult] = x (3) si no (4) mitad = (prim + ult) div 2. Si se va por la l´ ınea (3). prim. x: entero): boolean. procedimiento examen(var a:vector. ult.5 puntos). que determina el orden de complejidad del n siguiente procedimiento? (0. cnk = cte. o n tipo vector = array de enteros. Por tanto. x) (11) fsi (12) fsi Soluci´n o a) n = (ult . k = 0. Calcula el orden de complejidad del algoritmo en funci´n de dicho tama˜ o (1. offer( nodoHijo ).generatePossibleChildren()) { cola.poll().isSolution() ) { return nodo. mantener la o cola tiene menos coste porque en general contendr´ menor n´ mero de nodos. Para descartar nodos. Queue<Node> cola = new PriorityQueue<Node>(). a u .Cuesti´n 2 (2 puntos) o Escribe en Java el algoritmo principal del esquema de ramificaci´n y poda utilio zado en la pr´ctica del presente curso (no es necesario implementar las funciones a auxiliares). while(!cola. Esta versi´n necesita menos o o memoria. cola. Por tanto. } } } return null. Soluci´n: o La implementaci´n m´s sencilla es dejar los nodos soluci´n dentro de la cola de o a o prioridad.add(nodoInicial). primero tenemos que encontrar una soluci´n que se convierte en la soluci´n de referencia.isEmpty() ) { Node nodo = cola. Por otro lado. la soluci´n anterior tiene el problema de que todos los nodos (incluidas o algunas soluciones) se guardan en memoria (en la cola de prioridad) a´ n sabiendo u que muchos no pueden proporcionar la soluci´n ´ptima. pero puede tener mayor coste computacional puesto que hay que recorrer la cola cada vez que encontramos una nueva soluci´n.getSolution(). } } Sin embargo. if( nodo. es posible refinar o o el algoritmo anterior para ir eliminando de la cola de prioridad todos los nodos que podamos ir descartando. Cuando el primero de la cola sea soluci´n entonces hemos encontrado la o soluci´n ´ptima porque el resto de nodos proporcionan una estimaci´n que a´ n en o o o u el mejor de los casos ser´ peor: ıa public class MejorPrimero implements SearchAlgorithm { public Solution SearchSolution(Node nodoInicial) { Solution solucion. } else { for(Node nodoHijo:nodo. Todos los nodos ya existentes o o con una estimaci´n peor se eliminan de la cola (m´todo depurar) y todos los nuevos o e nodos con una estimaci´n peor ya no se meten en la cola. MAX_VALUE. List<Node> depurationList = new ArrayList<Node>().getSolution(). if( costeReal < costeMejor ) { costeMejor = costeReal.next().calculateEstimatedCost()>costeMejor) { depurationList. la evoluci´n de las componentes conexas y la evoluci´n de e o o la soluci´n. if(cota < costeMejor) { cola. solucion = nodo. while(it. cola. if(node. } private void depurar(Queue<Node> cola.isEmpty() ) { Node nodo = cola. // Soluci’on inicial int costeMejor = Integer. depurar(cola. } } cola. } } } } return solucion. o .add(nodoInicial). while(!cola. } } else { for(Node nodoHijo:nodo.add(node).hasNext()) { Node node = (Node) it. } } Cuesti´n 3 (2 puntos) o Aplica el algoritmo de Kruskal al siguiente grafo indicando claramente en cada paso qu´ arista se selecciona. int costeMejor) { Iterator it = cola. if( nodo.offer( nodoHijo ).poll().getCost().isSolution() ) { int costeReal = nodo.public class RamificacionYPoda implements SearchAlgorithm { public Solution searchSolution(Node nodoInicial) { Queue<Node> cola = new PriorityQueue<Node>().calculateEstimatedCost().removeAll(depurationList).generatePossibleChildren()) { int cota=nodoHijo. costeMejor).iterator(). (2. (2.{5}.{3. siempre que el recorrido se detenga en el nivel correspondiente a m. Descripci´n de las estructuras de datos necesarias (0.5) (1.5).2.5). el esquema general y explicaci´n de su o a o aplicaci´n al problema (0.5 puntos).{4}.5). o 2. por lo que no son aplicables el esquema voraz ni el de ramificaci´n y o o poda. (1.{4}.{6} Rechazada∗ Rechazada∗ {1. (2.4) (5.{2}.4).5}. Elecci´n del esquema m´s apropiado.5). .{6} {1.5). (2. Tampoco se puede dividir el problema en subproblemas que se resuelvan con exactamente con el mismo procedimiento. (2.5}. siendo m < n se desea resolver el problema de encontrar un subconjunto de A compuesto por exactamente m elementos y tal que la suma de los valores de esos m elementos sea C.5).5}.4}.5)} {(3. no de una opu timizaci´n. por este orden: o 1.5).3) (1.3.3). (1.{3}.3)} {(3.{2}.{4}. Tenemos que recorrer un ´rbol de soluciones candidatas.3.1 3 4 3 1 5 5 2 2 7 9 6 10 6 4 8 Se ordenan las aristas de menor a mayor coste: Arista seleccionada (3. Algoritmo completo a partir del refinamiento del esquema general (2. (2.2.{6} {1}. Dados dos valores enteros m y C.4)} {(3.5. Selecci´n del esquema algor´ o ıtmico Se trata de una b´ squeda.6} Evoluci´n o de la soluci´n o ∅ {(3.3)} {(3.5)} {(3.3.3. La resoluci´n de este problema debe incluir.4. (2.5). (1.{6} {1. Tambi´n es v´lido un recorrido del a e a a ´rbol de soluciones en profundidad.5.6) Evoluci´n de las o componentes conexas {1}. o 3.2) (2. pero siguiendo aquellas a ramas que tengan opci´n de convertirse en una soluci´n (k-prometedoras) por lo o o que el esquema de vuelta atr´s es adecuado. (1.5) (2.5).{4}.5 puntos).{2.5).5). 4.3).3) (2.2. (1.3)} {(3. (5.6)} (*: ambos nodos en una misma partici´n) o Problema (4 puntos) Disponemos de un conjunto A de n n´ meros enteros (tanto positivos como negativos) u sin repeticiones almacenados en una lista. (2.5 puntos). Estudio del coste del algoritmo desarrollado (1 punto).{6} {1}. Adem´s esta segunda opci´n es m´s f´cil u a o a a de implementar. ensayo) si valido(e) entonces dev (cierto.solucion) <-. Es decir siempre se tendr´ dos opciones. As´ del nodo ra´ tendr´ ı ız ıamos n opciones para el nivel 1 del ´rbol.e) sino listaensayos <-. a En una primera aproximaci´n (que llamaremos A) podr´ representarse el ensayo o ıa como un vector de m enteros y los descendientes de un nodo de nivel k ser´ todas ıan los valores no tomados anteriormente.primero(listaensayos) listaensayos <-. solucion) fsi ffun esprometedora comprueba si se cumplen las condiciones de poda. a La segunda aproximaci´n (que llamaremos B) es m´s correcta y consistir´ en reo a ıa presentar el ensayo como un vector de n booleanos. Considerao o mos los siguientes apartados para cada una de las alternativas: Alternativa A 1. o 2. es decir ser´ una funci´n que compruebe que el n´ mero de sumandos ya seleccionaa o u dos es menor que m. Esquema general fun vuelta-atras(e: ensayo) dev (booleano. etc.vuelta-atras(hijo) fsi fmientras dev (es_solucion. Cuando m tiende a n. hasta el nivel m.Dependiendo de la representaci´n del ensayo y de la estrategia de ramificaci´n (geo o neraci´n de hijos) tenemos al menos dos aproximaciones para el esquema de vuelta o atr´s. De este modo los descendientes de un nodo de nivel k ser´ las opciones de tomar o no el valor k + 1 del vector ıan de entrada.compleciones(e) mientras no vacia(listaensayos) y no es_solucion hacer hijo <-. el n´ mero a a u de nodos del ´rbol es n!. en el caso peor que es cuando m tiende a n. compleciones es una funci´n que considera todos los numero que a´ n no han o u sido probados como siguiente elemento. Como se ver´ m´s adelante. estructuras de datos Tipo ensayo= candidatos: vector de enteros //numeros que aun no se han probado . u ıa a a es que la segunda alternativa evita considerar permutaciones. el ıan n´ mero de nodos ser´ 2n que es mejor que n! Lo que est´ ocurriendo b´sicamente. tomar los mismos n´ meros pero en orden diferente. valido comprueba que se haya alcanzado una soluci´n. A continuaci´n mostraremos la implementaci´n de las dos alternativas. en el nivel 2 tendr´ a ıamos n(n − 1) hijos. es decir.resto(listaensayos) si esprometedora(hijo) entonces (es_solucion. k ) dev (booleano. i) nuevo_ensayo. el numero de hijos del segundo u nivel es n(n − 1).num_sumados <-. Complejidad del algoritmo Una cota superior al tiempo de ejecuci´n ser´ el o ıa n´ mero de nodos del ´rbol.candidatos.anadir(lista_compleciones.e.num_sumados < m) entonces dev cierto si no dev falso funcion valido(e:ensayo) dev booleano si (e.e. algoritmo completo funcion compleciones(e: ensayo) dev lista_compleciones lista_compleciones <-. nuevo_ensayo) fpara dev lista_compleciones funcion esprometedora(e:ensayo) dev booleano si (e.e) .solucion.num_sumados = m) entonces dev cierto si no dev falso 4. es decir las combinaciones de n elementos tomados u a de m en m.solucion: vector de enteros suma: entero num_sumados: entero //numeros de la posible solucion // valor alcanzado hasta ese momento // cantidad de numeros que ya se han sumado 3. multiplicado por el n´ mero de posibles permutaciones. m) = n m m! = n! n! m! = = n(n − 1) · · · (n − m + 1) (m − n)!m! (n − m)! Llegamos al mismo resultado calculando el n´ mero de hijos de cada nivel del u a ´rbol: el n´ mero de hijos de primer nivel es n. Esquema general fun vuelta-atras(e: ensayo.suma = C) y (e. ya que estas u no se excluyen: T (n. ensayo) // e es k-prometedor si K=limite entonces dev (cierto.lista_vacia para cada i en e. hasta llegar al nivel (n − m + 1).candidatos hacer nuevo_ensayo <-. i) anadir(nuevo_ensayo. cuyo n´ mero de hijos es u n(n − 1) · · · (n − m + 1).suma <-.suma + i nuevo_ensayo.num_sumados + 1 lista_compleciones <-. Podemos observar que si m → n =⇒ T (n) ∈ O(n!) si m → 1 =⇒ T (n) ∈ O(n) Alternativa B 1.e eliminar(nuevo_ensayo. candidatos se inicializan a true y k toma el valor 0. nuevo_ensayo) dev lista_compleciones funcion esprometedora(e:ensayo) dev booleano si (e. k:entero) dev lista_compleciones lista_compleciones <-.vuelta-atras(hijo.e.candidatos[k] <-. algoritmo completo funcion compleciones(e: ensayo.solucion) <-.num_sumados = m) entonces dev cierto si no dev falso 4.k+1) mientras no vacia(listaensayos) y no es_solucion hacer hijo <-.suma = C) y (e. Estructuras de datos datos: vector de enteros //lista de numeros de entrada Tipo ensayo= candidatos: vector de booleanos //indica si el numero de cada posicion // se incluye en la solucion suma: entero // valor alcanzado hasta ese momento num_sumados: entero // cantidad de valores true de los candidatos 3.suma + datos[k] nuevo_ensayo.k+1) entonces (es_solucion.e // el valor asignado a la posicion K es false nuevo_ensayo.k+1) fsi fmientras dev (es_solucion.compleciones(e. Complejidad del algoritmo En cada nivel el ´rbol se divide como m´ximo a a en dos ramas (si no se ha llegado a tener m posicione a true).e.false lista_compleciones <-.lista_vacia nuevo_ensayo <-.sino listaensayos <-.num_sumados <-. . todas las posiciones de e. Luego una cota superior es 2n .num_sumados < m) entonces dev cierto si no dev falso funcion valido(e:ensayo) dev booleano si (e.anadir(lista_compleciones.anadir(lista_compleciones.e // el valor asignado a la posicion K es true nuevo_ensayo. solucion) fsi ffun En la llamada inicial a vuelta-atras.num_sumados + 1 lista_compleciones <-. 2. nuevo_ensayo) nuevo_ensayo <-.suma <-.primero(listaensayos) listaensayos <-.resto(listaensayos) si esprometedora(hijo. ıa a .Podemos observar que si m → n =⇒ T (n) ∈ O(2n ) si m → 1 =⇒ T (n) ∈ O(n) Este algoritmo ser´ m´s eficiente que el anterior cuando m → n. y un número ilimitado de recipientes iguales con capacidad R (con vi ≤ R. 4.2. Cuestión 3 (2.5 puntos).. por este orden: 1. 2.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Septiembre 2007 – Original Cuestión 1 (1 punto). de orden mejor que cuadrático. Dibuja la secuencia de llamadas del algoritmo y la evolución del siguiente vector al ordenarlo. Describe el grafo asociado al espacio de soluciones del problema del n-puzzle (Práctica de este curso). y sin superar su capacidad máxima. Supongamos que un polinomio se representa por un vector v[0. Se busca el mínimo número de recipientes necesarios para colocar todos los objetos. 1. . NOTA: La solución típica trivial de orden cuadrático puntúa 0 puntos. Escribe el algoritmo..5 puntos). Tenemos n objetos de volúmenes v1. Con respecto al algoritmo de ordenación por fusión (Mergesort). Cuestión 2 (2.2.3. Escriba dicho esquema general.1. 3. ∀i ). Elección razonada del esquema algorítmico más apropiado para resolver el problema.8) Problema (4 puntos). vn. que multiplique dos polinomios P(x) y Q(x) mediante divide y vencerás.5 puntos).6. La resolución de este problema debe incluir. Descripción de las estructuras de datos necesarias (0.n] de longitud n+1 donde el valor v[i] es el coeficiente de grado i.5 puntos).9. Estudio del coste del algoritmo desarrollado (1 punto). Describir claramente los cálculos y la descomposición algorítmica necesaria para plantear un algoritmo. Algoritmo completo a partir del refinamiento del esquema general (2 puntos).. Para ello ten en cuenta que hay que considerar que el problema es suficientemente pequeño cuando el subarray es de tamaño 2.5.0.(0. (2. 2. Los objetos se deben meter en los recipientes sin partirlos. . m+ n]. ⎢ n/2 ⎥ ] ← T[1.9.m+ n]) {Fusionar las matrices ordenadas U[1.3. Izquierda...5 puntos).. Sin embargo hay una manera de organizar las operaciones mediante la cual. sería constante.D polinomios de grado n/2 sacando factor común xn/2 como se detalla en las expresiones.V[1..2. sino sólo con uno.m+1]. y AC y BD los otros dos. De manera que (A+B)·( C+D) sería uno de los productos. ya que no se deben repetir.n] de longitud n+1 donde el valor v[i] es el coeficiente de grado i. Solución: • Cada nodo se bifurca como máximo en los cuatro movimientos posibles del hueco (arriba. Supongamos que un polinomio se representa por un vector v[0. j ← 1 U[m+1].8) procedimiento fusionar(U[1.n] ⎢ ⎥ ⎣ ⎦ ordenarporfusión(U[1. (2. j ← j + 1 fsi fpara fprocedimiento procedimiento ordenarporfusión (T[1.5.C.. 258 b) Dibuja la secuencia de llamadas del algoritmo y la evolución del siguiente vector al ordenarlo.. Este problema es similar al problema de la multiplicación de números enteros muy grandes del texto base. a) Escribe el algoritmo. En este último caso basta con observar que (A+B)·( C+D) = AC+BC+AD+BD y que BC+AD = (A+B)·( C+D) – AC – BD con lo que es posible realizar el cálculo con 3 productos en lugar de 4. ⎡ n/2 ⎤ ] ← T[1 + ⎢ n/2 ⎥ . Describir claramente los cálculos y la descomposición algorítmica necesaria para plantear un algoritmo. ⎡ n/2 ⎤ ] ) ⎢ ⎥ fusionar(U.. Cuestión 3 (2. T[1.5 puntos). NOTA: La solución típica trivial de orden cuadrático puntúa 0 puntos.0.. • La profundidad del árbol está limitada por el número de distintos tableros posibles ((nxn)!. siempre que sea posible. y derecha).B.m] y V[1. Describe el grafo asociado al espacio de soluciones del problema del n-puzzle (Práctica de este curso). Cuestión 2 (2.n]) si n es suficientemente pequeño entonces insertar(T) sino matriz U[1. ⎢ n/2 ⎥ ] ⎣ ⎦ ⎣ ⎦ V[1. Para ello ten en cuenta que hay que considerar que el problema es suficientemente pequeño cuando el subarray es de tamaño 2.1 + ⎢ n/2 ⎥ ]. no es necesario calcular AD+CD mediante 2 productos. abajo. capítulo 7.V[1. De esta forma se ve claramente que P·Q es (Axn/2 +B)·( Cxn/2+D) = AC xn + (AD+BC)xn/2 + BD lo que la solución conlleva 4 multiplicaciones de grado n/2. ⎣ ⎦ ⎣ ⎦ U[1.n+1]. ⎢ n/2 ⎥ ] ) ⎣ ⎦ ordenarporfusión(V[1.V. El coste sería en este caso cuadrático. aprovechando que ya tenemos realizados los productos BD y AC.2.V[n+1] ← ∞ para k ← 1 hasta m+ n hacer si U[i] < V[j] entonces T[k] ← U[i].U[m+1] y V[n+1] se utilizan como centinelas} i.RESPUESTAS EXAMEN Programación III.n] almacenándolas en T[1.i ← i + 1 sino T[k] ← V[j]. Solución: Es relativamente simple dar con la solución de orden cuadrático. se descompone en mitades P(x) = Axn/2+B y Q(x) = Cxn/2 +D con A. (a) El algoritmo se puede encontrar en Brassard & Bratley..T) fsi fprocedimiento . de orden mejor que cuadrático..6.. siendo n el tamaño del lado del tablero). En este caso.1 + ⎢ n/2 ⎥ ].1. Septiembre 2007 (Original) Cuestión 1 (1 punto).. ya que el coste de las sumas. que multiplique dos polinomios P(x) y Q(x) mediante divide y vencerás. pag.. Con respecto al algoritmo de ordenación por fusión (Mergesort)... si consideramos las multiplicaciones como lineales.. Se busca el mínimo número de recipientes necesarios para colocar todos los objetos.2) OrdFusion(2.9) OrdFusion(2) Insertar(2) -> (2) OrdFusion(1.(0. 4. por lo que tampoco es posible un esquema divide y vencerás. Elección razonada del esquema algorítmico más apropiado para resolver el problema.5.6) OrdFusion(3.9) OrdFusion(6. 3. Pearson education.. Ramificación y poda.8) OrdFusion(6. ∀i ).2. Estudio del coste del algoritmo desarrollado (1 punto).1.2. J. Descripción de las estructuras de datos necesarias (0.2.9) OrdFusion(2.2. La resolución de este problema debe incluir.5.8) OrdFusion(3) Insertar(3) -> (3) OrdFusion(5.2). y un número ilimitado de recipientes iguales con capacidad R (con vi ≤ R.1. Solución: Resuelto en Estructuras de datos y métodos algorítmicos.9) Problema (4 puntos).2. Los objetos se deben meter en los recipientes sin partirlos.8) Fusionar((3).6. para el que no existe una función de selección que permita ir seleccionando a cada paso el objeto que de lugar a la construcción parcial de la solución óptima. Escriba dicho esquema general.9) Fusionar((0.2.3.5.0.8) Fusionar((2. Algoritmo completo a partir del refinamiento del esquema general (2 puntos).9.1.8)) -> (2.3.9) Insertar(1.9).2. y sin superar su capacidad máxima.0) -> (0. 2.2.A Verdejo.(1.5.6). Por tanto no es posible aplicar un algoritmo voraz.9)) -> (1.8)) -> (0.2.(3.2.6. vn.8) -> (5.(5. (2.1.8.8)) -> (3. Se trata de un problema de optimización.3.3. Ejercicio 15.2) Insertar(6.2) -> (2.5.2. Tenemos n objetos de volúmenes v1.(b) OrdFusion(2. . Ortega. Y.8) OrdFusion(2.5 puntos).5.5.2. Indicaciones: 1.(1.0) Insertar(2.6.1.9) -> (1. vector de objetos: Podemos representar el reparto de objetos entre recipientes mediante un vector en el que cada posición indique a qué recipiente se ha asignado el objeto correspondiente. por este orden: 1. N. Tampoco existe una forma de dividir el problema en subproblemas que se puedan resolver independientemente.8) Fusionar((0.9) Fusionar((2).8) Insertar(5..0. 2004.1.9.3.5 puntos).9)) -> (0.Martí. 2.5.6.2. guardamos el número de envases utilizados y las capacidades disponibles de cada envase utilizado. se añadirá un nuevo envase a la solución parcial.objetos = vector[1. o coger uno vacío. por tanto. en el orden que se haya dado. y así hasta agotar todas las posibilidades. el primer objeto siempre se coloca en el primer envase (x1 = 1) y para cada objeto de los restantes se puede usar uno de los envases ya ocupados. En cada nodo. Una estimación del coste es el tamaño del árbol. es decir al número de objetos. se supone que todo objeto cabe en un envase vacío y.. página 499 de Estructura de datos y métodos algorítmicos. Pesimista: una cota superior muy sencilla es considerar un envase extra por cada objeto que nos queda por empaquetar.22. 4. pero resulta demasiado grosera. en el caso en que no quepa. la búsqueda podrá acabarse si encontramos una solución con el valor ⎡ ∑ n vi ⎤ optimo = ⎢ i =1 ⎥ ⎢ E ⎥ ⎢ ⎥ . además de la información usual (solución parcial.n k:1.. etapa y prioridad). intentarlo con el segundo envase. e intentar meterlo en el primer envase utilizand y.. como en la solución mediante la técnica de vuelta atrás (véase el ejercicio 14.22). en cuyo caso. Solución: En la solución del ejercicio 14.n]de real freg ftipos Además.. Montículo de mínimos en el que cada componente almacene una solución parcial (nodo) con su cota correspondiente.. ya que cada nodo del nivel k puede expandirse con los n-k objetos que quedan por asignar a recipientes. Las soluciones se representan en tuplas de la forma (x1.n envases:1. Podemos en cambio ir considerando cada objeto restante. Como los envases son indistinguibles. tenemos: Optimista: una cota inferior adecuada es el número de envases ya utilizados en la solución parcial.n]de 1.. si cabe en alguno.….n] of entero La solución es la cantidad entera S de recipientes empleados.xn) donde xi es el envase donde hemos colocado el objeto i. En cuanto a las estimaciones a utilizar para el esquema optimista-pesimista. que en el peor caso crece como Ο ( n !) . se necesitan un máximo de n envases. tipos nodo = reg sol[1.n {prioridad} capacidad[1. El número de recipientes está limitado a n. n]de 1. envase-mejor:= X.sol[1]:=1.n) var X.capacidad[1]:= E .capacidad[i].capacidad[i] fsi fpara si ¬encontrada entonces {probamos con un nuevo envase} nuevo:= Y.X) pes:=calculo-pesimista(E.sol.V.Y) envases-mejor:=calculo-pesimista(E. X.envases:=1 Y.envases encontrada:= (envases-mejor = optimo) {terminar} sino añadir(C. envase-mejor:1.V[1].. capacidad-aux:= X.sol.capacidad[2. Y..capacidad[i]:= X.X) pes:= calculo-pesimista(E.sol[X.capacidad.envases ≤ envases-mejor) hacer Y:=minimo(C).capacidad:= Y..k+1 hasta n hacer j:= 1 mientras V[i] > capacidad-aux [j] hacer j:= j+1 fmientras capacidad-aux [j] .n.n var capacidad-aux[1.n]de real)dev (sol-mejor[1. {probamos con cada envase ya utilizado} i:=1 mientras i ≤ Y. eliminar-min(C) {generamos los hijos de Y} X.Y) mientras ¬encontrada ^ ¬es-cp-vacia?(C)^(minimo(C).El algoritmo es el siguiente: fun empaquetar-rp(E:real.envases. añadir(C.k = n entonces sol-mejor:=X.X) envases-mejor:=min(envases-mejor.n]de real pes:=X.capacidad para i = X.V[X.sol X. X.k+1.V[1.envases:= Y. pes) fsi X.k] si X.capacidad[i] ≥ V[X...k]:=i.capacidad[i]:= Y.n]de real..envases ^ ¬encontrada hacer si X.k]:=nuevo.X:nodo)dev pes:1.Y: nodo.V[i] entonces pes := pes(pes..n]:= V[E] C:= cp-vacia(). X.k] entonces X. Y.k = n entonces sol-mejor:=X.V.envases ≤ envases-mejor entonces si X.envases + 1 X.V[X. Y. X.sol:=Y.k:=1.V.sol[X.envases:= nuevo X.pes) fsi fsi fmientras ffun Para calcular las estimaciones fun calculo-pesimista (E:real.k] si X.capacidad[nuevo]:= E .j) fpara ffun .C:colapr[nodo] total:=0 para i = 1 hasta n hacer total := total +V[i] fpara optimo:= ⎡total / E ⎤ ⎢ ⎥ encontrada:=falso {generamos raíz: el primer objeto en el primer envase} X.X) envases-mejor:= min(envases-mejor.V[1.k:=Y. envases-mejor:= nuevo encontrada:= (envases-mejor = optimo) {terminar} sino añadir(C.envases.. COMIENZO SI n < 2 ENTONCES DEVOLVER(1).2] a su segunda preferida. Descripción de las Estructuras de datos necesarias.r:entero. k+1).5 puntos) 3. La resolución de este problema debe incluir. 2) Que dada una pareja (h”. FIN r ← r + dos (n DIV 2. el esquema general y explicación de aplicación al problema. 2.·] es una ordenación de mayor a menor de las mujeres según las preferencias del i-ésimo hombre y la fila H[i. k ) ∈ Ο ( n ) NOTA: Acertar a ojo se evalúa con cero puntos. Por ejemplo.m’) se de el caso de m’ prefiera un h sobre h’ y además h’ prefiera a un m sobre m’. ¿Qué esquema algorítmico utilizaría para adivinar el número en tiempo logarítmico? Diseñe el algoritmo y escríbalo en pseudocódigo. k-1).5 puntos) . un programa establezca parejas evitando las dos situaciones descritas con anterioridad. DEVOLVER (r). SINO COMIENZO r ← uno (n DIV 2. (0. k+2). r ← r + dos (n DIV 2. Cuando un cliente llega a la agencia se describe a sí mismo y cómo le gustaría que fuera su pareja. La agencia matrimonial Celestina & Co. (0. r ← r + uno (n DIV 2. k+1). k-1). Elección del esquema más apropiado. VAR i. FIN FIN Cuestión 2 (2 puntos). k+2). VAR i. Dado el alto índice de divorcios. Estudio del coste del algoritmo desarrollado.m”) se de el caso de h” prefiera un m sobre m” y además m prefiera a h sobre h”. r ← r + uno (n DIV 2. Algoritmo completo a partir del refinamiento del esquema general. tales que la fila M[i. COMIENZO SI n < 2 ENTONCES DEVOLVER(1). (1 punto). siendo h ( n. por este orden: 1. Dos amigos juegan a un sencillo juego de adivinación: uno de ellos piensa un número natural positivo y el otro debe adivinarlo preguntando solamente si es menor o igual que otros números. Problema (4 puntos). (Resuelto en Estructuras de datos y métodos algorítmicos pag 312) Cuestión 3 (2 puntos). r ← r + h (n.·] es una ordenación de mayor a menor de los hombres según las preferencias de la i-ésima mujer.k:entero):entero.i).r. la empresa se ha planteado como objetivo que los emparejamientos sean lo más estables posible evitando las siguientes situaciones: 1) Que dada una pareja (h’. PROCEDIMIENTO uno (n. Hallar formalmente el coste de los siguientes algoritmos.1] almacenaría a la mujer preferida por el hombre i y M[i. PARA i ← 1 HASTA n HACER COMIENZO r ← h (n. r .r-1.i). Quiere informatizar parte de la organización de parejas entre sus clientes.r:entero. Con la información de los clientes la agencia construye dos matrices M y H que contienen las preferencias de los unos por los otros. FIN FIN PROCEDIMIENTO dos (n. SINO COMIENZO r ← dos (n DIV 2. (2 puntos) 4.k:entero):entero. M[i.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Septiembre 2007 Reserva Cuestión 1 (2 puntos). DEVOLVER (1). Declarar en Java las clases y/o estructuras de datos que utilizaría en el problema de puzzle (práctica de este año). La agencia quiere que dadas las matrices de preferencia. . r. si 1 ≤ n < b ⎪ T (n) = ⎨ k ⎪aT ( n / b ) + cn . Un bucle en el que se repite n veces un cálculo consistente en llamar dos veces a una función h(n. k+2). SINO COMIENZO r ← dos (n DIV 2. /*más una instrucción simple*/. si n ≥ b ⎩ ⎧Θ ( n k ) . r ← r + h (n. Aplicando la resolución genérica de las expresiones del tipo: T(n) = aT(n/b)+cnk con k = 0.i). FIN FIN PROCEDIMIENTO dos (n.r-1. PARA i ← 1 HASTA n HACER COMIENZO r ← h (n.r. que no tenemos en cuenta para el cálculo. //En el segundo y tercer caso de la llamada recursiva hay otra instrucción simple añadida. r ← r + uno (n DIV 2. a = 3. VAR i. y por último Una instrucción simple /* que no tenemos en cuenta para el calculo*/ y otra llamada recursiva de tamaño n/2. FIN FIN El procedimiento uno tiene: Una instrucción constante. k+2). si a > b k ⎪Θ n b ⎩ ( ) . k+1). PROCEDIMIENTO uno (n. b = 2. COMIENZO SI n < 2 ENTONCES DEVOLVER(1). VAR i. si a = b k ⎪ log a . r . lo que equivale a T(n) = 3T(n/2) + 2n2 Aplicando la resolución genérica de las expresiones del tipo T(n) = aT(n/b) + cnk y siendo 3 < 2 2 el coste es O(n2).i).k:entero):entero.r:entero. FIN r ← r + dos (n DIV 2. siendo h ( n. si a < b k ⎪ ⎪ T ( n ) ∈ ⎨Θ ( n k log n ) .RESPUESTAS EXAMEN Programación III. Otra llama recursiva de tamaño n/2. r ← r + uno (n DIV 2.r:entero. o bien tres llamadas recursivas. a=3 y b=2 queda que 3 > 20 y por tanto la función T(n) tiene un coste El procedimiento dos tiene: Ο n log 2 3 ( ) Una llamada recursiva de tamaño n/2. Sumando los términos nos sale T(n) = T(n/2) +T(n/2)+n (2n) +T(n/2). k-1).k) de coste lineal. La expresión queda T(n) = T(n/2) + T(n/2) + T(n/2) lo que equivale a T(n) = 3T(n/2) + c. r ← r + dos (n DIV 2. DEVOLVER (1).k:entero):entero. SINO COMIENZO r ← uno (n DIV 2. ambas invocan la función con un tamaño n/2. k ) ∈ Ο ( n ) NOTA: Acertar a ojo se evalúa con cero puntos. Hallar formalmente el coste de los siguientes algoritmos. DEVOLVER (r). Septiembre 2007 (Reserva) Cuestión 1 (2 puntos). COMIENZO SI n < 2 ENTONCES DEVOLVER(1). k+1). k = 2 ⎧cn k . k-1). ..j ] .x ) sino devolver binrec (T [ k + 1.bin2 ( c.csup ) csup Cuestión 3 (2 puntos)..n ] . csup := 1.n ] . fmientras n := bus . Declarar en Java las clases y/o estructuras de datos que utilizaría en el problema de puzzle (práctica de este año).Cuestión 2 (2 puntos).csup := 2 ⋅ csup..1] < x ≤ T [ j ]} si i = j entonces devolver i k ← (i + j ) ÷ 2 si x ≤ T [ k ] entonces devolver binrec (T [i.bin2 ( cinf.k ] .x ) fsi ffun Para adivinar el número utilizaré una variación de búsqueda binaria: fun bus .bin2 ( c.bin2 ( m+1. mientras ¬menor . fun busquedabin (T [1.igual ( m ) entonces n := bus .j ] . ..m ) sino n := bus .x ) fun binrec (T [i. f ) dev n si c = f entonces n := c sino m := ( c + f ) div2 si menor . ¿Qué esquema algorítmico utilizaría para adivinar el número en tiempo logarítmico? Diseñe el algoritmo y escríbalo en pseudocódigo. (Resuelto en Estructuras de datos y métodos algorítmicos pag 312) Utilizaría la búsqueda binaria ya que como pide el enunciado se obtiene un coste logarítmico.x ) si n = 0 ó x > T [ n ] entonces devolver n+1 sino devolver binrec (T [1.igual ( csup ) hacer cinf := csup +1.j ] con la seguridad de que T [i . f ) fsi fsi ffun fun adivinar ( ) dev n {encontrar cotas superior e inferior} cinf := 1.x ) {Búsqueda binaria de x en la submatriz T [i.. Dos amigos juegan a un sencillo juego de adivinación: uno de ellos piensa un número natural positivo y el otro debe adivinarlo preguntando solamente si es menor o igual que otros números. Comportamiento del algoritmo: • El algoritmo trabajará por etapas y en cada etapa k decide la mujer que ha de emparejarse con el hombre k-ésimo • En una etapa cualquiera k. Cuando un cliente llega a la agencia se describe a sí mismo y cómo le gustaría que fuera su pareja.m”) se de el caso de h” prefiera un m sobre m” y además m prefiera a h sobre h”. Un array asignado[1.n ] que contienen las preferencias de unos por los otros.j] : mujer a la que prefiere el hombre i-ésimo en el lugar de preferencia j-ésimo. Algoritmo completo a partir del refinamiento del esquema general..5 puntos) 1. (1 punto). la empresa se ha planteado como objetivo que los emparejamientos sean lo más estables posible evitando las siguientes situaciones: 1) Que dada una pareja (h’.Problema (4 puntos).5 puntos) 3.. 1.atrás(ensayo) si valido (ensayo) {es una solución} entonces dev ensayo si no para cada hijo ∈ compleciones (ensayo) hacer si condiciones de poda (hijo) hacer vuelta . Elección del esquema más apropiado. La agencia matrimonial Celestina & Co. 2. (0. Elección del esquema: fun vuelta . 2) Que dada una pareja (h”. (0. Dado el alto índice de divorcios.·] es una ordenación de mayor a menor de las mujeres según las preferencias del i-ésimo hombre y la fila H[i. 1.·] es una ordenación de mayor a menor de los hombres según las preferencias de la i-ésima mujer.1] almacenaría a la mujer preferida por el hombre i y M[i.j] : hombre al que prefiere la mujer i-ésima en el lugar de preferencia j-ésimo.n. M[i. por este orden: 1. m [i. Con la información de los clientes la agencia construye dos matrices M y H que contienen las preferencias de los unos por los otros. tales que la fila M[i. un programa establezca parejas evitando las dos situaciones descritas con anterioridad.. Descripción de las Estructuras de datos necesarias. Estudio del coste del algoritmo desarrollado. Por ejemplo. Quiere informatizar parte de la organización de parejas entre sus clientes. el esquema general y explicación de aplicación al problema.. el k-ésimo hombre escogerá la mujer que prefiere en primer lugar siempre que ésta esté libre y la pareja resulte estable . Descripción de las Estructuras de datos necesarias • • Dos matrices m[1.n.n] que indicará si una mujer está o no asignada libre [i] : valor booleano que indica si la mujer i-ésima ha sido asignada.m’) se de el caso de m’ prefiera un h sobre h’ y además h’ prefiera a un m sobre m’.n ] y h[1. h [i.2] a su segunda preferida.. (2 puntos) 4. La resolución de este problema debe incluir.atrás(hijo) fsi fpara fsi ffun 2. La agencia quiere que dadas las matrices de preferencia. Estudio del coste del algoritmo desarrollado..n]..1.k:1.asignado[1.1... asignado) fproc 4..1..M[1. k]) i= i+1.k:1.n]1..k+1..n]. Algoritmo completo a partir del refinamiento del esquema general. k] ≤ H[sol[i]. sol[k]] ∨ H[sol[i].sol..n. i=1. Si sumamos ambas complejidades obtenemos: O(n!) + O(n4 ) = O(n!) Se deduce que la complejidad temporal es: O(T(n))= O(n!) ..sol. sol[i]] ≤ M[k..1.n.M[1. Sea T(n) el tiempo de ejecución del algoritmo.. fmientras ffun proc parejas (H[1.o proc parejasVA (H[1.n... esta función posee una complejidad O(n4). sol[k]] ≤ M[i. sol[i]] ∨ H[sol[k]. sol. mientras i<k ∧ respuesta hacer respuesta = (M[k..n]bool asignado[1.n]..n..asignado) fsi fsi asignado[hombre] = falso fsi fpara fproc fun estable?(H[1.1.n.. parejasVA (H.sol[1..1. 1. El coste adicional sale de que esta función llama a la función estable.n) dev respuesta bool respuesta = cierto.n].n]1.3.k) entonces si k = n entonces imprimir (sol) sino parejasVA(H.n].M.n.n.n. M. i]) ∧ (M[i. asignado[1. i] ≤ H[sol[k].. El algoritmo principal posee un bucle para que se ejecuta n veces y llamada recursiva que se ejecuta también n veces.sol[1..n] = [falso]..n].M.M[1.n]bool) para hombre = 1 hasta n hacer si ¬asignado[hombre] entonces sol[k] = hombre asignado[hombre] = cierto si estable?(H.n]) var sol[1.n. El tío Facundo posee n huertas. Las frutas ya han madurado y es hora de recolectarlas. Estudio del coste (1 punto). Escribe el grafo asociado al espacio de soluciones del problema del nonograma. La resolución del problema debe incluir.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Febrero 2008 – Primera semana Cuestión 1 (1. el beneficio bi que obtendría por la venta de lo recolectado.5 puntos). Se supone que a partir de dicho nodo se 2 van a comenzar a explotar la fila 3. cotas en función del esquema propuesto) y el coste asociado. (No puntúa la exploración por fuerza bruta de coste 2n ). Algoritmo completo a partir del refinamiento del esquema general (2 puntos). 4. necesita minimizar la expresión: E (n) = ∑ Ei i =1 n Indica qué esquema o esquemas consideras más adecuados para resolver este problema en los siguientes casos: • • La empresa sólo dispone de un fontanero para realizar las reparaciones y quiere minimizar el tiempo medio de espera de los clientes. c) 4n 2 − 3n + 2 ∈ Ω(n log n) .5 puntos). El tiempo que se tarda en recolectar los frutos de cada finca es así mismo variable (no unitario) y viene dado por ti. La empresa dispone de F fontanero para realizar las reparaciones y quiere minimizar el tiempo medio de espera de los clientes. Como en su empresa le pagan dependiendo de la satisfacción del cliente. Problema (4 puntos). b) n 2 ∈ Ω(n3 ) . explica el porque de su elección. necesita decidir el orden en el que atenderá los avisos para minimizar el tiempo medio de espera de los clientes. . d) n !∈ Θ(2n + 1) Cuestión 3 (2.5 puntos). No se piden los algoritmos. para cada una de las huertas. Si llamamos Ei a lo que espera el cliente i-ésimo hasta ver reparada su avería por completo. También sabe los días di que tardan en pudrirse los frutos de cada huerta. ¿Cuáles de las siguientes afirmaciones son verdaderas y cuales falsas? Demuestra tus respuestas. 2. y sabe de antemano el tiempo que le va a llevar cada una de ellas: en la tarea i-ésima tardará ti minutos. restricciones. 3. Cuestión 2 (2 puntos). los aspectos destacados de cómo resolverías el problema (función de selección. cada una con un tipo diferente de árboles frutales. El tío Facundo conoce. por este orden: 1. a partir del nodo que se presenta a continuación. Se pide ayudar a decidir al tío Facundo que debe recolectar para maximizar el beneficio total obtenido. En una fontanería se necesitan hacer n reparaciones urgentes. Estructuras de datos (0. Además de nombrar el esquema o esquemas. Elección razonada del esquema algorítmico mas eficiente para resolver el problema (0. a) n 2 ∈ O(n 3 ) .5 puntos). . (No puntúa la exploración por fuerza bruta de coste 2n ). Si lim 3. c) 4n 2 − 3n + 2 ∈ Ω(n log n) . entonces f ( n ) ∈ Θ ( g ( n ) ) n →∞ g ( n ) 2. Escribe el grafo asociado al espacio de soluciones del problema del nonograma.RESPUESTAS EXAMEN Programación III. b) n 2 ∈ Ω(n3 ) . Febrero 2008 (Primera Semana) Cuestión 1 (1. Si lim n →∞ f (n) ∈ 0 . a partir del nodo que se presenta a continuación. . entonces f ( n ) ∈ O ( g ( n ) ) pero f ( n ) ∉ Θ ( g ( n ) ) g ( n) n →∞ f ( n) ∈ +∞ . X O X X X O O X O O X X X X X O O X X O X O O X X X O X X O Cuestión 2 (2 puntos). entonces f ( n ) ∈ Ω ( g ( n ) ) pero f ( n ) ∉ Θ ( g ( n ) ) g ( n) a) n 2 ∈ O(n 3 ) lim n2 2n 2 0 = lim 2 = lim = =0 3 n →∞ n n →∞ 3n n →∞ 6n 6 Por lo tanto a es cierto.5 puntos). a) n 2 ∈ O(n 3 ) . Se supone que a partir de dicho nodo se 2 van a comenzar a explotar la fila 3. Si lim ∈ℜ+ . d) n !∈ Θ(2n + 1!) REGLA DEL LÍMITE: f ( n) 1. ¿Cuáles de las siguientes afirmaciones son verdaderas y cuales falsas? Demuestra tus respuestas. es decir. Sin embargo. denominemos X = (x1. En = t1 + t2 + .. restricciones. la expresión de los tiempos de espera de los clientes viene dada por: E 1 = t1 E 2 = t1 + t2 . Además de nombrar el esquema o esquemas.sn) sus respectivos tiempos de ejecución.x2. No se piden los algoritmos. Lo que queremos encontrar es una permutación de las tareas en donde se minimice la expresión de E(n) que. independientemente de la forma en que las ordene. y sean (s1. + tn en realizar todas las reparaciones..n)... explica el porque de su elección. c) 4n 2 − 3n + 2 ∈ Ω(n log n) 4n 2 − 3n + 2 8n − 3 8 lim = lim = 1 = +∞ n →∞ n →∞ ln n + 1 n log n n Por lo tanto c es cierto.. Como en su empresa le pagan dependiendo de la satisfacción del cliente.xn) a una permutación de los elementos (1.. Solución: En primer lugar hemos de observar que el fontanero siempre tardará el mismo tiempo global T = t1 + t2 + . En efecto.. necesita decidir el orden en el que atenderá los avisos para minimizar el tiempo medio de espera de los clientes..2... y sabe de antemano el tiempo que le va a llevar cada una de ellas: en la tarea i-ésima tardará ti minutos..... Para ello. Si llamamos Ei a lo que espera el cliente i-ésimo hasta ver reparada su avería por completo. si mantiene la ordenación original de las tareas (1..b) n 2 ∈ Ω(n3 ) lim n2 2n 2 0 = lim 2 = lim = =0 n →∞ n 3 n →∞ 3n n →∞ 6n 6 Por lo tanto b es falso..s2. necesita minimizar la expresión: E (n) = ∑ Ei i =1 n Indica qué esquema o esquemas consideras más adecuados para resolver este problema en los siguientes casos: • • La empresa sólo dispone de un fontanero para realizar las reparaciones y quiere minimizar el tiempo medio de espera de los clientes. (s1... cotas en función del esquema propuesto) y el coste asociado... La empresa dispone de F fontaneros para realizar las reparaciones y quiere minimizar el tiempo medio de espera de los clientes.. n). .. En una fontanería se necesitan hacer n reparaciones urgentes. los tiempos de espera de los clientes sí dependen de esta ordenación. + tn . basándonos en las ecuaciones anteriores. Cuestión 3 (2..sn) va a ser una permutación .. d) n !∈ Θ(2n + 1!) lim [ n ⋅ (n − 1)!] / n = lim (n − 1)! = +∞ n! n ⋅ (n − 1)! = lim = lim n →∞ 2n + 1! n →∞ n →∞ 2n / n + 1/ n n →∞ 2n + 1 2 Por lo tanto d es falso. 2..5 puntos)...s2. los aspectos destacados de cómo resolverías el problema (función de selección. viene dada por: Vamos a demostrar que la permutación óptima es aquella en la que los avisos se atienden en orden creciente de sus tiempos de reparación. de los tiempos orginales (t1,t2,...,tn). Supongamos que no está ordenada en orden creciente de tiempo de reparación, es decir, que existen dos números xi < xj tales que si > sj. Sea Y = (y1,y2,...,yn) la permutación obtenida a partir de X intercambiando xi con xj, es decir, yk = xk si k ⎯ i y k ⎯ j, yi = xj, yj = xi. Si probamos que E(Y) < E(X) habremos demostrado lo que buscamos, pues mientras más ordenada (según el criterio dado) esté la permutación, menor tiempo de espera supone. Pero para ello, basta darse cuenta que E (Y ) = ( n - xi +1) s j + ( n - x j +1) si + y que, por tanto: k=1, k ≠ i,k ≠ j ∑ ( n - k +1) s n k E ( X ) − E (Y ) = ( n - xi +1) ( si − s j ) + ( n - x j +1)( s j − si ) = ( x j − xi )( si − s j ) > 0 En consecuencia, el algoritmo pedido consiste en atender a las llamadas en orden inverso a su tiempo de reparación. Con esto conseguirá minimizar el tiempo medio de espera de los clientes, tal y como hemos probado. En el segundo caso también tenemos que minimizar el tiempo medio de espera de los clientes, pero lo que ocurre es que ahora existen F fontaneros dando servicio simultámeamente. Basándonos en el método utilizado anteriormente, la forma óptima de atender los avisos va a ser la siguiente: • • En primer lugar, se ordenan los avisos por orden creciente de tiempo de reparación. Un vez hecho esto, se van asignando los avisos por este orden, siempre al fontanero menos ocupado. En caso de haber varios con el mismo grado de ocupación, se escoge el de número menor. En otras palabras, si los avisos están ordenados de forma que ti ≤ tj si i < j, asignaremos al fontanero k los avisos k, k+F, k+2F, ... Problema (4 puntos). El tío Facundo posee n huertas, cada una con un tipo diferente de árboles frutales. Las frutas ya han madurado y es hora de recolectarlas. El tío Facundo conoce, para cada una de las huertas, el beneficio bi que obtendría por la venta de lo recolectado. El tiempo que se tarda en recolectar los frutos de cada finca es así mismo variable (no unitario) y viene dado por ti. También sabe los días di que tardan en pudrirse los frutos de cada huerta. Se pide ayudar a decidir al tío Facundo que debe recolectar para maximizar el beneficio total obtenido. (Solucionado en el ejercicio 15.4 pág 516 de Estructura de datos y métodos algorítmicos) Solución: En el ejercicio 14.6, página 463 de Estructura de datos y métodos algorítmicos, vimos la solución a este problema mediante la técnica de vuelta atrás. Representamos las soluciones mediante tuplas (x1,…,xn) donde xi = 1 indica que los frutos de la huerta i se recolectan mientras que xi = 0 indica que los frutos de la huerta no se recolectan. También vimos como comprobar que un subconjunto de huertas es factible, es decir, que todas pueden recolectarse sin superar su plazo, manteniendo las huertas ordenadas por tiempo de caducidad creciente. En cuanto a las estimaciones a utilizar para el esquema optimista-pesimista, tenemos: Optimista: Como ya vimos en el ejercicio 14.6, podemos aproximar superiormente el beneficio obtenible sumando el beneficio de todas las huertas que pueden recolectarse sin llegar a su fecha de caducidad después de las ya elegidas (es decir, empezando a recolectar cada una justo después de terminar con la última finca ya elegida). Pesimista: igual que en el ejercicio 15.2, podemos obtener una cota pesimista calculando una posible solución extensión de la que tengamos: las huertas no consideradas se van recolectando en orden (acumulando el tiempo), siempre que no se supere su fecha de caducidad. En cada nodo, además de la información usual (solución parcial, etapa y prioridad), mantendremos el tiempo y beneficio acumulados. tipos nodo = reg sol[1..n]de 0..1 k:0..n tiempo.beneficio:real beneficio-opt:real {prioridad} freg ftipos El algoritmo es el siguiente: fun huertas-rp(T[1..n],D[1..n],B[1..n]de real)dev (sol-mejor[1..n]de 0..1, beneficio-mejor:real) var X,Y: nodo,C:colapr[nodo] {generamos raíz} X.k:=0; Y.tiempo:=0; Y.beneficio:=0 Y.beneficio-opt:=calculo-optimista(T,D,B,Y.k,Y.tiempo,Y.beneficio) C:= cp-vacia(); añadir(C,Y) beneficio-mejor:=calculo-pesimista(T,D,B,Y.k,Y.tiempo,Y.beneficio) mientras ¬es-cp-vacia?(C)^(maximo(C).beneficio-opt ≥ beneficio-mejor) hacer Y:=maximo(C); eliminar-max(C) X.k:=Y.k+1; X.sol:=Y.sol {hijo izquierdo - recolectar} si Y.tiempo+T[X.k] ≤ D[X.k] entonces {es factible} X.sol[X.k]:=1; X.tiempo:= Y.tiempo+T[X.k] X.beneficio:= Y.beneficio + B[X.k] X.beneficio-opt:= calculo-optimista(T,D,B,Y.k,Y.tiempo,X.beneficio) si X.beneficio-opt ≥ beneficio-mejor entonces si X.k = n entonces sol-mejor:=X.sol; beneficio-mejor:= X.beneficio sino añadir(C,X) {la estimación pesimista coincide con la de Y} {beneficio-mejor no cambia} fsi fsi fsi {hijo deerecho – no recolectar} X.sol[X.k]:=0; X.tiempo:= Y.tiempo X.beneficio:= Y.beneficio X.beneficio-opt:= calculo-optimista(T,D,B,Y.k,Y.tiempo,X.beneficio) si X.beneficio-opt ≥ beneficio-mejor entonces si X.k = n entonces sol-mejor:=X.sol; beneficio-mejor:= X.beneficio sino añadir(C,X) pes:= calculo-pesimista(T,D,B,Y.k,X.tiempo,X.beneficio) beneficio-mejor:= max(beneficio-mejor,pes) fsi fsi fmientras ffun Las funciones que calculan las estimaciones son las siguientes: fun calculo-optimista (T[1..n],B[1..n],B[1..n]de real,k:0..n,tiempo,beneficio:real)dev opt:real opt:=beneficio para i = k+1 hasta n hacer si tiempo+T[i] ≤ D [i] entonces opt := opt+ B[i] fsi fpara ffun fun calculo-pesimista (T[1..n],B[1..n],B[1..n]de real,k:0..n,tiempo,beneficio:real)dev pes:real pes:=beneficio; tiempo-pes:= tiempo para i = k+1 hasta n hacer si tiempo-pes+T[i] ≤ D [i] entonces pes := pes+ B[i]; tiempo-pes:= tiempo-pes+T[i] fsi fpara ffun UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Febrero 2008 – Segunda semana Cuestión 1 (2 puntos). En la práctica obligatoria del presente curso 2007/2008 se ha tenido que diseñar y desarrollar un algoritmo para resolver el problema del nonograma. Dado el cuadrado de 4x4 de la figura, trazar el algoritmo que lo resuelve tal como lo hace el desarrollado para la práctica y explicar cada paso. Hacer al menos 3 niveles y al menos 2 backtrakings. Restricciones del nonograma: Cuestión 2 (2 puntos). Sea T[1..n] con k elementos (k<n) un montículo de mínimos. Se pide programar una función “flotar” recursiva que dado un nuevo elemento T[k+1] restaure la propiedad de montículo en T. Una función iterativa que lo resuelva puntuará cero puntos. Cuestión 3 (2 puntos). Dado n potencia de 2, escribe un algoritmo recursivo que calcule en tiempo logarítmico el valor de an suponiendo que solo se pueden realizar multiplicaciones y que éstas tienen coste unitario. Demuestre el coste mediante la ecuación de recurrencia. No justifique el esquema usado, aplíquelo. Problema (4 puntos). Una flota de 4 camiones (T1..T4) debe transportar cargamento variado a otras tantas ciudades (C1..C4). El coste de adjudicar el transporte varía en función de la distancia y de la peligrosidad del trayecto y se resume en la tabla adjunta. Exponer un algoritmo que calcule de manera óptima a quién encargarle qué destino de manera que en total el coste sea mínimo. La resolución del problema debe incluir, por este orden: 1. Elección razonada del esquema algorítmico mas eficiente para resolver el problema (0,5 puntos). 2. Estructuras de datos (0,5 puntos). 3. Algoritmo completo a partir del refinamiento del esquema general (2,5 puntos). 4. Estudio del coste (0,5 punto). Según el esquema elegido hay que especificar, además: Voraz: demostración de optimalidad. Divide y vencerás: preorden bien fundado. Exploración en grafos: descripción del árbol de búsqueda asociado. RESPUESTAS EXAMEN Programación III. Febrero 2008 (Segunda Semana) Cuestión 1 (2 puntos). En la práctica obligatoria del presente curso 2007/2008 se ha tenido que diseñar y desarrollar un algoritmo para resolver el problema del nonograma. Dado el cuadrado de 4x4 de la figura, trazar el algoritmo que lo resuelve tal como lo hace el desarrollado para la práctica y explicar cada paso. Hacer al menos 3 niveles y al menos 2 backtrakings. Restricciones del nonograma: Solución: En función del algoritmo desarrollado por el alumno en la práctica. Cuestión 2 (2 puntos). Sea T[1..n] con k elementos (k<n) un montículo de mínimos. Se pide programar una función “flotar” recursiva que dado un nuevo elemento T[k+1] restaure la propiedad de montículo en T. Una función iterativa que lo resuelva puntuará cero puntos. Proc Flotar ( i, T [1...n ]) ; i_padre := i div 2; Si ( i > 1) y T [i ] < T [i_padre ] entonces Intercambiar (T [i ] , T [i_padre]) ; Flotar ( i_padre,T ) ; fFlotar; Cuestión 3 (2 puntos). Dado n potencia de 2, escribe un algoritmo recursivo que calcule en tiempo logarítmico el valor de an suponiendo que solo se pueden realizar multiplicaciones y que éstas tienen coste unitario. Demuestre el coste mediante la ecuación de recurrencia. No justifique el esquema usado, aplíquelo. fun exp (a:entero,n:natural) dev entero si n=1 entonces dev a sino si n=0 entonces dev 1 sino t ← exp(a,n DIV 2) dev t ⋅ t fsi ffun En este problema: a=1, b=2, k=0, luego el caso es T ( n ) ∈ Θ n k logn por lo que el coste es T ( n ) ∈ Θ ( logn ) ⎧cn k ⎪ T (n) = ⎨ k ⎪aT ( n / b ) + cn ⎩ ⎧Θ ( n k ) ⎪ ⎪ T ( n ) ∈ ⎨Θ ( n k logn ) ⎪ log a ⎪Θ n b ⎩ , si 1 ≤ n < b , si n ≥ b , si a < b k , si a = b k , si a > b k ( ) ( ) n tiempo:real tiempo-opt:real {prioridad} asignado[1.6 del libro Esquemas Algorítmicos: Enfoque metodológico y problemas resueltos. Solución: El problema de las asignaciones Seccion 9. página 508 de Estructura de datos y métodos algorítmicos.. si no para cada hijo en compleciones(nodo) hacer cota:=acotar(hijo).7 Brassad&Bradley..C4).T4) debe transportar cargamento variado a otras tantas ciudades (C1. fsi. Una flota de 4 camiones (T1. Montículo). si solución(nodo) entonces devolver nodo.nodo_raíz).Montículo). Rodríguez. Exponer un algoritmo que calcule de manera óptima a quién encargarle qué destino de manera que en total el coste sea mínimo. Escribir el esquema general. nodo):=quitarPrimero(Montículo).. Montículo de mínimos (cota mejor la de menor coste) tipos nodo = reg sol[1..n k:0. ejercicio 15. El coste de adjudicar el transporte varía en función de la distancia y de la peligrosidad del trayecto y se resume en la tabla adjunta.. poner((cota. M. cota:=acotar(nodo_raíz). fmientras devolver Ø Indicar que estructuras de datos son necesarias.Problema (4 puntos). Gonzalo..1. J.hijo). poner((cota.n]de 1.n]de bool freg ftipos . Función RamificaciónPoda (nodo_raíz) dev nodo Montículo:=montículoVacío(). fpara. mientras no vacío(Montículo) hacer (cota. Similar al problema 4. asignado[t] entonces X..j]) lento[i]:= max(lento[i].n. tiempo-mejor:= X. tiempo-mejor:real) var X.k:=0.. En el caso peor se generan (k-1) hijos por cada nodo del nivel k.tiempo:=0.1] lento[i]:= T[i.X) tiempo-mejor:= min(tiempo-mejor..t] X.. pes[0. 1.asignado para t=1 hasta n hacer si ¬ X.n.k] si X.sol[X.n]de real)dev (sol-mejor[1. añadir(C. para i = n-1 hasta 0 paso -1 hacer opt[i]:= opt[i+1]+ rapido[i+1] pes[i]:= pes[i+1]+ lento[i+1] fpara ffun Coste: En este caso únicamente podemos hallar una cota superior del coste del algoritmo por descripción del espacio de búsqueda.. eliminar-min(C) {generamos los hijos de Y} X.sol.1] para j = 2 hasta n hacer rapido[i]:= min(rapido[i].asignado[t]:= cierto X..tiempo-opt ≤ tiempo-mejor entonces si X.tiempo-opt ≤ tiempo-mejor) hacer Y:= minimo C)..asignado[1.Y) tiempo-mejor:= pes[0] mientras ¬es-cp-vacia?(C)^(minimo(C)..k+1.tiempo sino añadir(C. X.n]. X..j]) fpara fpara {calculo de las estimaciones} opt[n]:= 0.tiempo-opt:= Y.1. lento[1. Y. habiendo n.n].n] de real) dev (opt[0.n]de 1. Y.sol:=Y.asignado:=Y.pes[0.C:colapr[nodo].tiempo + opt[X.k:=Y. X. el espacio a recorrer siempre será menor que n!.n]de real (opt.T[i.k]) fsi fsi X.tiempo:= Y.k = n entonces sol-mejor:=X. .. Y. X.n]. tiempo-opt:=opt[0] C:= cp-vacia().k]:=t.n.tiempo + T[X.Y: nodo.opt[0.n]..k..sol. Por tanto.n] de real {calculo de los minimos y maximos por filas} para i = 1 hasta n hacer rapido[i]:= T[i.T[i. pes[n]:= 0.pes):= pre-calculo-estimaciones(T) {generamos los hijos de Y} X..tiempo + pes[X.El algoritmo es el siguiente: fun camiones-rp(T[1.asigando[t]:= falso fsi fpara fmientras ffun fun pre-calculo-estimaciones (T[1.n] de real) var rapido[1. . por este orden: 1. Elección razonada del esquema algorítmico mas eficiente para resolver el problema (0. Cuestión 2 (2 puntos). siempre que este índice exista. Escribe el grafo asociado al espacio de soluciones del problema del nonograma.5 punto).n] en la que el valor t[i. 2. a partir del nodo que se presenta a continuación. . Se pide: La resolución del problema debe incluir. Para ello se conoce de antemano la tabla de tiempos T[1. describa y demuestre un caso en el que mergesort tiene una complejidad T(n) ∈ Θ (n2). uno a cada repartidor. Se supone que las operaciones elementales tienen coste unitario. Cuestión 3 (3 puntos).. 4.n] ordenado y formado por enteros diferentes. Escriba un algoritmo recursivo que calcule en tiempo logarítmico un índice i tal que 1 ≤ i ≤ n y T[i] = i . 3.5 puntos). Considere un array A[1.. El algoritmo mergesort posee una complejidad T(n) ∈ Θ (n log n). Estructuras de datos (0. minimizando el tiempo total de todos los envíos..j] corresponde al tiempo que emplea el repartidor i en realizar el envío j. No justifique el esquema usado. algunos de los cuales pueden ser negativos.1. Se supone que a partir de dicho nodo se 2 van a comenzar a explotar la fila 3. aplíquelo.UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Septiembre 2008 Cuestión 1 (1 punto). Una empresa de mensajería tiene n repartidores con distintas velocidades según el tipo de envío. Estudio del coste (0. Se trata de asignar los próximos n envíos. Demuestre el coste mediante la ecuación de recurrencia. (No puntúa la exploración por fuerza bruta de coste 2n ). Algoritmo completo a partir del refinamiento del esquema general (2.5 puntos). devolviendo -1 si no existe. Problema (4 puntos).5 puntos).n. . (No puntúa la exploración por fuerza bruta de coste 2n ). Escribe el grafo asociado al espacio de soluciones del problema del nonograma.RESPUESTAS EXAMEN Programación III. a partir del nodo que se presenta a continuación. Fila 3: X O O X O O O X X O X O O X O X O X O O Fila 4: X O X X X O . Septiembre 2008 (Original) Cuestión 1 (1 punto). Se supone que a partir de dicho nodo se 2 van a comenzar a explotar la fila 3. No justifique el esquema usado.Cuestión 2 (2 puntos). fin) sino dev coincide(A.. si a < b k . Considere un array A[1.. si 1 ≤ n < b ⎪ T (n) = ⎨ k ⎪aT ( n / b ) + cn . el coste será equivalente a: t (n) = t(n−1) + t(1) + g(n) . Demuestre el coste mediante la ecuación de recurrencia. si a > b k ( ) En este problema: a=1. aplíquelo. ini. pos-1]) fsi fsi fsi fun Ecuación de recurrencia: ⎧cn k . siempre que este índice exista.n]. b=2. describa y demuestre un caso en el que mergesort tiene una complejidad T(n) ∈ Θ (n2).n] ordenado y formado por enteros diferentes. luego el caso es T ( n ) ∈ Θ n k logn por lo que el coste es T ( n ) ∈ Θ ( logn ) ( ) . pos+1. si n ≥ b ⎩ ⎧Θ ( n k ) ⎪ ⎪ T ( n ) ∈ ⎨Θ ( n k logn ) ⎪ log a ⎪Θ n b ⎩ . k=0. donde g(n) ∈ Θ(n) de forma que t (n) ∈ Θ (n2) Cuestión 3 (3 puntos). algunos de los cuales pueden ser negativos. devolviendo -1 si no existe. fun coincide (A: array[1. Escriba un algoritmo recursivo que calcule en tiempo logarítmico un índice i tal que 1 ≤ i ≤ n y T[i] = i . fin:natural) dev entero lon = fin – ini + 1 si lon < 1 entonces dev -1 sino si lon = 1 entonces si A[ini] = ini entonces dev ini sino dev -1 sino pos = (fin – ini+1) div 2 si A[pos] = pos entonces dev pos sino si A[pos] < pos entonces dev coincide(A. Solución: Si utilizamos como posición de corte el penúltimo o (segundo) elemento del vector de forma consecutiva. El algoritmo mergesort posee una complejidad T(n) ∈ Θ (n log n). ini. si a = b k . Se supone que las operaciones elementales tienen coste unitario. Las funciones generales del esquema general que hay que instanciar son: 1. Sin embargo descartamos el esquema voraz porque no es posible encontrar una función de selección y de factibilidad tales que una vez aceptado un candidato se garantice que se va alcanzar la solución óptima. si no para cada hijo en compleciones(nodo) hacer cota:=acotar(hijo). fsi. Escribir el esquema general.. Se pide: Determinar qué esquema algorítmico es el más apropiado para resolver el problema.nodo_raíz). podría ser un esquema voraz o un esquema de ramificación y poda. a. compleciones(nodo. fpara. nodo):=quitarPrimero(Montículo). Por tanto.n.Problema (4 puntos). si solución(nodo) entonces devolver nodo. Montículo).coste + “mínimo coste de las columnas no asignadas” 3.hijo). fmientras devolver Ø Indicar que estructuras de datos son necesarias. Se trata.1. uno a cada repartidor. filas_no_asignadas: lista de cardinal.n] en la que el valor t[i. . Función RamificaciónPoda (nodo_raíz) dev nodo Montículo:=montículoVacío().Montículo). Para ello se conoce de antemano la tabla de tiempos T[1. Montículo de mínimos (cota mejor la de menor coste) Desarrollar el algoritmo completo.. poner((cota.. acotar(nodo. Se trata de un problema de optimización con restricciones.costes): nodo. poner((cota. c. coste: cardinal. último_asignado: cardinal.j] corresponde al tiempo que emplea el repartidor i en realizar el envío j. mientras no vacío(Montículo) hacer (cota. b. Se trata de asignar los próximos n envíos. nodo=tupla asignaciones: vector[1. de un algoritmo de ramificación y poda. minimizando el tiempo total de todos los envíos. Una empresa de mensajería tiene n repartidores con distintas velocidades según el tipo de envío. por tanto. solución(nodo): si se han realizado N asignaciones (último_asignado==N) 2. cota:=acotar(nodo_raíz).N].costes): posibilidades para la siguiente asignación (valores posibles para asignaciones[último_asignado+1]) 4. asignaciones[hijo.coste. devolver lista. nodo. para cada fila en nodo.N]) dev cota cota:=nodo.último_asignado:=nodo. fsi.1. añadir(hijo.lista). Función acotar(nodo. cota:=acotar(nodo.coste=0.coste:=nodo. nodo.costes) hacer cota:=acotar(hijo. para columna desde nodo.N]) dev lista_nodos lista:=crearLista()..Montículo).Montículo). hijo.nodo).N.último_asignado+1 hasta N hacer minimo=∞... .último_asignado. hijo.filas_no_asignadas:=nodo. hijo.N] Montículo:=montículoVacío().último_asignado]:=fila.. poner((cota. poner((cota.. el espacio a recorrer siempre será menor que n!..costes[1.costes).N]) dev solución[1.1.N.1. fpara.nodo):=quitarPrimero(Montículo).costes[1. hijo.fila]<mínimo entonces mínimo:=costes[columna. Por tanto. Coste: En este caso únicamente podemos hallar una cota superior del coste del algoritmo por descripción del espacio de búsqueda.fila]..último_asignado==N entonces devolver nodo.fila].filas_no_asignadas hacer si costes[columna.último_asignado+1. fsi fpara cota:=cota+mínimo.coste+costes[hijo.filas_no_asignadas).asignaciones=nodo. fmientras devolver ∅. eliminar(fila. habiendo n. hijo.asignaciones.hijo).asignaciones. si no para cada hijo en compleciones(nodo.filas_no_asignadas.costes).N. En el caso peor se generan (k-1) hijos por cada nodo del nivel k. fpara devolver cota.último_asignado=0. si nodo.Función asignación(costes[1.filas_no_asignadas hacer hijo:=crearNodo(). mientras no vacío(Montículo) hacer (cota.hijo. Función compleciones(nodo. para cada fila en nodo. FIN FIN PROCEDIMIENTO dos (n. r .5 punto). k-1). Se trata de calcular si es posible suministrar al cliente el valor exacto solicitado. PARA i ← 1 HASTA n HACER COMIENZO r ← h (n. y la evolución de la solución. 2. r ← r + uno (n DIV 3.k:entero):entero. además se desea que el sistema utilice el menor número de billetes posible. a partir del nodo que se presenta a continuación. k+1).r.5 puntos). 4. FIN r ← r + dos (n DIV 4.r-1. 3. COMIENZO SI n < 4 ENTONCES DEVOLVER(1).UNED ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA INGENIERÍA TÉCNICA DE SISTEMAS E INGENIERIA TÉCNICA DE GESTION Programación III – Septiembre 2008 Reserva Cuestión 1 (1 punto). por este orden: 1. Algoritmo completo a partir del refinamiento del esquema general (2. Elección razonada del esquema algorítmico mas eficiente para resolver el problema (0. k+2). VAR i. y si este fuera el caso el sistema deberá suministrar el conjunto de billetes que forman una solución. PROCEDIMIENTO uno (n. r ← r + h (n.5 puntos).i). r ← r + dos (n DIV 4. Aplique el algoritmo de Prim al siguiente grafo empezando por el nodo 1. Se puede suponer que el número de billetes de cada tipo disponibles es finito. Problema (4 puntos). Hallar formalmente el coste de los siguientes algoritmos. COMIENZO SI n < 3 ENTONCES DEVOLVER(1). La resolución del problema debe incluir. SINO COMIENZO r ← uno (n DIV 3. Estudio del coste (0. k ) ∈ Ο ( n ) NOTA: Acertar a ojo se evalúa con cero puntos.r:entero. k-1).5 puntos). Un cajero automático dispone de n tipos de billetes distintos teniendo cada uno de los n tipos un valor distinto.r:entero. DEVOLVER (r). SINO COMIENZO r ← dos (n DIV 4. Cuestión 2 (3 puntos). DEVOLVER (r). k+1). Se supone que a partir de dicho nodo se 2 van a comenzar a explotar la fila 3. (No puntúa la exploración por fuerza bruta de coste 2n ). FIN FIN Cuestión 3 (2 puntos). Escribe el grafo asociado al espacio de soluciones del problema del nonograma. Estructuras de datos (0. Indique claramente en cada paso qué arista se selecciona. . VAR i.k:entero):entero. siendo h ( n.i). . Se supone que a partir de dicho nodo se 2 van a comenzar a explotar la fila 3. k-1). (No puntúa la exploración por fuerza bruta de coste 2n ).r-1. r ← r + h (n. r ← r + dos (n DIV 4. o bien dos llamadas recursivas. siendo h ( n. Hallar formalmente el coste de los siguientes algoritmos. k ) ∈ Ο ( n ) NOTA: Acertar a ojo se evalúa con cero puntos.k:entero):entero.r:entero. X O X X X O O X O O X X X X X O O X X O X O O X X X O X X O Cuestión 2 (3 puntos). PROCEDIMIENTO uno (n. Escribe el grafo asociado al espacio de soluciones del problema del nonograma. r ← r + uno (n DIV 3. FIN FIN PROCEDIMIENTO dos (n.r.r:entero. Septiembre 2008 (Reserva) Cuestión 1 (1 punto). SINO COMIENZO r ← dos (n DIV 4. a partir del nodo que se presenta a continuación. k+2).k:entero):entero.i). La expresión queda T(n) = T(n/2) + T(n/2) lo que equivale a T(n) = 2T(n/3) + c. DEVOLVER (r). r . DEVOLVER (r). k-1). Aplicando la resolución genérica de las expresiones del tipo: T(n) = aT(n/b) + cnk con k = 0. VAR i. VAR i. SINO COMIENZO r ← uno (n DIV 3. PARA i ← 1 HASTA n HACER COMIENZO r ← h (n.RESPUESTAS EXAMEN Programación III. k+1). FIN r ← r + dos (n DIV 4.i). que no tenemos en cuenta para el cálculo. a=2 y b=3 queda que 2 > 30 y por tanto la función T(n) tiene un coste Ο n log 3 2 ( ) . COMIENZO SI n < 4 ENTONCES DEVOLVER(1). FIN FIN El procedimiento uno tiene: Una instrucción constante. k+1). ambas invocan la función con un tamaño n/3. COMIENZO SI n < 3 ENTONCES DEVOLVER(1). si a = b k . 2 1 7 2 4 1 6 3 6 3 10 5 4 8 5 1 7 2 3 6 2 4 1 6 3 10 5 4 8 5 EVOLUCION EVOLUCION COMPONENTES SOLUCION {1}{2}{3}{4}{5}{6} INICIO ∅ {1.3).(5.(2. (3.3.3) 3 {(1. si a > b k ( ) Cuestión 3 (2 puntos). Un bucle en el que se repite n veces un cálculo consistente en llamar dos veces a una función h(n.6} (5.4).3) 1 {(1.6).6) 4 {(1.3).4) 2 {(1.( 2.2. k = 2 ⎧cn k . Indique claramente en cada paso qué arista se selecciona. si a < b k .4}{2}{5}{6} (3.6}{5} (2.2.r.El procedimiento dos tiene: Una llamada recursiva de tamaño n/4.2.3}{2}{4}{5}{6} (1. si n ≥ b ⎩ ⎧Θ ( n k ) ⎪ ⎪ T ( n ) ∈ ⎨Θ ( n k log n ) ⎪ log a ⎪Θ n b ⎩ . y la evolución de la solución.3. a = 3. /*más una instrucción simple*/.(2.6)} Proceso terminado porque sólo queda una única componente conexa PASO ARISTA . y por último Una instrucción simple /* que no tenemos en cuenta para el calculo*/ y otra llamada recursiva de tamaño n/4. lo que equivale a T(n) = 3T(n/2) + 2n2 Aplicando la resolución genérica de las expresiones del tipo T(n) = aT(n/b) + cnk y siendo 3 < 4 2 el coste es O(n2).3).(2. Sumando los términos nos sale T(n) = T(n/4) +T(n/4)+n (2n) +T(n/4). (3.4.3). k) de coste lineal.6) 5 {(1.3. (3.3)} {1.3).4).( 2. Aplique el algoritmo de Prim al siguiente grafo empezando por el nodo 1.5. b = 4.4}{5}{6} (2.3.3).4)} {1. (3. Otra llama recursiva de tamaño n/4.3)} {1.6)} {1.4.4). si 1 ≤ n < b ⎪ T (n) = ⎨ k ⎪aT ( n / b ) + cn . V[1.X) {no se puede mejorar beneficio mejor} fsi fsi {probamos a no meter el objeto (siempre es factible)} (X.beneficio sino añadir(C.k.peso X.k] := 0.beneficio-opt := Y. El algoritmo es el siguiente: tipos nodo = reg sol[1. X.sol.n]de 0.sol:=Y.sol.n].beneficio:= Y. voy a descartar el voraz ya que auque es posible encontrar una función de selección y de factibilidad para resolver el problema no lo haría de una forma optima. descarto también el esquema de divide y vencerás ya que no se puede dividir el problema en subproblemas iguales. M.peso :=0.sol[X.k]. {probamos a meter el objeto en la mochila} si Y.k+1... X. M. (Y.Problema (4 puntos). además se desea que el sistema utilice el menor número de billetes posible.peso := Y.n]de 0. beneficio-mejor:= X.k = n enteonces sol-mejor := X. V. pes) := calculo-estimaciones (P. beneficio-mejor:real) var X.peso. El problema es similar al Ejercicio 15.. Y. Puede resolverse por un esquema voraz o ramificación y poda. Solución: Se trata de un problema de optimización. por lo tanto descarto el esquema de vuelta atrás.beneficio si X.peso. Y.beneficio-mejor):= calculo-estimaciones(P. X.beneficio) si X.1. Y. Se puede suponer que el número de billetes de cada tipo disponibles es finito. Se trata de calcular si es posible suministrar al cliente el valor exacto solicitado..k]:=1.k] X.beneficio-opt.beneficio:=0.n peso. Y.peso:= Y.. beneficio:real beneficio-opt:real {prioridad} freg ftipos fun cajero-rp(P[1. eliminar-max(C) X.Y: nodo. Un cajero automático dispone de n tipos de billetes distintos teniendo cada uno de los n tipos un valor distinto.X) beneficio-mejor := max(beneficio-mejor. Y.sol[X.beneficio.beneficio-opt si X.beneficio-opt ≥ beneficio-mejor entonces X. las estimaciones coinciden con las de Y} {beneficio-opt(X) = beneficio-opt(Y) ≥ beneficio-mejor } X. beneficio-mejor := X.beneficio := Y.1 k:0.2.C:colapr[nodo] {generamos raíz} X. Y. V.k = n entonces { beneficio(X) = beneficio-opt(X) ≥ beneficio-mejor } sol-mejor:=X.beneficio sino añadir(C.n]de real..k. y si este fuera el caso el sistema deberá suministrar el conjunto de billetes que forman una solución.Y) mientras ¬es-cp-vacia?(C)^(minimo(C). por tanto. X..beneficio-opt ≥ beneficio-mejor) hacer Y:= maximo C).k] ≤ M entonces {es factible y. añadir(C.sol.k:=0.opt.peso + P[X. Y.peso + [X.k:=Y. Y. página 511 de Estructura de datos y métodos algorítmicos. M: real)dev (sol-mejor[1. por lo tanto utilizaré ramificación y poda. pes) fsi fsi fmientras ffun .beneficio + V[X.beneficio) C:= cp-vacia(). peso.. beneficio:real) dev (opt. pes:= pes + V[j] j := j+1 .fun calculo-estimaciones (P[1. pes: real) hueco := M-peso. j := k+1 mientras j ≤ n ^ P[j] ≤ hueco hacer {podemos coger el objeto j entero} hueco := hueco-P[j] opt := opt + V[j]. M: real.n] de real.n]. k: 0.n. fmientras si j ≤ n entonces {quedan objetos por probar} {fraccionamos el objeto j (solucion voraz)} opt := opt + (hueco/P[j]*V[j] {extendemos a una solución en la versión 0/1} j := j+1 mientras j ≤ n ^ hueco > 0 hacer si P[j] ≤ hueco entonces hueco := hueco – P[j] pes := pes + V[j] fsi j := j+1 fmientras fsi ffun .. pes := beneficio. V[1. opt := beneficio..
Copyright © 2024 DOKUMEN.SITE Inc.