You are on page 1of 19

Universidad Católica del Norte

Facultad de Ingeniería y Ciencias Geológicas


Departamento de Ingeniería de Sistemas y Computación

Guía para la Segunda Prueba


Análisis de Algoritmos
DAIS-00772 / DAIS-77227

Quicksort y Quickselect
Problema 1
Determine el tiempo de ejecución de Quicksort para ordenar un arreglo A de n elementos, donde la partición
siempre se realiza de manera constante en proporción (1/4 – 3/4).

Problema 3
Se tiene un arreglo A de 5 elementos distintos (a1, a2, a3, a4, a5). Determine las relaciones de orden que tienen
que darse entre a1, a2, a3, a4, y a5 para que ocurra el peor caso del algoritmo Quicksort visto en clases.

Problema 4
Determine el tiempo de ejecución de Quicksort para ordenar un arreglo A de n elementos, cuando los primeros
n/2 elementos tienen el mismo valor x, y los siguientes n/2 elementos tienen el mismo valor 2x (x>0).

Problema 5
En la resolución de la recurrencia del tiempo esperado de Quicksort, se afirma que ∑𝑘=1,..,𝑛−1 𝑘 lg(𝑘) es menor
1
o igual a (1/2) 𝑛2 lg 𝑛 − 8 𝑛2 , 𝑛 ≥ 2. Demostrar que esto es así.

Problema 6
Determine el menor y mayor número de llamados recursivos que realiza Quicksort para ordenar un arreglo A de
n elementos, donde las particiones se realizan de manera desbalanceada pero constante, en proporción [a/b, (b-
a)/b], donde a<b. (Por ejemplo, si a=1 y b=8, entonces la proporción sería (1/8, 7/8).

Problema 7
Suponga que en el primer llamado, la partición del algoritmo de Quicksort se realiza como en el mejor caso. En
los siguientes llamados recursivos, la partición siempre se realiza de manera constante en proporción (1/3 – 2/3).
Determine la cota inferior y cota superior para el tiempo de ejecución de QuickSort en este caso.

Problema 8
Plantee y desarrolle la recurrencia para el caso promedio de QuickSort.

Problema 9
En el algoritmo que encuentra el mínimo de una secuencia de n elementos utilizando n-1 comparaciones, ¿Cuál
es el número esperado de veces que se realiza la asignación min←A[i]?
Universidad Católica del Norte
Facultad de Ingeniería y Ciencias Geológicas
Departamento de Ingeniería de Sistemas y Computación

Problema 10
Se tiene un vector con n elementos. Se desea encontrar los m elementos más pequeños del vector, con m<n.
Analice, determine y compare el costo en tiempo de las siguientes opciones para resolver este problema:

1) Ordenar el vector entero utilizando Quicksort, y luego escoger los m primeros elementos del vector
ordenado.
2) Seleccionar los m elementos menores invocando repetidamente el procedimiento RANDOMIZED-
SELECT.

Problema 11
El algoritmo RANDOMIZED-SELECT(A, p, r, i) visto en clases retorna el i-ésimo elemento más pequeño del
arreglo A[p..r] de n elementos. Ilustre como se encuentra el elemento mayor y el elemento menor del arreglo A
= (3, 2, 9, 0, 7, 5, 4, 8, 6, 1) utilizando este algoritmo. Asuma que la partición de una subsecuencia A[p..r]
siempre se realiza con A[p] como pivote.

Problema 13
Compare, en términos de tiempo de ejecución, el encontrar el menor y el mayor elemento de un arreglo de n
elementos utilizando QuickSort versus utilizando el procedimiento RANDOMIZED-SELECT visto en clases.
Universidad Católica del Norte
Facultad de Ingeniería y Ciencias Geológicas
Departamento de Ingeniería de Sistemas y Computación

Tablas de Hash
Problema 1
Considere la inserción de las claves <21, 33, 42, 15, 26, 39, 28, 99, 70> en una tabla de hash de tamaño m=13,
usando una función de has primaria h’(k) = k mod m.

a) Usando direccionamiento abierto, ilustre el resultado de insertar estas claves en una tabla de hash
inicialmente vacía con: prueba lineal, prueba cuadrática con c1=1 y c2=3, y doble hashing con h2(k) = 1 + (k
mod (m-1)).
b) De termine el número promedio de pruebas de búsqueda exitosa y no exitosa, en cada caso después de
insertadas todas las claves. Compare con el número esperado de pruebas en búsqueda exitosa y no exitosa.
c) Se desea disminuir el número esperado de pruebas en búsqueda exitosa a la mitad del valor determinado en
b). ¿Qué valor del factor de carga y tamaño de la tabla se debería utilizar para lograrlo? En el caso de prueba
lineal, ¿en cuánto disminuye l número promedio de pruebas en búsqueda exitosa en relación a lo
determinado en b) cuando el valor esperado del número de pruebas disminuye a la mitad?

Problema 2
Considere la inserción de las claves <10, 22, 31, 4, 15, 28, 17, 88, 59> en una tabla de hash de tamaño m=11,
usando direccionamiento abierto.

a) Determine el tiempo promedio de búsqueda exitosa, después de insertadas todas las claves, utilizando
prueba lineal, con una función de hashing primaria h’(k)=k mod m.
b) Determine el tiempo promedio de búsqueda no exitosa, después de insertadas todas las claves, utilizando
prueba cuadrática, con c1=1, c2=2, con h’(k) como la función de hashing primaria.

