Sunteți pe pagina 1din 45

Complejidad de Algoritmos

Karim Guevara Puente de la Vega


kguevara72@gmail.com
UCSM, 2014

Agenda

Introduccin
Tipos de Algoritmos
Medidas de eficiencia
Complejidad algoritmica
Tiempo de ejecucin
Notaciones asintticas
Anlisis de algoritmos no recursivos
Anlisis de algoritmos recursivos

Introduccin

La solucin de un problema haciendo uso de las


computadoras requiere por una parte un
algoritmo y por otra un programa en un LP.
Ambos componentes tienen importancia; pero la
del algoritmo es absolutamente indispensable

Muchas alternativas de solucin

Cuando hay necesidad de elegir entre varios


algoritmos, cmo se debe elegir?...

Hay tres objetivos que suelen contradecirse:


1. Que el algoritmo sea fcil de entender, codificar y
depurar.
2. Que el algoritmo se ejecute con la mayor rapidez posible.
3. Que el algoritmo utilice de forma ptima la memoria
disponible.

Tipos de algoritmos

Algoritmos polinomiales

Aquellos que son proporcionales a nk.


En general son factibles o aplicables: son solucionables

Algoritmos exponenciales

Aquellos que son proporcionales a kn


En general, no son factibles salvo un tamao de
entrada n exageradamente pequeo.

Los recursos utilizados dependen de:

Factores externos:

El computador donde lo ejecutamos

El lenguaje de programacin y el compilador que usamos

Tamao de los datos de entrada

La implementacin que haga el programador del algoritmo


(estructuras de datos utilizadas)

E.j.: calcular la media de una matriz de NxM

Contenido de los datos de entrada:

Mejor caso: el contenido favorece una rpida ejecucin

Peor caso: la ejecucin ms lenta posible.

Caso promedio: media de todos los posibles contenidos.

Cmo saber si es el mejor algoritmo?

A posteriori (emprico) :
Implementacin del algoritmo en un computador
Se comprueba para distintos tamaos de los datos del
problema y se compara
Se pierde tiempo en caso el algoritmo sea malo.

A priori (terico):

Se determina matemticamente la cantidad de recursos


utilizados, en funcin del tamao de los datos del problema.
Anlisis independiente del computador
Un algoritmo ser mas eficiente siempre que consuma menos
recursos:
Tiempo
Espacio de memoria

Complejidad algortmica?

La eficiencia de un algoritmo puede ser cuantificada con las


siguientes medidas de complejidad:

Complejidad Temporal o Tiempo de ejecucin: Tiempo de cmputo


necesario para ejecutar algn programa.
Complejidad Espacial: Memoria que utiliza un programa para su
ejecucin

El anlisis se basa en las Complejidades Temporales: para cada


problema determinaremos una medida n (tamao de la
entrada).

Importancia de la eficiencia

Que utilidad tiene disear algoritmos eficientes si las computadoras


procesan la informacin cada vez ms rpido?
Contamos con una computadora capaz de procesar datos en 10-4 seg. En
esta computadora se ejecuta un algoritmo que lee registros de una base de
datos, dicho algoritmo tiene una complejidad exponencial 2n,

Cunto tiempo se tardar en procesar una entrada n de datos?


n

Tiempo

10

1 dcima de segundo

20

2 minutos

30

> 1 da

40

> 3 aos

50

3570 aos

100

4.019,693,684,133,150 milenios

Importancia de la eficiencia

Ahora se tiene la misma computadora capaz de procesar datos en 10-4


seg. Pero se ejecuta un algoritmo que hace el mismo trabajo antes
citado, pero este algoritmo tiene una complejidad cbica n3,

Cunto tiempo se tardar en procesar una entrada n de datos?


n

Tiempo

10

1 dcima de segundo

20

8 dcima de segundo

100

1.7 minutos

200

13.3 minutos

1000

1 da

Tiempo de ejecucin

Se mide en funcin de n: T(n) tiempo de


ejecucin Esta funcin se puede calcular
directamente sobre el cdigo:
Instrucciones1;
Para x 0 hasta n hacer
Instrucciones2;

