Академический Документы
Профессиональный Документы
Культура Документы
Anlisis de Algoritmos
Eficiencia de Algoritmos
Siempre que elaboremos un algoritmo debemos preocuparnos en
analizar su eficiencia.
a) Cantidad de memoria
b) Tiempo de cmputo requerido
Tiempo de ejecucin
Se determina por el nmero de operaciones elementales.
La Notacin O
Grande
Para expresar la cota superior asinttica de una funcin, se
usa la notacin O Grande. Matemticamente:
La Notacin Omega
Grande
Para expresar la cota inferior asinttica de una funcin, se
usa la notacin Grande. Matemticamente:
La Notacin Theta
Grande
Para expresar la cota ajustada asinttica de una funcin, se
usa la notacin Grande. Matemticamente:
Sentencias Simples
Condicionales
Bucles
Llamadas a funcin
Secuencias de instrucciones
a) Sentencias simples
Cuando en un algoritmo intervienen sentencias simples,
como asignacin, entrada o salida e datos, requieren un
tiempo constante de ejecucin por lo que su complejidad
ser: O(1)
Nota:
Esto no incluye aquellas variables cuyo tamao esta relacionado
con el tamao del problema.
c) Bucles
Si el bucle tiene un contador de tamao conocido entonces se
multiplica esa cantidad de veces por la sentencia de peor
complejidad.
d) Llamadas a funciones
Viene dada por la complejidad de sus sentencias. El costo de
la invocacin a la funcin y su retorno se consideran
constantes y se puede obviar para el anlisis asinttico.
e) Secuencias de instrucciones
La complejidad de una secuencia de instrucciones es la suma
de sus complejidades individuales, debiendo aplicar todo lo
anterior.
Jerarqua de Ordenes de
Complejidades
O(1) Orden constante
O(log n) Orden logartmico
O(n) Orden lineal
O(n log n) Orden cuasi-lineal
O(n2) Orden cuadrtico
O(n3) Orden cbico
O(na) Orden polinmico
O(2n) Orden exponencial
O(n!) Orden factorial
O(1): Complejidad constante. Cuando las instrucciones se
ejecutan una vez.
funcion( int n) {
int i, j, k, x;
x=0;
para i=1 hasta n-1 hacer
para j=i+1 hasta n hacer
para k=1 hasta j hacer
x=x+1
fin_para
fin_para
fin_para
}
El bucle mas interno repite j veces una instruccin de tiempo O(1)
j
1 o sea la instruccin simple x=x+1
funcion(se
intrealiza
n){ j
veces. int i, j, k, x;
x=0;
k=1 para i=1 hasta n-1
hacer
para j=i+1 hasta
n hacer
para k=1
hasta j hacer
x=x+
1
fin_para
fin_para
fin_para
}
El bucle mas interno repite j veces una instruccin de tiempo O(1)
j
funcion( int n){
1 o sea la instruccin simple x=x+1 se realiza j int i, j, k, x;
x=0;
veces. para i=1 hasta n-1
k=1 hacer
para j=i+1 hasta
El segundo bucle mas interno:
n n hacer
j = n (n+1)/2 i (i+1)/2
j=i+1 para k=1
hasta j hacer
x=x+
1
fin_para
fin_para
fin_para
}
funcion(
El bucle mas interno repite j veces una instruccin int n){ O(1)
de tiempo
int i, j, k, x;
j
x=0;
1 o sea la instruccin simple x=x+1 se realiza j para i=1 hasta n-1
hacer
veces. para j=i+1 hasta
k=1 n hacer
para k=1
El segundo bucle mas interno:
n hasta j hacer
j = n (n+1)/2 i (i+1)/2
j=i+1 x=x+
El tercer bucle (el externo) tenemos: 1
n-1 n-1 n-1
[ n (n+1)/2 i (i+1)/2 ] = n (n+1)/2 i (i+1)/2 fin_para
i=1 i=1 i=1
fin_para
n-1
fin_para
= (n-1) n (n+1) / 2 - 1/2 (i2+i)
}
i=1
n-1 n-1
= (n-1) n (n+1) / 2 - 1/2 [ i2 + i ]
i=1 i=1
= (n-1) n (n+1) / 2 - 1/2. (n-1)(n)(2n-1)/6 1/2.(n-1)n/2
= n(n2-1)/3
O(n3)
Calcular la complejidad del
siguiente algoritmo iterativo
funcion( int n){
int i, j, k, x;
x=0;
para i=1 hasta n-1
hacer
para j=i+2 hasta
n hacer
para k=1
hasta j hacer
x=x+ Complejidad:
k
fin_para
fin_para O(?)
fin_para
}
Calcular la complejidad del
siguiente algoritmo iterativo