Problema 3
Suponga que en una tabla de hash de tamaño m se insertan m/2 claves con direccionamiento abierto y prueba
lineal para resolver colisiones. Al final, se forman 2 grupos de posiciones con claves: grupo 1 con claves en las
posiciones [0..m/4 - 1] y grupo 2 con claves en las posiciones [3/4m – 1..m-1]. Determinar el número promedio
de pruebas en búsqueda no exitosa, y compare con el valor teórico dado en el correspondiente teorema.

Problema 4
Suponga una tabla de hash con direccionamiento abierto y prueba lineal. La tabla tiene tamaño m slots, y se
sabe que los slots impares (1, 3, 5, …) están ocupados con claves, mientras que los slots pares (0, 2, 4, …) están
vacíos. Determine el número promedio de comparaciones en búsqueda no exitosa en este caso. Compare con el
valor teórico dado en el teorema visto en clases.

Problema 5
Suponga que en una tabla de hash de tamaño m con direccionamiento abierto y prueba lineal, se han generado
m/5 grupos, cada uno con 5 slots [V,K,K,K,V], donde V indica slot vacío y K indica slot ocupado con una
clave. Determine el valor del número promedio de comparaciones en búsqueda No exitosa (C n) en este caso.
¿Cómo cambia el valor de Cn si la configuración de cada grupo fuera [V,K,K,V,K]?
Universidad Católica del Norte
Facultad de Ingeniería y Ciencias Geológicas
Departamento de Ingeniería de Sistemas y Computación

Problema 6
Dada la secuencia de claves {4371, 1323, 6173, 4199, 4344, 9679, 1989} a ser insertadas en una tabla de hash T
de tamaño m=8, y una función hash h(x)=x mod 8, dar la correspondiente:

a) Tabla hash por encadenamiento,


b) Tabla hash con prueba lineal,
c) Tabla hash con prueba cuadrática (c1=c2=1), y
d) Tabla hash con doble hashing vía la función h2(x)=7-(x mod 7).

Para las tablas anteriores, después de insertadas todas las claves, determinar el tiempo promedio de búsqueda
exitosa y no exitosa para ambos casos, es decir, hashing con encadenamiento y hashing con direccionamiento
abierto. ¿Qué esquema es mejor?

Problema 7
Considerar una tabla de hash con direccionamiento abierto con un factor de carga α. Encontrar el valor de α
distinto de cero para el cual el número esperado de pruebas en búsqueda no exitosa es igual a dos veces el
número esperado de pruebas en búsqueda exitosa.

Problema 8
Considerar una tabla de hash con direccionamiento abierto y hashing uniforme. Dar límites superiores sobre el
número esperado de pruebas en búsqueda exitosa y no exitosa cuando el factor de carga es: ¼, ½, ¾, y 7/8.
Grafique factor de carga versus N° esperado pruebas en búsqueda exitosa y no exitosa.

Problema 9
El profesor Hazos asevera que se puede obtener una ganancia sustancial en rendimiento si se modifica el
esquema de hashing con encadenamiento tal que cada lista es mantenida ordenada. ¿Cómo la modificación
propuesta afecta el tiempo de ejecución para búsqueda exitosa y no exitosa, inserciones, y eliminaciones?

Problema 10
Sea una tabla de hash con direccionamiento abierto, la cual se encuentra ocupada en un 80%. ¿A cuánto tendría
que disminuir este % si se desea que el valor esperado del número de pruebas en búsqueda exitosa disminuya en
un 20%?

Problema 11
Sea la función de hashing siguiente: h(x) = (2 * x  3) / 13 mod 13 y una tabla de tamaño 13. Dados los 12
datos: 126, 25, 63, 70, 52, 8, 33, 111, 94, 5, 18 y 56.
n

 accesos k
Cn  k 1

a) Use encadenamiento para insertar los datos en la tabla y determine el valor de n , en


que accesos k indica los accesos necesarios para alcanzar el dato k al buscarlo exitosamente.
Universidad Católica del Norte
Facultad de Ingeniería y Ciencias Geológicas
Departamento de Ingeniería de Sistemas y Computación

b) Use direccionamiento abierto con double hashing para distribuir los datos de la tabla considerando que
s(x) = (x + 3)/13 mod 13 y determine el valor de C n en este caso.
c) Determine α, el factor de carga de la tabla. Compare los valores obtenidos en (a) y (b) con los valores
teóricos de Cn  1   / 2 para encadenamiento, y Cn  (1 /  ) ln( 1 /(1   )) para el direccionamiento
abierto. Respectivamente ¿Cuál de los dos es el mejor?

Problema 12
Quadrating probing usa la función de hashing: H(x, i) = (h(x) + c*i + d*i 2) mod m, para i > 0, en que h(x) es la
posición inicial del dato x e i es el intento i-ésimo en direccionamiento abierto.

a) Insertar los datos de A = {22, 4, 28, 88, 13, 10, 31, 15, 17, 59} en una tabla de tamaño 11 con h(x) = x mod
11, c = 1 y d = 3. Grafique la tabla resultante y calcule la cantidad promedio de accesos necesarios para una
búsqueda exitosa.
b) Verifique que si dos datos colisionan usando H(x, i) entonces sus secuencias de búsqueda son las mismas.

Problema 13
Suponga que cada letra tiene asociado un valor entero según la siguiente tabla:

a b c d e f g h i j k l m n o p q
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

r s t u v w x y z
18 19 20 21 22 23 24 25 26