t1
t2 * n

Demanda: T(n) = t1 + t2 * n
Generalmente los algoritmos contienen sentencias
condicionales o selectivas, por lo que hay ms de un valor
para T(n): "el peor caso, "el mejor caso" y "el caso
promedio.

Notaciones Asintticas

El tiempo de ejecucin T(n) est dado en base a unas


constantes que dependen de factores externos.
Nos interesa un anlisis que sea independiente de
esos factores
Notaciones asintticas: indica como crece T, para
valores suficientemente grandes (asintticamente) sin
considerar constantes.

O(T): orden de complejidad de T


(T): orden inferior de T, u omega de T.
(T): orden exacto de T

Orden de complejidad de f(n): O(f)


Sea el siguiente algoritmo:
PARA x 1 HASTA n HACER
PARA y 1 HASTA n HACER
PARA z 1 HASTA n HACER
PARA w 1 HASTA 3 HACER
Instrucciones;
PARA y 1 HASTA n HACER
PARA z 1 HASTA n HACER
PARA w 1 HASTA 2 HACER
Instrucciones;

g(n) = 3n3+2n2

Funciones de complejidad ms frecuentes

Funciones de complejidad ms frecuentes


O(1)

Constante

No depende del tamao del problema


Algunos algoritmos de bsqueda en Tabla
Hashing

O(log n)

Logartmica

Bsqueda binaria

O(n)

Lineal

Bsqueda lineal o secuencial, bsqueda en


texto

O(nlog n)

Casi lineal

QuickSort

O(n 2)

Cuadrtica

Algoritmo de la burbuja, QuickSort (peor caso)

O(n 3)

Cbica

Producto de matrices

O(n k) k>3

Polinmica

O(k

n)

O(n!)

k>1

Exponencial
Factorial

Eficiente

Tratable

Algunos algoritmos de grafos, muchos


problemas de optimizacin, por lo general en
fuerza bruta
Intratable
Algunos algoritmos de grafos , todas las
permutaciones

Funciones de complejidad ms frecuentes


La complejidad no polinomial (NP) o exponencial es aquella que
tiene un orden mayor que la polinomial. Ejemplo: La complejidad
exponencial O (kn).
Comparacin entre diferentes complejidades:

lg n

n lg n

n2

n3

2n

3n

n!

16

64

16

81

24

24

64

512

256

6.561

40.320

16

64

256

4.096

65.536

43.046.721

20.922.789.888.000

32

160

1.024

32.768

4.294.967.296

64

384

4.096

262.144

128

896

16.384

2.097.152

**

Propiedades de la notacin O()

Sean f(n) y g(n) un par de funciones:

Los factores constantes pueden ser ignorados:


kf(n) es O(f(n)) para cualquier K
E.j. 5n2 es O(n2)
La razn de crecimiento de una suma est dada por
el trmino cuya razn de crecimiento es mayor:
Si f es O(g) y g es O(h) entonces f es O(h)
Si f crece ms rpido que g, y g crece ms rpido
que h, entonces f crece ms rpido que h.

Propiedades de la notacin O()

Sean f(n) y g(n) un par de funciones:

Potencias mayores de n crecen ms rpido que


potencias menores:
Si Or<s, entonces nr es O(ns) y ns no es O(nr)

La razn de crecimiento de un polinomio est dado


por el trmino mayor (ignorando constantes)
si p(n) es un polinomio de grado d, entonces p(n) es
O(nd)
E.j. 5n3+2n2+3n+2, es de O(n3)

Propiedades de la notacin O()

Sean f(n) y g(n) un par de funciones:

La razn de crecimiento de un producto est dado


por la multiplicacin de la razn de crecimiento
Si f es O(n) y g es O(k), entonces fg es O(nk)
Las funciones logaritmo crecen ms lento que las
potencias
Si k > 0, entonces In n es O(nk)
Todas las funciones logaritmo crecen a la misma
razn.
Si b > 1 y c > 1. entonces logb n es O(logc n)

