Está en la página 1de 4
Universidad de Alcalá Departamento de Ciencias de la Computación Algoritmia y Complejidad Grado en Ingeniería

Universidad de Alcalá Departamento de Ciencias de la Computación

Algoritmia y Complejidad

Grado en Ingeniería Informática

de Alcalá Departamento de Ciencias de la Computación Algoritmia y Complejidad Grado en Ingeniería Informática

EJERCICIOS DE ALGORITMOS VORACES

Ejercicio 1). Se tienen n números naturales distintos, siendo n una cantidad par, que tienen que juntarse formando parejas de dos números cada una. A continuación, de cada pareja se obtiene la suma de sus dos componentes, y de todos estos resultados se toma el máximo.

Diseñar un algoritmo voraz que cree las parejas de manera que el valor máximo de las sumas de los números de cada pareja sea lo más pequeño posible, demostrando que la función de selección de candidatos usada proporciona una solución óptima.

Ejemplo: suponiendo que los datos se encuentran en el vector siguiente

5

8

1

4

7

9

vamos a ver un par de formas de resolver el problema (no necesariamente la óptima):

Seleccionamos como pareja los elementos consecutivos

De esta forma conseguimos las parejas (5, 8), (1, 4) y (7, 9); entonces, al sumar las componentes tenemos los valores 15, 5 y 16, por lo que el resultado final es 16.

Seleccionamos como pareja los elementos opuestos en el vector

Ahora tenemos las parejas (5, 9), (8, 7) y (1, 4); sumando conseguimos 14, 15 y 5, por lo que el resultado final es 15 (mejor que antes).

¿Habrá una resultado mejor para este problema? ¿Puede generalizarse un método que nos proporcione un algoritmo voraz correcto para cualquier cantidad de datos, y que además sea independiente del valor de los mismos?

Ejercicio 2). Se tiene que almacenar un conjunto de n ficheros en una cinta magnética (soporte de almacenamiento de recorrido secuencial), teniendo cada fichero una longitud conocida l 1 , l 2 , …, l n . Para simplificar el problema, puede suponerse que la velocidad del lectura es constante, así como la densidad de información en la cinta.

Se conoce de antemano la tasa de utilización de cada fichero almacenado, es decir, se sabe la cantidad de peticiones p i correspondiente al fichero i que se van a realizar. Por tanto, el

i . Tras la petición de un fichero, al

total de peticiones al soporte será la cantidad P =

n

p

i 1

ser encontrado la cinta es automáticamente rebobinada hasta el comienzo de la misma.

El objetivo es decidir el orden en que los n ficheros deben ser almacenados para que se minimice el tiempo medio de carga, creando un algoritmo voraz correcto.

Ejercicio 3). Demostrar, mediante contraejemplos, que el Ejercicio 2 no puede resolverse de manera correcta (aunque sí mediante un algoritmo que funcione) utilizando

los ficheros en orden creciente de longitudes l i (los pequeños primero y los grandes después);

los ficheros en orden decreciente de peticiones p i (los más solicitados primero y los menos solicitados los últimos).

Universidad de Alcalá Departamento de Ciencias de la Computación Algoritmia y Complejidad Grado en Ingeniería

Universidad de Alcalá Departamento de Ciencias de la Computación

Algoritmia y Complejidad

Grado en Ingeniería Informática

de Alcalá Departamento de Ciencias de la Computación Algoritmia y Complejidad Grado en Ingeniería Informática

Ejercicio 4). Se tiene un grafo dirigido G = < N, A >, siendo N = {1, …, n} el conjunto de nodos y A NxN el conjunto de aristas. Cada arista (i, j) A tiene un coste asociado c ij (c ij > 0 i, j N; si (i, j) A puede considerarse c ij = +). Sea M la matriz de costes del grafo G, es decir, M[i, j] = c ij .

Teniendo como datos la cantidad de nodos n y la matriz de costes M, se pide encontrar tanto el camino mínimo entre los nodos 1 y n como la longitud de dicho camino usando el algoritmo de Dijkstra, utilizando las siguientes ideas:

Crear un estructura de datos que almacene las distancias temporales conocidas