Para la función de hashing: h(P) = (suma dígitos de cada carácter de P) mod 7, insertar las siguientes palabras en
una tabla de tamaño 7 usando direccionamiento abierto con linear probing para resolver colisiones: A =
{algoritmo, analisis, greedy, horowitz, arbol, busqueda, maximo}. Determine la cantidad de accesos promedio
en búsqueda exitosa.
Universidad Católica del Norte
Facultad de Ingeniería y Ciencias Geológicas
Departamento de Ingeniería de Sistemas y Computación

Algoritmos Greedy
Problema 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?

Problema 2
Se dispone de un vector V formado por 𝑛 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 2𝑛 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
3
máximo de 2 𝑛 comparaciones.

Problema 3
Se tiene un alambre de cobre de largo L. Existe el requerimiento de obtener n pedazos de alambre p 1,p2,…,pn, de
largo l1, l2, …, ln, respectivamente, y tal que L < ∑li.

a) Escriba un algoritmo greedy que maximice el número de pedazos obtenidos desde el alambre de largo L.
Ejemplifique para L=500, y pedazos de largo <190, 120, 240, 80, 140>
b) Qué solución genera el algoritmo greedy si deseamos minimizar el remanente del alambre de cobre
(maximizar la cantidad utilizada)? Es óptima esta solución?
Universidad Católica del Norte
Facultad de Ingeniería y Ciencias Geológicas
Departamento de Ingeniería de Sistemas y Computación

Problema 4
Considere el problema de dar vuelto de 𝑛 pesos utilizando el menor número posible de monedas.
a) Describa un algoritmo greedy que entregue vuelto utilizando monedas de 1 peso, 5 pesos, 25 pesos y 100
pesos.
b) Analice su algoritmo, ¿cuál es el orden asintótico de ejecución?
c) Muestre un ejemplo de un conjunto de monedas (diferente al de monedas de 1 peso, 5 pesos, 25 pesos y 100
pesos) para el cual el algoritmo greedy no entrega una solución óptima.
d) Supóngase que las monedas disponibles tienen la forma c𝑐 0 , 𝑐 1 , … , 𝑐 𝑘 para algún entero 𝑐 > 1 y 𝑘 ≥ 1.
Demuestre que el algoritmo greedy propuesto siempre entrega una solución óptima. Sea formal en su
desarrollo.

Problema 5
Resolver el siguiente problema utilizando un algoritmo voraz: En un tablero de ajedrez (de tamaño nxn)
partimos de una casilla cualquiera. Tenemos una ficha de un caballo, que puede realizar los mismos
movimientos que en el ajedrez. El objetivo es, partiendo de la posición inicial, visitar todas las casillas del
tablero, sin repetir ninguna. Sugerencia: transformar el problema en un problema sobre grafos, teniendo en
cuenta las casillas y las posiciones accesibles desde cada una.

Ejemplo de movimientos válidos del caballo

Problema 6
Demuestre que el procedimiento GREEDY-ACTIVITY-SELECTOR visto en clases para el problema de
selección de actividades, genera una solución óptima (máximo número de actividades).

Problema 7
Se define el problema de la minimización del tiempo en el sistema de la siguiente manera. Tenemos un
conjunto de n tareas, cada una de las cuales tarda un tiempo predefinido ti, y un procesador donde se ejecutan
las tareas. El objetivo es dar una planificación de las tareas (un orden de ejecución de las mismas) de manera
que se minimice el tiempo medio de finalización. El tiempo de finalización de una tarea es el tiempo que
transcurre entre el instante inicial (instante 0) y el momento en el que concluye una tarea. Construir un
algoritmo voraz para resolver el problema de la minimización del tiempo en el sistema. Mostrar la ejecución
para el ejemplo, n= 4, t= (4, 10, 2, 20). Demostrar que el algoritmo voraz construido es óptimo.

Construir un algoritmo voraz para resolver el problema de la minimización del tiempo en el sistema pero con
varios procesadores. Tenemos un conjunto de n tareas, cada una de las cuales tarda un tiempo ti, y disponemos
Universidad Católica del Norte
Facultad de Ingeniería y Ciencias Geológicas
Departamento de Ingeniería de Sistemas y Computación

de m procesadores para ejecutar las tareas. Las tareas se ejecutan secuencialmente, es decir, no se pueden partir.
¿Cuál es el orden de complejidad del algoritmo? Mostrar la ejecución para un ejemplo con m=4 y n = 9, t = (7,
1, 6, 2, 3, 4, 2, 5, 7).

Problema 8
Diseñar una heurística voraz para el problema del ciclo hamiltoniano. Ejecutarla sobre el grafo de la siguiente
figura y dar una estimación del tiempo de ejecución del algoritmo. ¿Garantiza este algoritmo una solución
óptima? ¿Garantiza que se encuentre alguna solución en caso de existir?

1 2

3
4

5 6

Problema 9
Un sistema dispone de m procesadores (P1, P2, ..., Pm), que deben ejecutar un conjunto de n tareas distintas (T1,
T2, ..., Tn), disponibles en el instante inicial. De cada tarea se conoce el número de instrucciones que ejecuta ti
(se supone que todas las instrucciones requieren el mismo tiempo), y de cada procesador se tiene su velocidad
de procesamiento vi, en número de instrucciones por segundo. Se supone que cada procesador ejecuta las tareas
de manera secuencial, es decir sin partirlas.

