EJERCICIO 1 (5 puntos) (45 minutos)
Transcripción
EJERCICIO 1 (5 puntos) (45 minutos)
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