(inicializadas al coste de la arista del vértice 1 a cada vértice j, o +si no existe dicha arista) para los vértices no recorridos (inicialmente, todos salvo el 1).

Seleccionar como candidato el que tenga menor distancia temporal conocida,

eliminarle del conjunto de vértices no recorridos, y actualizar el resto de distancias

temporales si pueden ser mejoradas utilizando el vértice actual.

Se necesitará almacenar de alguna manera la forma de recorrer el grafo desde el

vértice 1 al vértice n (no necesariamente igual al conjunto de decisiones tomadas).

Ejercicio 5). Se tiene un grafo no dirigido G = < N, A >, siendo N = {1, …, n} el conjunto de nodos y A NxN el conjunto de aristas. Cada arista (i, j) A tiene un coste asociado c ij (c ij > 0 i, j N; si (i, j) A puede considerarse c ij = +). Sea M la matriz de costes del grafo G, es decir, M[i, j] = c ij . (al ser el grafo no dirigido se tiene que (i, j) = (j, i) por lo que la matriz M es simétrica).

Teniendo como datos la cantidad de nodos n y la matriz de costes M, se pide encontrar el árbol soporte mínimo del grafo G utilizando el algoritmo de Prim, utilizando las siguientes ideas:

A diferencia del algoritmo de Kruskal (que crea el árbol utilizando componentes

conexas independientes que se van uniendo entre sí), el algoritmo de Prim se basa en la idea de ir construyendo un árbol cada vez más grande, empezando por un único nodo y acabando por recubrir todo el grafo.

El algoritmo comienza con un árbol de un nodo, al que se le añade un segundo

nodo, luego un tercero, etc, hasta tener los n nodos unidos. La forma de escoger un nodo es buscando el nodo más cercano a todo el árbol, sin que se creen ciclos.

A medida que crece el tamaño del árbol la búsqueda del nodo más cercano se

complica, por lo que para que el algoritmo sea eficiente (el método debe tener O(n 2 ))

hay que crear un estructura de datos que almacene la mejor distancia de cada nodo al conjunto de nodos del árbol.

Se necesitará almacenar de alguna manera la forma en que se ha creado el árbol, por ejemplo indicando a qué nodo del árbol se está uniendo el nuevo candidato seleccionado.

Universidad de Alcalá Departamento de Ciencias de la Computación Algoritmia y Complejidad Grado en Ingeniería

Universidad de Alcalá Departamento de Ciencias de la Computación

Algoritmia y Complejidad

Grado en Ingeniería Informática

de Alcalá Departamento de Ciencias de la Computación Algoritmia y Complejidad Grado en Ingeniería Informática

Ejercicio 6). Se dispone de un vector V formado por n datos, del que se quiere encontrar el elemento mínimo del vector y el elemento máximo del vector. El tipo de los datos que hay en el vector no es relevante para el problema, pero la comparación entre dos datos para ver cuál es menor es muy costosa, por lo que el algoritmo para la búsqueda del mínimo y del máximo debe hacer la menor cantidad de comparaciones entre elementos posible.

Un método trivial consiste en un recorrido lineal del vector para buscar el máximo y después otro recorrido para buscar el mínimo, lo que requiere un total de aproximadamente 2n comparaciones entre datos. Este método no es lo suficientemente rápido, por lo que se pide implementar un método con metodología Voraz que realice un máximo de comparaciones.

3

2

n

Ejercicio 7). Shrek, Asno y Dragona llegan a los pies del altísimo castillo de Lord Farquaad para liberar a Fiona de su encierro. Como sospechaban que el puente levadizo estaría vigilado por numerosos soldados se han traído muchas escaleras, de distintas alturas, con la esperanza de que alguna de ellas les permita superar la muralla; pero ninguna escalera les sirve porque la muralla es muy alta. Shrek se da cuenta de que, si pudiese combinar todas las escaleras en una sola, conseguiría llegar exactamente a la parte de arriba y poder entrar al castillo.