El objetivo consiste en dar una planificación que minimice el tiempo medio de finalización de las tareas. Una
planificación consistirá en asignar cada tarea a un procesador, y en un orden determinado. El tiempo medio de
finalización será la media de los tiempos que cada tarea tiene que esperar, desde el instante inicial hasta que
acaba de ejecutarse.

a) Dar una buena solución para el problema, usando la técnica que creas más adecuada de entre divide y
vencerás o algoritmos voraces. Se pide explicar el funcionamiento del algoritmo y dar un esquema en
pseudocódigo de su estructura.
b) Ejecutar el algoritmo diseñado sobre el siguiente ejemplo: m= 3, n= 6, t= (35, 40, 20, 25, 10, 50), v= (5, 1,
10).
c) Hacer una estimación del orden de complejidad del algoritmo.
d) Comprobar si el algoritmo diseñado es óptimo o no.

Problema 10
Encontrar una buena solución para el siguiente problema usando un algoritmo voraz. Explicar el
funcionamiento del algoritmo: cuál es el conjunto de candidatos, la función de selección, la función para añadir
un elemento a la solución, el criterio de finalización, el criterio de coste, etc. En una votación existen n
candidatos y m votantes. La probabilidad de que un votante i vote al candidato j la conocemos a priori, y viene
dada por P[i, j]. Un votante cualquiera a puede ser coaccionado para que vote al candidato que queramos, por
ejemplo el p, para lo cual tenemos que pagarle C[a] ptas. Con esto, nos aseguramos que P[a, p] = 1, y P[a, j] =
0, para j  p.
Universidad Católica del Norte
Facultad de Ingeniería y Ciencias Geológicas
Departamento de Ingeniería de Sistemas y Computación

El objetivo consiste en gastarse la mínima cantidad de dinero, coaccionando a los votantes necesarios, para
garantizar que un candidato p dado se llevará al menos el 70% de los votos (de acuerdo con las probabilidades
esperadas). La solución estará compuesta por la lista de votantes a los cuales hay que coaccionar. Aplicar el
algoritmo diseñado al siguiente ejemplo: n = 2 candidatos, m = 7 votantes, p = 1. Porcentajes y costes de
coacción:

Votantes

1 2 3 4 5 6 7

P[i, 1] 0.2 0.1 0.8 0.5 0.6 0.2 0

P[i, 2] 0.8 0.9 0.2 0.5 0.4 0.8 1

C[i] 4 3 2 5 3 3 5

Problema 11
El Sudoku se ha convertido en el pasatiempo del verano. Se trata de una matriz de 9x9 celdas, donde en cada
celda puede haber un número entre 1 y 9. Se añade la restricción de que cada número sólo puede aparecer una
vez en cada fila, en cada columna y en cada bloque de celdas. Los bloques son grupos de 3x3 celdas adyacentes,
como se muestran abajo (ver que, en total, hay 9 filas, 9 columnas y 9 bloques). Algunas celdas del Sudoku
están inicializadas con ciertos valores y otras están vacías. El objetivo es completar las celdas vacías, con
valores que cumplan las restricciones del juego.

Se pide diseñar un algoritmo voraz para intentar resolver el problema. Indicar cuáles son los candidatos, cómo
es la función de selección, cómo es la inserción de un elemento en la solución, y las demás partes del esquema.
Suponer que la entrada es una matriz de 9x9, donde un valor 0 indica una celda no inicializada.

3 9 5 2 7
6 5 8 1 2
5
8 6 4 7
4 6 1 5 8 9
7 3 2 5
8
9 8 2 1 5
5 4 6 3 8

Problema 12
Varios países europeos están sufriendo una epidemia de fiebre aftosa. La enfermedad se transmite por contacto
directo o indirecto con animales enfermos y es altamente contagiosa. Para controlar la infección, las autoridades
Universidad Católica del Norte
Facultad de Ingeniería y Ciencias Geológicas
Departamento de Ingeniería de Sistemas y Computación

sanitarias han recabado información de todas las granjas existentes, que llamaremos G = (g1, g2, ..., gn).
También se conocen las compras de animales que han tenido lugar entre las distintas granjas, y la fecha en la
que tuvo lugar cada una.

Hasta el momento se ha detectado el virus en un conjunto reducido de granjas I. Las autoridades pretenden
encontrar todas las granjas susceptibles de estar infectadas, para declararlas en cuarentena. Hay que tener en
cuenta que una granja es susceptible de padecer la enfermedad si ha comprado animales de una granja infectada,
o de una granja susceptible de tener la enfermedad (después de que haya podido ser infectada).

a) Resolver el problema de determinar las granjas que deben ser declaradas en cuarentena. Describir y
especificar de forma clara y precisa la estructura de datos que usa el problema, el algoritmo diseñado para
resolverlo y la representación de la solución. Sugerencia: considerar el problema como un problema sobre
grafos. Ojo: una buena solución debería ser de complejidad no mayor que O(n2).
b) Hacer una estimación del orden de complejidad del algoritmo diseñado. Aplicar el algoritmo sobre el
siguiente caso: n = 6; G = {A, B, C, D, E, F}; I = {A}

Granja que vende E D B C F E B F A C

Granja que compra B A A D D C F E E B

Número de animales 12 7 23 8 9 43 32 6 14 15

Fecha (nº de semana) 6 2 7 5 5 3 6 6 5 6