Reglas de notacin asinttica

Sean T1(n) y T2(n) dos funciones que expresan los tiempos de


ejecucin de dos fragmentos de un programa, y se acotan de
forma que se tiene:

Regla de la suma
T1(n) = O(f1(n)) y T2(n) = O(f2(n))
Se puede decir que:
T1(n) + T2(n) = O(max(f1(n),f2(n)))

Regla del producto


T1(n) = O(f1(n)) y T2(n) = O(f2(n))

Se puede decir que:


T1(n) T2(n) = O(f1(n) f2(n))

Por tanto.

Se puede concluir, que solo un algoritmo eficiente, con un orden


de complejidad bajo puede tratar grandes volumenes de
datos. Por tanto, un algoritmo es:

Muy eficiente si su complejidad es de orden log n

Eficiente si su complejidad es de orden nk

Ineficiente si su complejidad es de orden 2n

Algoritmos iterativos

Instrucciones secuenciales

Asignaciones y expresiones simples

Tiempo de ejecucin constante O(1).

Secuencia de instrucciones

Tiempo de ejecucin = suma de sus tiempos de


ejecucin individuales.
P.e.: Sean S1 y S2, una secuencia de dos instrucciones:
T(S1 ; S2) = T(S1) + T(S2)
Aplicando la regla de la suma:
O(T(S1 ; S2)) = max(O( T(S1), T(S2) ))

Instrucciones condicionales

SI-ENTONCES: es el tiempo necesario para evaluar la


