Está en la página 1de 4

UNIVERSIDAD DE COSTA RICA

FACULTAD DE INGENIERÍA
ESCUELA DE CIENCIAS DE LA COMPUTACIÓN E INFORMÁTICA

CI-1221 Estructuras de Datos y Análisis de Algoritmos


II Ciclo de 2009

III EXAMEN PARCIAL

Viernes 27 de noviembre, 1:00 a 3:30 p.m.

El examen consta de 140 puntos pero no se reconocerán más de 120. Cada pregunta empieza con un
indicador de su puntaje y del tema del que trata. Si la pregunta tiene subítemes, el puntaje de cada uno
de ellos es indicado al final de la pregunta. Se recomienda echar un vistazo a los temas de las preguntas
y a su puntaje antes de empezar a resolver el examen para así distribuir su tiempo y esfuerzo de la
mejor manera, de acuerdo a sus destrezas.

1. [30 pts.] Programación Dinámica. Juana quiere ir a visitar a su abuela y para ello necesita
tomar el autobús. En medio de su pueblo y el de su abuela hay n−2 pueblos, y entre cada par
de ellos solo existen rutas directas de autobús (una vez que el autobus sale del pueblo origen no
se detiene sino hasta llegar al pueblo destino). La tarifas entre cada par de pueblos está dado por
la matriz T ={t ij }1≤i j≤n.
(a) Defina los pasos base [3 pts.], recursivo [5 pts.] y final [2 pts.] necesarios para minimizar el
costo del viaje de Juana, utilizando programación dinámica. (Puede asumir que las tarifas
son tales que no es posible encontrar una ruta de costo mínimo que visite un pueblo
“geográficamente anterior”, esto es, del pueblo i al pueblo i-j).
(b) Implemente en seudocódigo o C++ una solución iterativa que use programación dinámica
basado en los pasos definidos en el punto anterior. [10 pts.]
(c) Determine la complejidad del algoritmo. [3 pts.]
(d) Describa (o implemente) un algoritmo que solucione el problema haciendo una búsqueda
exhaustiva que examine todas las posibles rutas [2 pts.]. Determine de forma exacta cuántas
rutas hay.
[5 pts.]
2. [10 pts.] Algoritmos ávidos: árboles de Huffman. Encuentre una hilera de longitud al menos 5
para la cual un árbol de Huffman produzca un código que no es mejor que un código óptimo de
longitud fija.
(a) Muestre la hilera. [5 pts.]
(b) Muestre el código óptimo de longitud fija para cada uno de los caracteres de la hilera.
[2 pts.]
(c) Muestre el código de Huffman para cada uno de los caracteres de la hilera. [3 pts.]
3. [10 pts.] Árboles B. El grado mínimo de un árbol B se define como el número mínimo de hijos
que debe tener un nodo interno, excepto la raíz. Dado un grado mínimo t:
(a) Determine el número máximo de nodos que pueden existir en el nivel i, como función de t.
(Recuerde que la raíz está en el nivel 0). [5 pts.]
(b) Determine el número máximo de nodos que pueden existir en el árbol en función de t y de
su altura. [5 pts.]
4. [8 pts.] Árboles B. Sea un árbol B vacío de grado mínimo t=2 . Inserte en él los elementos
1, 2, 3, 4, 5, 6, 7 y 8 en ese orden y muestre el estado del árbol despúes de cada inserción.
5. [25 pts.] Búsqueda a lo ancho y en profundidad en un grafo. A continuación se presenta una
modificación del algoritmo de búsqueda en profundidad (BFS) en el cual no se guardan ni las
distancias ni los predecesores del árbol generado, sino que simplemente se imprimen los
vértices por nivel (primero la raíz, luego los vértices en el nivel 1, luego los vértices en el
nivel 2, etc.):