Problema 13
La experimentación con ratones es básica para crear nuevos fármacos, que resultan en importantes mejoras en la
calidad de vida de los roedores. En un experimento con fármacos cerebrales, se colocan ratones dentro de un
laberinto formado por n celdas, m salidas del laberinto y varios pasadizos entre las celdas (o las salidas). Las
celdas son numeradas de 1 a n y las salidas de n+1 a n+m. En cada pasadizo los ratones tardan un tiempo dado,
que llamaremos P[i, j]: tiempo de ir de la celda i a la celda (o salida) j. Se supone que el tiempo que tardan en
las celdas es despreciable.

El experimento consiste en colocar inicialmente un ratón en cada celda, y contar el número de ratones que son
capaces de salir del laberinto en un tiempo dado tmax. Suponiendo que los ratones eligen siempre el camino más
corto hacia alguna de las salidas, las preguntas a resolver son: i) ¿Cuántos ratones habrán salido en el instante
dado tmax? ii) ¿Cuánto tiempo se necesita para conseguir que todos los ratones hayan salido?
Se pide:

a) Dar un algoritmo para resolver los dos problemas anteriores. Se supone que el instante inicial es t= 1. Hacer
una estimación aproximada del orden de complejidad del algoritmo. No se pueden dar por supuestos los
algoritmos vistos en clase, aunque sí las implementaciones de los tipos de datos lista y grafo.
Universidad Católica del Norte
Facultad de Ingeniería y Ciencias Geológicas
Departamento de Ingeniería de Sistemas y Computación

b) Aplicar el algoritmo al siguiente ejemplo, donde n= 6, m= 2 y tmax= 5. Las celdas han sido representadas
con elipses, las salidas con rectángulos y los pasadizos con aristas etiquetadas. Además, en este caso se
supone que P[i, j] = P[j, i].

Problema 14
José es un ingeniero informático que quedó sin trabajo después de que sus malas prácticas de programación
causaran un accidente fatal en una aerolínea. Así que ahora se dedica a una vida de crímenes para mantener a su
familia. Suponga que José está robando una casa, pero se encuentra complicado con decidir que debería llevarse
para maximizar su beneficio. Dado esto, recuerda que en la universidad estudió análisis de algoritmos y decide
aplicar lo aprendido.

José cuenta con una mochila de capacidad fija, por lo que recuerda inmediatamente el “Problema de la
Mochila Fraccional” que consiste en decidir entre n objetos de pesos p1, p2, ..., pn y beneficios b1, b2, ..., bn, los
cuáles hay que incluir en una mochila de capacidad C sin superar dicha capacidad y de forma que se maximice
la suma de los beneficios de los objetos escogidos. Dispone de la siguiente información (entradas del
algoritmo):

 C: capacidad de la mochila;
 n: número de objetos;
 I = < i1, i2, …, in>: vector de objetos;
 Cada objeto tiene un campo p para su peso y b para su beneficio.

El problema se denomina mochila fraccional pues es posible tomar fracciones de elementos (es decir, si me
quedan 10 kg disponibles en la mochila, y tengo un objeto de 20 kg, puedo tomar la mitad de este objeto).
Dispone de librerías de programación estándar.

a) Explique una estrategia greedy para resolver la problemática.


b) Demuestre que un enfoque greedy no funciona si es que el problema no admite elementos fraccionarios
dentro de la mochila (busque un contraejemplo).
c) Codifique un algoritmo que permita encontrar el beneficio óptimo (no es necesario guardar cuáles objetos se
llevará) en función de la estrategia propuesta.
d) Analice su algoritmo, ¿cuál es el orden asintótico de ejecución en el peor caso y en el mejor caso?
Universidad Católica del Norte
Facultad de Ingeniería y Ciencias Geológicas
Departamento de Ingeniería de Sistemas y Computación

Problema 15
El problema del cambio en monedas se trata de devolver una cantidad de pesos con el menor número posible de
monedas. Se parte de un conjunto de tipos de monedas válidas, de las que se supone que hay cantidad suficiente
para realizar el desglose, y de un importe a devolver.

 Conjunto de candidatos: cada una de las monedas de los diferentes tipos que se pueden usar para realizar
el desglose del importe dado.
 Solución: un conjunto de monedas devuelto tras el desglose y cuyo valor total es igual al importe a
desglosar.
 Completable: la suma de los valores de las monedas escogidas en un momento dado no supera el importe a
desglosar.
 Función de selección: elegir si es posible la moneda de mayor valor de entre las candidatas.
 Función objetivo: número total de monedas utilizadas en la solución (debe minimizarse).

a) Describa un enfoque greedy para el desarrollo de este problema. Suponga que tiene un arreglo con las
denominaciones de cada moneda (e.g. [25, 10, 5, 1]) y que recibe como entrada el importe a devolver.
b) ¿Cuál es la complejidad computacional de su algoritmo?
c) Demostrar, buscando contraejemplos, que el algoritmo no es óptimo si se añade un nuevo tipo de moneda de
12 pesos o si se elimina alguno de los tipos existentes. En esas condiciones, el algoritmo puede incluso no
encontrar solución alguna, aunque ésta exista.

Problema 16
Dado un tablero de ajedrez y una casilla inicial, queremos decidir si es
posible que un caballo recorra todos y cada uno de los escaques sin duplicar
ninguno. No es necesario en este problema que el caballo vuelva al escaque
de partida. Asuma que el el tablero tiene un tamaño 𝑛 × 𝑛 y que el caballo se
encuentra en una casilla inicial arbitraria (𝑥0 , 𝑦0 ).

a) Plantee e implemente detalladamente una estrategia greedy que permita