condicin, ms el requerido para el conjunto de
instrucciones.
T(SI-ENTONCES) = T(condicin) + T(rama ENTONCES)
Aplicando la regla de la suma:
O(T(SI-ENTONCES)) = max(O( T(condicin),T(rama ENTONCES ))

Instrucciones condicionales

SI-ENTONCES-SINO: tiempo para evaluar la condicin,


ms el mximo valor del conjunto de instrucciones de
las ramas ENTONCES y SINO.
(SI-ENTONCES-SINO) = T(condicin) + max(T(rama ENTONCES),
T(rama SINO))

Aplicando la regla de la suma:


O(T(SI-ENTONCES-SINO)) = O( T(condicin)) +
max(O(T(rama ENTONCES)), O(T(rama SINO)))

Instrucciones de iteracin

PARA: es el producto del nmero de iteraciones por la


complejidad de las instrucciones del cuerpo del mismo bucle.

MIENTRAS-HACER y HACER-MIENTRAS: igual que PARA, pero


se considera la evaluacin del nmero de iteraciones para el
peor caso posible.

Si existen ciclos anidados, realizar el anlisis de adentro hacia


fuera.

Ejercicios
PROCEDIMIENTO MatrizProducto (E entero :n; E entero . A[1..n,1..n], B[1..n,1..n];
E/S entero : C[1..n,1..n])
VARIABLES
entero: i,j,k
INICIO
I5 PARA i1 HASTA n
I4
PARA i1 HASTA n
I3
C[i,j] 0;
I2
PARA k1 HASTA n
I1
C[i,j] C[i,j] +A[i,k]* B[k,j];
FIN-PARA
FIN-PARA
FIN-PARA
FIN PROCEDIMIENTO

Llamadas a procedimientos

Tiempo requerido para ejecutar el cuerpo del procedimiento llamado.

Ejemplo:
PROCEDIMIENTO PRINCIPAL (E entero: A[1..n,1..n], B[1..n,1..n]; E/S entero:
C[1..n,1..n])
VARIABLES entero: n, j, i, x
INICIO
LEER(n);
i 1;
MIENTRAS i<=n HACER
PARA ji HASTA n
A[i,j] j * 2;
FIN-PARA
ii+1
FIN-MIENTRAS
O(n3)
MatrizProducto( n,A,B,C);
FIN-PROCEDIMIENTO

Algoritmos recursivos

Costo del algoritmo?


PROCEDIMIENTO Factorial (E entero: n; E/S entero: f)
VARIABLES
entero: i
INICIO
f1
PARA i 1 HASTA n
ff*i
FIN_PARA
FIN_PROCEDIMIENTO
entero : FUNCION Factorial (E entero: n)
INICIO
SI n=0 ENTONCES
RETORNA R 1
SINO
RETORNAR (n * Factorial (n-1))
FIN_SI
FIN_FUNCION

Funcin de recurrencia

Una inspeccin al algoritmo puede resultar en un


funcin de recurrencia:
Imita el flujo de control dentro del algoritmo.
Una vez obtenida esta funcin se puede aplicar alguna
tcnica:
Recurrencias homogneas
Recurrencias no homogneas
Cambio de variables, etc.

Funcin de recurrencia

Por ejemplo:
entero : FUNCION Factorial (E entero: n)
INICIO
SI n=0 ENTONCES
RETORNA R 1
SINO
RETORNAR (n * Factorial (n-1))
FIN_SI
FIN_FUNCION
Factorial(n) =

T(n) =

1
Factorial (n-1) * n

1
T(n-1) +1

si n=0
en otro caso

si n=0
en otro caso

Funcin de
Recurrencia

Funcin de recurrencia
T(n) =

T(n)

1
T(n-1) +1

si n=0
en otro caso

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

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


= (T(n-4) +1) +3 = T(n-4) +4
...
generalizando :
= T(n-k) +k
Si k=n :
= T(n-n) +n
= 1+n = max(0(1),O(n))
= O(n)

rbol de recursin

Los rboles de recursin son una herramienta


visual para analizar el costo de procedimientos
recursivos asociados a una estructura de rbol.
Mtodo del rbol de recursin

Se construye el rbol para organizar por niveles las


operaciones algebraicas necesarias para resolver la
recurrencia.
Cada nodo del rbol tiene una estructura de dos
componentes:
la funcin de costos
y el costo no-recursivo

rbol de recursin

Casos
progresivos

Caso base

Utilizacin del rbol de recursin- Ejemplo 1

P.e.

Primero se construye el rbol de recurrencia


determinando para cada nodo la funcin de costos y el
costo no recursivo.
Para cada nivel se calcula el costo total:

1er nivel: T(n); n2


2do nivel: T(n/2); (n/2) 2
...

costo: n2
costo: 2(n/2)2 =n2/2

Utilizacin del rbol de recursin- Ejemplo 1

P.e.

Utilizacin del rbol de recursin- Ejemplo 1

En cada nivel

el nmero de subproblemas aumenta en potencias de dos:

el tamao de los problemas disminuye en potencias de dos.

la complejidad algortmica total incrementa en potencias de dos


(ltimo nivel se tienen 2m nodos y cada nodo es de tamao
(1/2m)n.

Utilizacin del rbol de recursin- Ejemplo 1

Usando el patrn de complejidad y las condiciones de


terminacin, la recurrencia se expresa como una sumatoria

El valor de m se determina igualando las dos expresiones del


caso base.

Utilizacin del rbol de recursin- Ejemplo 1

Para la solucin de T(n) se usa la serie geomtrica con r=1/2.

Por tanto, la recurrencia T(n) revela que el algoritmo tiene una


velocidad de crecimiento.. cuadrtica
1/(2logn 2 -1 = 2/n

Utilizacin del rbol de recursin- Ejemplo 2

P.e.

Utilizacin del rbol de recursin- Ejemplo 2

En cada nivel

el nmero de subproblemas aumenta en potencias de dos:

el tamao ms grande de problema disminuye por un factor de


(2/3)i:

la complejidad algortmica permanece constante:

Utilizacin del rbol de recursin- Ejemplo 2

Usando el patrn de complejidad y las condiciones de


terminacin, la recurrencia se expresa como una sumatoria

se obtiene una cota superior de las trayectorias restantes.

Utilizacin del rbol de recursin- Ejemplo 2

El valor de m se determina igualando las dos expresiones del


caso base.

Utilizacin del rbol de recursin- Ejemplo 2

Para la solucin de T(n):

S-ar putea să vă placă și