BFS(G, s)
1 for each vertex u ∈ V [G] − {s}
2 do color[u] ← white
5 color[s] ← gray
6 Q←Ø
9 Enqueue(Q, s)
10 while Q ≠ Ø
11 do u ← Dequeue(Q)
13 print u
12 color[u] ← black
14 for each v ∈ Adj[u]
15 do if color[v] = white
16 then color[v] ← gray
17 Enqueue(Q, v)

(a) Modifique este código para que la “búsqueda” (despliegue de los vértices) se haga en
profundidad en vez de “a lo ancho”. Puede asumir que el grafo es conexo. (Sugerencias:
[i] considere utilizar otra estructura de datos auxiliar en vez de una cola y [ii] considere
utilizar menos colores).
(b) [10 pts.] Simule la ejecución de su algoritmo sobre el siguiente grafo y al finalizar cada una
de las iteraciones principales (entiéndase el while loop) muestre: la salida, el estado de las
estructuras auxiliares (si utiliza alguna) y el coloreo del grafo. Para cada vértice asuma que
su lista de nodos adyacentes se encuentra ordenada alfabéticamente.
(c) [5 pts.] Determine la complejidad del algoritmo, argumentando su respuesta.
6. [12 pts.] Árboles de expansión de mínimo costo. Determine un árbol de expansión de mínimo
costo (minimum spanning tree) para el siguiente grafo, utilizando el algoritmo de Kruskal
[6 pts.] y el algoritmo de Prim [6 pts.]. Para el algoritmo de Prim utilice como raíz el vértice A.

7. [10 pts.] Caminos más cortos desde un vértice en un grafo. Utilice el algoritmo de Dijkstra para
encontrar el camino de distancia mínima entre A y cada uno de los otros vértices en el grafo
mostrado abajo. Muestre el estado de la cola de prioridad después del “relajamiento” del grupo
de vértices adyacentes al vértice extraído de la cola (p. ej., diferenciando los vértices que
quedan en la cola del resto, dibujando sólo los vértices que quedan en la cola o explícitamente
mostrando la cola de prioridad) y sus respectivas distancias mínimas actuales (p. ej., mostrando
las distancias al lado de los nombres de los vértices o explícitamente en un arreglo).

8. [15 pts.] Caminos más cortos entre todos los pares de vértices en un grafo. A continuación se
presenta el algoritmo de Floyd y Warshall para encontrar la ruta más corta entre cualquier par
de vértices en un digrafo pesado:
donde W representa los pesos y D representa las distancias parciales entre cada par de vértices
del grafo.
Para el siguiente grafo:

(a) Identifique su matriz de pesos W. [3 pts.]


(b) Utilice el algoritmo de Floyd y Warshall para determinar la distancia entre cada par de
vértices. Muestre el estado de D al finalizar cada iteración principal del algoritmo (esto es,
cada iteración sobre k). [12 pts.]
9. [20 pts.] Búsqueda con retroceso (backtracking). El problema de las n reinas consiste en un
acertijo en el que se colocan n reinas en un tablero n×n sin que ningún par de ellas se pongan
en jaque mutuamente. En el ajedrez, la reina pone en jaque a aquellas fichas que se encuentren
en su misma fila, columna o diagonal.
(a) Escriba un algoritmo en seudocódigo o C++ que resuelva el problema de las 8 reinas
utilizando la técnica de búsqueda con retroceso. Asuma la existencia de una subrutina
válido(T,i,j) (o T.válido(i,j)) que dado un tablero T y números de fila i y
columna j indique si es válido poner una reina en la casilla i,j, esto es, que indique si el
hacerlo no pone en jaque a las reinas que habitan actualmente en el tablero. [10 pts.]
(b) Describa lo que una implementación eficiente de válido(T,i,j) debe hacer para lograr
su cometido y determine cuál es sería la complejidad computacional de esta subrutina.
(Alternativamente, puede implementar el algoritmo en vez de describirlo). [5 pts.]
(c) Basado en la complejidad computacional de válido(T,i,j), determine la complejidad
computacional del algoritmo principal. [5 pts.]

También podría gustarte