solucionar el problema.
b) Buscar, utilizando el algoritmo realizado en el apartado anterior, todas las
casillas iniciales para los que el algoritmo encuentra solución.
c) Basándose en los resultados del apartado anterior, encontrar el patrón general de las soluciones del recorrido
del caballo.

Problema 17
Diseñar un algoritmo de tiempo lineal que tome dos secuencias de eventos (codificados como enteros binarios)
y determine si la primera secuencia de eventos es una subsecuencia de la segunda. Formulación del problema:

 Entradas: Dos secuencias 𝐴 y 𝐵, con largos 𝑚 y 𝑛, respectivamente.


 Salidas: Valor lógico indicando si 𝐴 es una subsecuencia de 𝐵.
Universidad Católica del Norte
Facultad de Ingeniería y Ciencias Geológicas
Departamento de Ingeniería de Sistemas y Computación

Algoritmos Randomizados
Problema 1
En matemáticas, y más concretamente en análisis numérico, se conocen como métodos de Montecarlo a una
serie de métodos de integración numérica que se basan en la utilización de números pseudoaleatorios. La
integración de Montecarlo forma parte de una familia de algoritmos llamados genéricamente métodos de
Montecarlo. Estos algoritmos utilizan números aleatorios para resolver diferentes tipos de problemas
matemáticos y reciben su nombre debido al casino de Montecarlo.

Los métodos de integración de Montecarlo son algoritmos para encontrar una evaluación aproximada de una
integral definida, normalmente de integrales múltiples. Los algoritmos deterministas de integración numérica,
para aproximar la integral, evalúan la función en un conjunto de puntos correspondientes a una parrilla regular o
en un conjunto de puntos predefinidos. En cambio, los métodos de Montecarlo eligen de forma aleatoria los
puntos en los que se evaluará la función.
𝑏 𝑛
𝑏−𝑎
∫ 𝑓(𝑥)𝑑𝑥 ≈ ∑ 𝑓(𝑥𝑖 ) , 𝑎 ≤ 𝑥𝑖 ≤ 𝑏
𝑎 𝑛
𝑖=1

El objetivo de este ejercicio es implementar un método de integración de Montecarlo para el caso más simple.
Se integrará una función real y continua 𝑓: ℝ → ℝ. Puede asumir que no se ingresarán funciones problemáticas a
su programa. Su implementación debe recibir los siguientes parámetros: la función a integrar, la cantidad de
iteraciones, el límite inferior de la integral y el límite superior de la integral.

a) Entregue el pseudocódigo (detallado) para implementar el algoritmo descrito en el enunciado. Asuma que
existe una función random() en [0, 1].
b) Utilice su algoritmo para evaluar la integral de 𝑓(𝑥) = 𝑥 2 desde 0 a 1. Asuma que su generador de números
aleatorios con n = 5 iteraciones son 0.2, 0.75, 0.33, 0.96 y 0.21. Compare su resultado con el valor real de la
integral.
c) ¿Cuál es la complejidad computacional de su algoritmo (caso promedio)? No es necesario una demostración
formal, pero debe fundamentar.
d) El algoritmo clásico de integración determinista escoge los puntos 𝑥𝑖 en función de particiones uniformes
realizadas sobre el intervalo de integración. Compare el enfoque clásico con el enfoque de integración de
Montecarlo.

Problema 2
La “Aguja de Buffon” es uno de los problemas más antiguos en el
campo de la probabilidad geométrica, remontándose a 1777. Este
problema involucra el lanzamiento de una aguja sobre un papel y
se busca determinar la probabilidad de que la aguja cruce una de
las líneas de la página. Lo interesante de este problema es su
relación con el valor de 𝜋.

En el caso más simple la aguja tiene largo unitario y la distancia entre las líneas también es unitaria. Existen dos
variables: el ángulo 𝜃 en el que cae la aguja (que varía entre 0° y 180°) y la distancia a la línea más cercana D.
Universidad Católica del Norte
Facultad de Ingeniería y Ciencias Geológicas
Departamento de Ingeniería de Sistemas y Computación

La imagen a la derecha describe la situación en que la aguja no toca las líneas. Se puede mostrar que la
probabilidad de tocar la línea es 2/𝜋.

a) Diseñe un algoritmo randomizado que simule el lanzamiento de la aguja de Buffon para una cantidad 𝑛 de
iteraciones y determine la cantidad de veces que la aguja toca la línea. Suponga que dispone de una función
random() que entrega valores aleatorios entre 0 y 1 inclusive.
b) Modifique su algoritmo anterior para aproximar el valor de 𝜋. Muestre el funcionamiento de su algoritmo
ruteando con valores aleatorios (puede inventarlos). ¿Qué tan cercano es al valor real?

Problema 3
El algoritmo de Aldous-Broder es uno de los más simples imaginables para la generación de laberintos, pero es
también uno de los algoritmos más ineficientes. Está relacionado con la teoría de los árboles de expansión,
específicamente, los árboles de expansión uniformes. El término uniforme hace referencia a que el árbol se
escoge aleatoriamente entre todos los posibles spanning trees de un grafo dado. Existen aplicaciones prácticas,
además de la generación de laberintos por diversión, de este algoritmo en probabilidades y física matemática.
De cualquier forma, el algoritmo es el siguiente:

Dado un grafo G:
1. Escoger un vértice cualquiera en G.
2. Escoger un vecino conectado al vértice y viajar hasta él. Si el vecino no ha sido visitado aun, agregar la
arista recorrida al árbol de expansión.
3. Repetir el paso 2 hasta que todos los vértices hayan sido visitados.

