Complejidad

Tiempo de ejecucion de un algoritmo

Cómo se mide el tiempo de ejecución de un programa en función de N-->(número de datos)?

Esta funcion se puede medir fisicamente calculandolo con un reloj o se puede calcular
sobre el codigo contando las instrucciones a ejecutar y multiplicandolo por el tiempo
requerido por cada instruccion.

==Reglas practicas para calcular la complejidad de un algoritmo==

1.-Sentencia Sencilla
Asignacion, E/O de datos
Se refiere a las sentencias de asignación de entrada y salida de datos siempre y cuando
no trabajen sobre estructuras cuyo tamanio esta relacionado con N. Como requiere un
tiempo contanste de ejecución su complejidad es el del orden Constante--> O(1)

2.- Sentencia de Sentencias: Suma de complejidad
Su complejidad esta dada por la suma de complejidades individuales de acuerdo al tipo de
sentencias que se trata tomandose encuenta el orden mas alto.

3.- Decisión (if): La condicion suele ser de orden constante-->O(1), sumando en la peor rama posible ya sea la del THEN o del ELSE.

4.- Bucles (ciclos):En los ciclos o contadores Explicitos, existen dos casos el tamanio N forme parte de los limites del ciclo o no.

Ejemplo
a)contador explicito-->
for (int i=0;i {s1}
entonces k* O(1)=O(1)
for (int i=0;i {s1}
entoncesN*O(1)=O(n)Lineas


b)Evolucion de variables de control
No lineal(While)-->

En los ciclos multiplicativos como el while y el do while, el incremento o el decremento de la
variable e control no es lineal, lo que hace incrementar el orden de complejidad como en los
ejemplos siguientes

==EJEMPLO incremento==

c=1;
while (c{
s1;
c=2*c;
}
Entonces la complejidad logaritmica O(log n)

==EJEMPLO decremento==

c=N
while (c>1)
{
s1;
c=c/2;
}
Complejidad logaritmica O(log n)

5.- Llamadas de Procedimientos:
La complejidad de llamar a un procedimiento esta dada por la complejidad del contenido en procedimiento en si, es decir su complejidad depende del tipo de instrucciones o sentencias que existan en el cuerpo del procedimiento. En conclusión la complejidad de un procedimiento tiene a complicarse si se trata de procedimientos recursivos(llamandose a si mismo).

==EJEMPLO==

Funcion factorial (no recursiva) (Iterativo<--ciclos)

int factorial(int n)/*Sentencia entrada O(1)*/
{
int fact=1;/*sentencia de asignacion O(1)*/
for (int i=n;1>0,i--)/*Ciclo contador explicito O(n)*/
fact=fact*1;/*Sentencia de asignacion O(1)*/
return fact;/*Sentencia de salida O(1)*/
}

entonces: Complejidad lineal O(n) po el ciclo for con numero de iteraciones iguales a n.

_____________________________________________________________________________________________

==Ordenes de complejidad==

O(1) Constante Ideal
O(n) Lineal Eficiente
O(log n) Logaritmico "
O(n log n) Casi lineal "
O(n^k) Polinomial Tratable
O(k^n) Exponencial Intratables
O(n!) Factorial "

No hay comentarios: