EJERCICIOS DE ALGORÍTMICA Y COMPLEJIDAD COMPLEJIDAD Ejercicio 1. Indicar, en función de N, la cota superior de complejidad (O-grande) para el procedimiento “Prueba” que aparece en cada caso. 1) procedure Prueba (N : natural) is begin if N > 10 then x := 2 * N; else for i in 1..N loop x := 2 * N; end loop; end if; end Prueba; 3) procedure Prueba (N : natural) is begin if N > 10 then for i in 1..N loop x := 2 * N; end loop; else for i in 1..N-1 loop for j in 1..N loop x := 2 * N; end loop; end loop; end if; end Prueba; 5) procedure Prueba (N : natural) is begin x := 0; loop x := x + N; exit when x > 100; end loop; end Prueba; 7) procedure Prueba (N : natural) is begin x := 0; loop x := 1 + (2 * x); exit when x > N; end loop; end Prueba; 2) procedure Prueba (N : natural) is begin if N > 10 then x := 2 * N; else for i in 1..N-1 loop for j in 1..N loop x := 2 * N; end loop; end loop; end if; end Prueba; 4) procedure Prueba (N : natural) is begin for i in 1..n loop for j in 1..i loop x := 2 * N; end loop; end loop; end Prueba; 6) procedure Prueba (N : natural) is begin x := 0; loop x := x + (2 * N); exit when x > 100; end loop; end Prueba; 8) procedure Prueba (N : natural) is A : array (1..100) of integer; begin x := N; for i in A'range loop A(i) := N + x; x := x + 1; end loop; end Prueba; 9) procedure Prueba (N : natural) is procedure vueltas is begin for i in 1..N loop for j in 1..N loop x := x + 1; end loop; end loop; end vueltas; begin x := 1; if n > 10 then vueltas; else for i in 1..N loop vueltas; end loop; end if; end Prueba; 10) procedure Prueba (N : natural) is procedure vueltas is begin for i in 1..N loop for j in 1..N loop x := x + 1; end loop; end loop; end vueltas; begin x := 1; if n < 10 then vueltas; else for i in 1..N loop vueltas; end loop; end if; end Prueba; Ejercicio 2. Calcular la cota superior de complejidad y el tiempo de ejecución de un algoritmo que halle el factorial de N de forma recursiva. Ejercicio 3. En 1883 el matemático francés Édouard Lucas comercializó un juego al que llamó "La torre de Hanoi" y que posteriormente sería más conocido por su nombre en plural. Con el fin de hacer más atractivo el juego, lo acompañó de la siguiente leyenda: “En el gran templo de Benarés, debajo de la cúpula que marca el centro del mundo, yace una base de bronce, en donde se encuentran acomodadas 3 agujas de diamante, cada una del grueso del cuerpo de una abeja y de una altura de 50 cm aproximadamente. En una de estas agujas, Dios, en el momento de la creación, colocó 64 discos de oro, el mayor sobre el plato de bronce y el resto, de menor tamaño, conforme se llega a la cima. Día y noche, incesantemente, los sacerdotes del templo mueven los discos de una aguja a otra de acuerdo con las leyes impuestas e inmutables de Brahma, que requieren que los sacerdotes se encuentren todo el tiempo laborando, no muevan más de un disco a la vez y que deben colocar el disco en alguna de las agujas de modo que no cubra a un disco de radio menor. Cuando los 64 discos hayan sido transferidos de la aguja en la que Dios colocó los discos, en el momento de la creación, a la otra aguja, el templo y los brahmanes se convertirán en polvo y junto con ellos el mundo desaparecerá.” Si la leyenda fuera cierta y suponiendo que los sacerdotes son capaces de mover un disco cada segundo sin equivocarse, ¿merecería la pena seguir estudiando la asignatura o haríamos mejor en prepararnos para el fin del mundo? Nota: La edad del universo se estima en unos 14000 millones de años. Ejercicio 4. Responder a las cuestiones siguientes sobre el algoritmo que aparece a continuación. type Vector is array (1..10) of Natural; Resultado : Vector; procedure prueba (n : Natural; A : out Vector) is m : Natural := 1; begin (1) for k in A'Range loop A(k) := 0; end loop; (2) for i in 1..n-1 loop ---- tiempo de ejecución = 3 for j in i+1..n loop ---- tiempo de ejecución = 3 m := m + 1; ---- tiempo de ejecución = 2 end loop; end loop; A (m mod 10) := 1; end prueba; 1) Indica el orden de complejidad del bucle (1). 2) Calcular el tiempo de ejecución del bucle (2) en función de n. 3) Indica las tres cotas (Ο, Θ, Ω) del apartado anterior. 4) Indica la complejidad del bucle siguiente en función de n: k := 1; while k <= n loop prueba (k, Resultado); k := k*2; end loop; -- Llamada al procedimiento anterior