El algoritmo es capaz de seleccionar aleatoriamente (con igual probabilidad) entre todos los posibles spanning
trees (teóricamente, un árbol de expansión corresponde justamente con un laberinto). Se solicita lo siguiente:

a) Implementar una estructura de datos que permita representar la grilla requerida por el algoritmo. Notar que
la grilla corresponde se puede representar como un grafo, y un grafo a su vez se puede representar mediante
una matriz de adyacencia.
b) Implemente el algoritmo de Aldous-Broder para generar laberintos, su programa debe tener definida una
constante que indique el tamaño n de la grilla de n x n a utilizar y debe imprimir por pantalla la grilla
resultante.

Problema 4
a) Defina el concepto de Algoritmo de las Vegas.
b) Defina el concepto de Algoritmo de Montecarlo.
c) Explique la diferencia entre los dos conceptos previamente mencionados.
Universidad Católica del Norte
Facultad de Ingeniería y Ciencias Geológicas
Departamento de Ingeniería de Sistemas y Computación

Problema 5
Considere el siguiente código:

Misterio(A,n) // A es un arreglo de n enteros


{ i=random(1..n);
x=A[i]; k=0;
for(i=1;i<=n;i++)
if(A[i]==x) k++;
return(k>n/2);
}

a) ¿Qué hace este algoritmo? ¿Este algoritmo es de tipo las Vegas o Montecarlo?
b) ¿La respuesta es siempre correcta? Si no lo es indique una cota superior de la probabilidad de una respuesta
incorrecta.
c) Usando este algoritmo, escriba un algoritmo que siempre dé una respuesta correcta con alta probabilidad (1-
𝜀) cuando termina.

Problema 6
El algoritmo de Montecarlo permite obtener una aproximación de 𝜋 de la siguiente manera:

1. Considerar un circulo inscrito en un cuadrado de lado 2


2. Generar al azar varios puntos (x,y) dentro del cuadrado (usando Math.random())
3. Contar el número de puntos que caen dentro del círculo (cuyo centro está en (1,1) )

Aproximar 𝜋 considerando la proporción de entre los puntos que "cayeron" dentro del círculo y el total de
puntos, y la proporción entre las áreas del círculo y el cuadrado.
Problema 7
El método del temple simulado (Simulated Annealing) es un algoritmo de búsqueda meta-heurística para
problemas de optimización global. El objetivo general de este tipo de algoritmos es encontrar una buena
aproximación al valor óptimo de una función en un espacio de búsqueda grande. A este valor óptimo se lo
denomina "óptimo global". El nombre e inspiración viene del proceso de recocido del acero y cerámicas, una
técnica que consiste en calentar y luego enfriar lentamente el material para variar sus propiedades físicas. El
calor causa que los átomos aumenten su energía y que puedan así desplazarse de sus posiciones iniciales (un
mínimo local de energía); el enfriamiento lento les da mayores probabilidades de recristalizar en
configuraciones con menor energía que la inicial (mínimo global).

En cada paso, la heurística del temple simulador considera algún estado vecino del estado actual y determina
probabilísticamente si debe moverse a dicho estado o quedarse en el estado actual. El rango de posibles vecinos
va reduciéndose a medida que la temperatura se enfría. Este paso se repite hasta que el sistema alcanza un
estado que es lo suficientemente bueno para la aplicación práctica, o hasta que se ha agotado el presupuesto
computacional.
Universidad Católica del Norte
Facultad de Ingeniería y Ciencias Geológicas
Departamento de Ingeniería de Sistemas y Computación

El siguiente pseudocódigo representa la heurística de temple simulado según lo descrito anteriormente. Se inicia
en el estado 𝑠0 y se itera hasta el máximo de iteraciones 𝑘𝑚𝑎𝑥 definido. En este proceso, cada llamado a
neighbour(𝑠) debería elegir aleatoriamente un vecino dado un estado 𝑠. Por simplicidad se supondrá que
siempre que se pueda saltar a un estado de mayor energía se hará esto (no es necesario implementar una función
de probabilidad más compleja), así que el condicional simplemente pregunta si la nueva energía es mayor (o
menor dependiendo como se deba utilizar el algoritmo) y en dicho caso se actualiza. La planificación del
enfriamiento viene dada por la llamada temperature(𝑟), que debería entregar la temperatura que se debe
utilizar, dado el tiempo que se ha ocupado hasta ahora (es decir, cuantas iteraciones).

Por simplicidad, la implementación se realizará para una función 𝑓: ℝ → ℝ. Suponga además que la temperatura
empieza en 100 en la primera iteración y que decrece linealmente hasta alcanzar 0 cuando se alcanza la última
iteración. Suponga además que el rango de donde se puede elegir vecinos es proporcional a la temperatura (es
decir, cuando tenga una temperatura de 50 mi rango de elección se reducirá por la mitad a la izquierda y por la
mitad a la derecha desde el punto actual).

Resuelva los siguientes problemas de optimización utilizando su método (se entregan los óptimos exactos a
modo de comparación):

max{−𝑥 2 |𝑥 ∈ (−1, 1)} : 𝑥 ∗ = 0; max{−𝑥 2 + 4𝑥 − 4 |𝑥 ∈ (−5, 5)}: 𝑥 ∗ = 2; max{exp(𝑥) |𝑥 ∈ (−2, 2)}: 𝑥 ∗ = 2

