EJERCICIO 1 (5 puntos) (45 minutos)

Anuncio
Algorítmica y Complejidad
Examen Final
1 de julio de 2014
EJERCICIO 1
(5 puntos)
(45 minutos)
A continuación se muestran cuatro algoritmos cuya finalidad es ordenar de forma
ascendente los números almacenados en un vector A.
procedure ordenar_1 is
begin
i := A'First;
while (i <= N) loop
if (i = A'First) or else (A(i-1) < A(i)) then
i := i + 1;
else
tmp := A(i);
A(i) := A(i-1);
i := i - 1;
A(i) := tmp;
end if;
end loop;
end ordenar_1;
procedure ordenar_3 is
begin
i := A'First;
while (i < N) and (i > 0) loop
if A(i) <= A(i+1) then
i := i + 1;
else
tmp := A(i);
A(i) := A(i+1);
A(i+1) := tmp;
i := i - 1;
end if;
end loop;
end ordenar_3;
procedure ordenar_2 is
begin
i := A'First;
while (i <= N) loop
if (i = A'First) or else (A(i-1) <= A(i)) then
i := i + 1;
else
tmp := A(i);
A(i) := A(i-1);
i := i - 1;
A(i) := tmp;
end if;
end loop;
end ordenar_2;
procedure ordenar_4 is
begin
i := A'First;
while (i <= N) loop
if (i = A'First) or else (A(i-1) >= A(i)) then
i := i + 1;
else
tmp := A(i);
A(i) := A(i-1);
i := i - 1;
A(i) := tmp;
end if;
end loop;
end ordenar_4;
1) Elegir un algoritmo que realice correctamente la ordenación y además sea estable, in
situ y natural.
Las siguientes cuestiones se refieren al algoritmo elegido en el apartado anterior. Si no se
ha contestado a dicho apartado, se utilizará "ordenar_1" como referente.
2) Indicar cuándo se da el mejor caso, su tiempo de ejecución y su complejidad. Suponer
que todas las sentencias tienen como duración la unidad.
3) ¿Cuantas veces se ejecutarán las sentencias de la rama "else" cuando el contenido
inicial del vector sea: 1, 2, 3, 4, 6, 5, 7, 8?
4) Indicar cuándo se produce el peor caso y su complejidad.
EJERCICIO 2
(5 puntos)
(45 minutos)
Se desea obtener un árbol de expansión para cada uno de los grafos mostrados a
continuación:
3
2
2
1
1
1
3
2
2
2
5
5
1
4
1
4
1
Grafo 1
Grafo 2
Grafo 3
3
4
5
3
4
1
1
2
2
5
4
5
1
Grafo 4
Grafo 5
1) Para cada grafo, indicar el orden en que se irían añadiendo las aristas en cada
iteración si se aplicara el algoritmo de Kruskal.
2) Hacer lo mismo para el algoritmo de Prim, considerando como raíz el nodo
sombreado.
NOTA: Para contestar se utilizarán las hojas de respuesta suministradas. En ellas basta
con ir añadiendo los arcos que aparecerían en cada iteración. Por ejemplo:
Estado inicial
1ª Iteración
2ª Iteración
MST-KRUSKAL (G, w):
A←Ø
foreach v in G.V do
Make-Set (v)
endfor
W ← Ordenar (Ascendente, G.E, w)
while A ≠ MST do
(u,v) ← ExtraerPrimerArco (W)
if Find (u) ≠ Find (v)
A ← A ∪ {(u, v)}
Union (u, v)
endif
endwhile
MST-PRIM (G, w, r):
foreach u in G.V do
u.key ← ∞
u.parent ← NIL
endfor
r.key ← 0
Q ← G.V
while Q ≠ Ø do
u ← EXTRACT-MIN (Q)
foreach v in G.Adyacencia [u]
if v ∈ Q && w (u, v) < v.key
v.parent ← u
v.key ← w (u, v)
A = A ∪ {(v, v.parent)}
endif
endfor
endwhile
2
Algorítmica y Complejidad
Examen Final
1 de julio de 2014
EJERCICIO 1
(SOLUCIÓN)
Apartado 1)
El procedimiento ordenar_1 se queda en un bucle infinito cuando en el vector a ordenar
aparecen dos números iguales.
El procedimiento ordenar_2 es un algoritmo correcto, estable, natural e in-situ.
El procedimiento ordenar_3 no es correcto. En un vector de entrada ordenado de forma
descendente, intercambia los dos primeros elementos y luego finaliza al no ser cierta la
condición del bucle while. Teniendo la variable i el valor 0 tras el primer intercambio.
El procedimiento ordenar_4 realiza la ordenación descendente del vector de entrada.
Apartado 2)
El mejor caso se da cuando el vector de entrada ya está ordenado de forma ascendente. No
ejecutándose la rama ‘else’ de la sentencia ‘if’ en ningún caso.
Su tiempo de ejecución es igual a
Siendo la complejidad, O(n)
Apartado 3)
Se intercambian una única vez los números 6 y 5, quedando el vector de entrada ordenado de
forma ascendente.
Apartado 4)
El peor caso se da cuando el vector de entrada está ordenado de forma descendente.
Gráficamente el algoritmo de ordenación funciona de la forma siguiente, para un vector de tres
elementos ordenados de forma descendente.
Para llevar cada elemento a su posición correcta se necesitan n-1 movimientos. Como cada
movimiento se contabiliza dos veces con cada posible elemento, el numero total de
movimientos (V(n)) será:
2
Por lo tanto, la complejidad del algoritmo, en el peor de los casos, es O (n )
4
Algorítmica y Complejidad
Examen Final
1 de julio de 2014
EJERCICIO 2
APARTADO 1)
Grafo 1
Grafo 2
Grafo 3
Grafo 4
Grafo 5
(SOLUCIÓN)
(Algoritmo de Kurskal)
APARTADO 2)
(Algoritmo de Prim)
Grafo 1
Grafo 2
Grafo 3
Grafo 4
Grafo 5
6
Descargar