Você está na página 1de 6

Universidad Nacional de Trujillo Estructura de Datos II Ciclo -2010

Análisis de Complejidad de Algoritmos

La Complejidad Computacional mide la cantidad de esfuerzo computacional (tiempo) necesario


para resolver un problema.

En general, para un algoritmo se analizan tres casos de complejidad:

Mejor Caso: Aquel en el cual la solución se encuentra mas rápido.


Peor Caso: Aquel en el cual la mas nos demoramos en hallar la solución.
Caso Medio: El caso medio.

Ejemplo: La búsqueda lineal tiene (en general )


mejor caso: T(1),
peor caso: T(n)
caso medio:

La Notación O Grande o Big O: Es un estándar para expresar los límites superiores. Es decir:

si y solo si existe las constantes

tal que para todo

En orden ascendente tenemos:

Utilice la Notación O para:

Ing. Sofia Pedro Huaman Pág. 1


Universidad Nacional de Trujillo Estructura de Datos II Ciclo -2010

Propiedades

1. Si para una cosntante c, entonces


2. Si entonces
3. Si entonces
4. Si f es un polinomio de grado k entonces
5. Si

Como calculamos la complejidad:

 Para una secuencia de sentencias:

S1;
S2; La suma de los tiempos de cada una de las n
⋮ sentencias, es decir por propiedad la mayor de
Sn; ellas.

 Para Condicionales:

Si (condicion)
Entonces La suma del tiempo del análisis de la
Sentencias_SI condición más el tiempo de las
Sino Sentencias_SI más el tiempo de las
Sentencias_SINO Sentencias_SINO si es que las hubiera.
Sentencias
Fin_Si

 Para Bucles:

En general tiempo de la comparación es O(1) a menos que la comparación sea la llamada


una función, en este caso se deberá evaluará la complejidad de la función.

Ing. Sofia Pedro Huaman Pág. 2


Universidad Nacional de Trujillo Estructura de Datos II Ciclo -2010

Ejemplos de Bucles anidados

(1) int k=0; (1) int k=0;


(2) for ( int i=0; i<n; i++) (2) for ( int i=1; i<n; i*=2)
(3) for ( int j=i; j<n; j++) (3) for ( int j=1; j<n; j++)
(4) k++; (4) k++;

El numero de veces que se ejecuta las El número de veces que se ejecuta las
líneas (3-4) es , por el momento no lo líneas (3-4) es .
llevaremos a la notación O, pues aun falta Para determinar el numero de veces que se
introducir al análisis el comportamiento de ejecuta la línea (1-4) debemos darnos
i. cuenta que en una k-esima iteración
El numero de veces que se ejecuta la línea Podemos afirmar que
(1-4) esta dado , lo cual como y el bucle se ejecuta veces,
se observa es igual a la sumatoria de los = O(log n). Finalmente
naturales, por tanto la complejidad del bloque (1-4) es

Recursividad
Las funciones recursivas se definen en términos de si mismas.

Example:

Al implementar métodos recursivos hay que tener en cuenta:

Se debe definir claramente una condición de parada.


Cada llamada recursiva debe conducirnos finalmente a la condición de parada, sino se
entrara en un estado de recursión infinito y el programa se colgara

Ing. Sofia Pedro Huaman Pág. 3


Universidad Nacional de Trujillo Estructura de Datos II Ciclo -2010

En el grafico anterior se puede apreciar el consumo de memoria en cada llamada recursiva,


mostrándose claramente su punto débil. Para un ordenador es más costosa la recursividad ya que
implica realizar muchas llamadas a funciones en cada cual se genera una copia del código de la
misma, lo que sobrecarga la memoria del ordenador.

¿Por qué elegir recursividad? De hecho si poseemos la solución iterativa, no deberíamos utilizar la
recursividad. La recursividad se utiliza sólo si:

No encontramos la solución iterativa a un problema


El código es mucho más claro en su versión recursiva pero no pesa demasiado en la
ejecución del ordenador

Un ejemplo de cuando es mejor la solución iterativa que la solución recursiva es serie Fibonacci. A
continuación esta el análisis de la versión recursiva. Luego, como TAREA tú debes escribir una
versión iterativa del método y calcular su complejidad. ¿Consideras que la variación es significativa?
¿En este caso vale la pena preferir la elegancia de la recursión?

Funcion fib(n)
Si n = 0 o n = 1 Entonces
retornar 1
Sino
retornar fib(n-1) + fib(n-2)

La función de tiempo recursiva seria

T(0) = c
T(1) = c
T(2) = T(1)+ T(0) = c + c = 2c
T(3) = T(2)+T(1) = 2c+ c = 3c
T(4) = T(3)+T(2) = 3c+ 2c = 5c
T(5) = T(4)+T(3) = 5c+ 3c = 8c

T(n-1) = T(n-2) + T(n-1)

Como se observa es bastante difícil encontrar una ley de formación, los valores no se encuentran en
sucesión aritmética, es más si se observa con cuidado o se genera una grafica de los valores
obtenidos se observa que la curva es de comportamiento exponencial, por lo tanto debe tener la
forma . Nosotros debemos hallar los valores más aproximados para k y c.

Ing. Sofia Pedro Huaman Pág. 4


Universidad Nacional de Trujillo Estructura de Datos II Ciclo -2010

Para esto nos ayudaremos de la siguiente tabla, utilizando la propiedad , y luego de


obtener k donde los valores se uniformicen calculamos c o bien sacamos el promedio de una
muestra significativa.

0 1 2 3 4 5 6 7 8
1 1 2 3 5 8 13 21 34
1 2 1.5 1.67 1.6 1.63 1.62 1.62

Finalmente se obtiene que b ≈ 1.62 y c ≈ 0.72. La complejidad computacional es


.

Finalmente otro ejemplo muy conocido de recursividad es el de las

Torres de Hanoi.

Mover n discos del poste 1 al poste 3 (utilizando el poste 2 como auxiliar): Hanoi (n, 1, 2, 3);

A continuación el pseudocódigo:

Hanoi (entero n, entero inic, entero temp, entero final)


Inicio
Si (n > 0) Entonces
Hanoi (n-1, inic, final, temp)
Mover el disco n de inic a final
Hanoi (n-1, temp, inic, final)
Fin_Si
Fin

La función recursiva considerando numero de movimientos:

Es decir

Ing. Sofia Pedro Huaman Pág. 5


Universidad Nacional de Trujillo Estructura de Datos II Ciclo -2010

Calculamos la complejidad:

Entonces: .

Solución: Para n=3

Ing. Sofia Pedro Huaman Pág. 6

Você também pode gostar