Ejemplo del código llamado desde el main para la primera función a optimizar (notar que se elige un valor
inicial arbitrariamente):

DecimalFormat df = new DecimalFormat("#.####");


df.setRoundingMode(RoundingMode.CEILING);
System.out.println("Maximizing f(x) = -x^2 from -1 to 1:");
SimulatedAnnealing optimization = new SimulatedAnnealing(val -> -val*val, 0.5, 1000, -1, 1);
result = optimization.optimize();
System.out.println("The local optimum is found at " + df.format(result));

Problema 8
Sea X un conjunto de n elementos en el cual muestreamos con repetición de manera uniforme e independiente.
La esperanza matemática del número de muestras antes de la primera repetición, cuando n es grande tiende a k
= β √n siendo β=√𝜋/2 ≈ 1,253. Diseñe un algoritmo randomizado que permita estimar el tamaño del conjunto.
Universidad Católica del Norte
Facultad de Ingeniería y Ciencias Geológicas
Departamento de Ingeniería de Sistemas y Computación

Problema 9
El problema de las ocho reinas es un pasatiempo en el que se ponen ocho reinas en el tablero sin que se
amenacen. En el juego del ajedrez la reina amenaza a aquellas piezas que se encuentren en su misma fila,
columna o diagonal. Una solución clásica consiste en usar backtracking para resolver este problema. Se solicita
que resuelva el problema de las 8 reinas mediante un algoritmo de las Vegas.

Problema 10
En matemáticas, un número primo es un número natural mayor que 1 que tiene únicamente dos divisores
distintos: él mismo y el 1. Por el contrario, los números compuestos son los números naturales que tienen algún
divisor natural aparte de sí mismos y del 1 y por lo tanto, pueden factorizarse. Escriba un algoritmo de
Montecarlo para verificar si un número es primo o no.

Problema 11
a) Si 𝐶𝑖 es una variable indicadora y su valor esperado es 0.2, ¿cuál es la probabilidad de su evento asociado 𝜀?
b) Si 𝐶𝑖 es una variable indicadora con evento asociado 𝜀 y su valor esperado es r. ¿Cuánto es 𝑃[𝜀 𝑐 ]? Donde 𝜀 𝐶
representa el complemento de 𝜀.
c) Si 𝐶𝑖 es una variable indicadora con evento asociado 𝜀. ¿Cuánto es 𝐸[𝐶𝑖 ]?
Universidad Católica del Norte
Facultad de Ingeniería y Ciencias Geológicas
Departamento de Ingeniería de Sistemas y Computación

Algoritmos en Grafos
Problema 1
Dado el grafo de la derecha y utilizando como regla rompe-empates que
la preferencia se da según orden alfabético.

a) Aplique el algoritmo de Prim con el vértice a como inicial.


b) Aplique el algoritmo de Kruskal.
c) ¿Es único el MST generado? Fundamente.

Problema 2
Dado el siguiente grafo y utilizando como regla rompe-empates que la preferencia se da según orden numérico
ascendente (es decir el 5 va antes que el 7):

a) Aplique el algoritmo de Prim con el vértice 1 como inicial.


b) Aplique el algoritmo de Kruskal.
c) ¿Es único el MST generado?

Problema 3
Dado el grafo de la derecha y utilizando como regla rompe-empates que la
preferencia se da según orden numérico menor.

a) (16 puntos) Aplique el algoritmo de Prim con el vértice 1 como inicial.


b) (16 puntos) Aplique el algoritmo de Kruskal.
c) (8 puntos) ¿Es único el MST generado? Fundamente.

Problema 4
Para el grafo no dirigido dado por: E = {{1,2}, {1,4}, {1,6}, {2,3}, {3,4}, {3,5}, {4,5}, {4,6}, {5,6}, {5,7},
{6,8}, {7,8}, {7,9}, {8,9}, {8,10}, {9,10}}, con costos en el orden de los arcos: C = {1, 1, 2, 3, 4, 4, 5, 5, 2, 3,
2, 3, 1, 2, 1, 2}.

a) Defina una regla para lidiar con los empates.


b) Aplique el algoritmo de Prim con el vértice 1 como inicial.
c) Aplique el algoritmo de Kruskal.
d) ¿Es único el MST generado? Fundamente.
Universidad Católica del Norte
Facultad de Ingeniería y Ciencias Geológicas
Departamento de Ingeniería de Sistemas y Computación

Problema 5
Para el grafo no dirigido dado por: E = {{1,2}, {1,4}, {1,6}, {2,3}, {3,4}, {3,5}, {4,5}, {4,6}, {5,6}, {5,7},
{6,8}, {7,8}, {7,9}, {8,9}, {8,10}, {9,10}}, con costos en el orden de los arcos: C = {1, 1, 2, 3, 4, 4, 5, 5, 2, 3,
2, 3, 1, 2, 1, 2}.

a) Defina una regla para lidiar con los empates.


b) Aplique el algoritmo de Prim con el vértice 1 como inicial.
c) Aplique el algoritmo de Kruskal.
d) ¿Es único el MST generado? Fundamente.

Problema 6
Se entrega en la figura inferior el grafo valorado G. En caso que el algoritmo solicitado requiera de un grafo no
dirigido suponga que el grafo G es no dirigido.

3
a b
5 1

6 3
f c
1
2
2
e d
3
a) Aplique el algoritmo de Prim empezando desde el vértice a.
b) Aplique el algoritmo de Kruskal.
c) ¿Es único el árbol de expansión mínima de este grafo?