Afortunadamente las escaleras son de hierro, así que con la ayuda de Dragona van a “soldarlas”. Dragona puede soldar dos escaleras cualesquiera con su aliento de fuego, pero tarda en calentar los extremos tantos minutos como metros suman las escaleras a soldar. Por ejemplo, en soldar dos escaleras de 6 y 8 metros tardaría 6 + 8 = 14 minutos. Si a esta escalera se le soldase después una de 7 metros, el nuevo tiempo sería 14 + 7 = 21 minutos, por lo que habrían tardado en hacer la escalera completa un total de 14 + 21 = 35 minutos.

Diseñar un algoritmo eficiente que encuentre el mejor coste y la manera de soldar las escaleras para que Shrek tarde lo menos posible en escalar la muralla, indicando las estructuras de datos elegidas y su forma de uso. Se puede suponer que se dispone exactamente de las escaleras necesarias para subir a la muralla (ni sobran ni faltan), es decir, que el dato del problema es la colección de medidas de las “miniescaleras” (en la estructura de datos que se elija), y que solo se busca la forma óptima de fundir las escaleras.

Ejercicio 8). (Examen Noviembre 2013. 3 puntos) En Abecelandia, ciudad famosa por sus N bellas plazas y que puede que conozcas, debido a los despilfarros de los últimos años en peajes, festejos y desfiles, el Ayuntamiento no tiene dinero para poder pagar a los servicios de limpieza, que han iniciado una huelga. Para no afectar al turismo, se estudia instaurar unos servicios mínimos que permitan a los turistas que visiten Abecelandia poder ir desde cualquier plaza de la ciudad a cualquier otra plaza paseando por calles limpias.

Se dispone de las calles de la ciudad almacenadas en una matriz de adyacencia cuyo tamaño es NxN (las calles que existen entre las plazas pueden recorrerse a pie en cualquier sentido indistintamente) y se ha calculado el coste de limpiar cada una de ellas, guardando esa información en una tabla de costes.

Diseñar un algoritmo eficiente que, teniendo como datos el callejero y la tabla de costes de las limpiezas, determine las calles que deberán ser limpiadas de manera que los turistas puedan ir desde una plaza a cualquier otra andando solo por calles limpias, y de forma que el coste total de la limpieza sea mínimo, indicando las estructuras de datos que se utilicen.

Universidad de Alcalá Departamento de Ciencias de la Computación Algoritmia y Complejidad Grado en Ingeniería

Universidad de Alcalá Departamento de Ciencias de la Computación

Algoritmia y Complejidad

Grado en Ingeniería Informática

de Alcalá Departamento de Ciencias de la Computación Algoritmia y Complejidad Grado en Ingeniería Informática

Ejercicio 9). (Examen Junio 2014. 3 puntos) En la gestión de la red social PiensaQue (www.piensaque.com, donde puedes escuchar qué piensan tus contactos) quieren determinar el grado de conexión entre sus usuarios.

El grado de conexión es la cantidad de grupos de usuarios conectados entre sí dividido por el total de usuarios. Si este valor se acerca a 1 es que todos los usuarios se conocen, bien directamente o bien a través de amigos en común (o amigos de amigos de un amigo, etc.) mientras que si se aproxima a 0 quiere decir que los usuarios están aislados y prácticamente sin contactos comunes.

Entre los miles de usuarios de PiensaQue se escoge una población aleatoria de cien identificadores para obtener su grado de conexión. Cada uno de esos cien identificadores representa a un usuario, del que se además se tienen sus contactos almacenados en una lista. Por ejemplo, se podría tener el siguiente caso de seis usuarios (en cursiva) y sus contactos (separados por comas):

Antonio: Bea, Carlos, Emma

Carlos: Antonio, Emma

Emma: Bea

Bea: Emma, Carlos, Antonio

David: Fernando

Fernando: NINGUNO

Aunque Emma solo tiene por contacto a Bea, a través de ella está relacionada con Carlos y con Antonio. Por otra parte, Fernando y David también tienen una conexión entre ellos (David tiene a Fernando entre sus contactos aunque el recíproco no se cumpla). Sin embargo, los dos grupos no tienen nexos en común.

En este ejemplo el grado de conexión sería 2 grupos entre 6 usuarios, aproximadamente el valor 0’33.

Diseñar un algoritmo eficiente que, teniendo como datos los usuarios elegidos (cada uno de ellos con su identificador y la lista de sus contactos), obtenga el grado de conexión entre ellos.