LLAMADAS A PROCEDIMIENTOS

El tiempo de ejecución para un procedimiento está dado por el tiempo requerido para ejecutar el cuerpo del procedimiento llamado. Si un procedimiento hace llamadas a otros procedimientos "no recursivos", es posible calcular el tiempo de ejecución de cada procedimiento llamado, uno a la vez, partiendo de aquellos que no llaman a ninguno.

Ejemplo 1: Función no recursiva que halla el factorial de un número n cualquiera, un sólo bucle.


Su complejidad es lineal O(n) debido a que se tiene un bucle FOR cuyo número de iteraciones es n.

Ejemplo 2: Dos bucles anidados dependientes de n.

Tenemos O(n) * O(n) * O(1) = O(n^2), complejidad cuadrática.

Ejemplo 3: Bucles donde la evolución de la variable de control es ascendente no lineal.

Para este ejemplo, al principio el valor de c es 1, al cabo de x iteraciones será 2^x, el número de iteraciones es tal que n= 2^x donde x es el entero inmediato superior de n y de esta manera, x = log2 n iteraciones. La eficiencia para este caso es:

O(1) * O(log n) * O(1) = O(log n), complejidad logarítmica.

Ejemplo 4: Bucles donde la evolución de la variable de control no es lineal, junto a bucles con evolución de variable lineal.

Tenemos un bucle interno de orden O(log n) que se ejecuta O(log n) veces, luego el conjunto de ordenes es de orden:

O(1) * O(n) * O(log n) = O(n log n), complejidad cuasi-lineal.

¿Qué calculan estos algoritmos?

Ejercicio:

Dados los siguientes pares de funciones, ¿cuál es el menor valor de n de modo que la primera función sea mayor que la segunda?
a) 2^n,2n^2.
b) n^1.5, 2n log2 n.
c) n^3, 5n^2.81.