Vous êtes sur la page 1sur 38

Anlisis y Diseo de Algoritmos

Notacin Asinttica
DR. JESS A. GONZLEZ BERNAL CIENCIAS COMPUTACIONALES INAOE

Introduccin
2

!! Por qu el anlisis de algoritmos? !! Determinar tiempos de respuesta (runtime) !! Determinar recursos computacionales !! Aproximacin terica !! Generaliza el nmero de operaciones que requiere un algoritmo para encontrar la solucin a un problema

Introduccin
3

!! Ventajas !! Eleccin de algoritmos eficientes para resolver problemas especficos !! No depende de lenguajes de programacin ni de hardware !! Desventajas !! Para muchos casos, en anlisis no es trivial

Introduccin
4

!! Para realizar el anlisis de un algoritmo, es necesario: !! Conocer la complejidad del problema que resuelve el algoritmo !! Conocer la dimensin de la entrada (nmero de elementos) !! Determinar el nmero de operaciones a realizar !! La complejidad de un algoritmo se representa a travs

de una funcin matemtica


Polinomios !! Logaritmos !! Exponentes
!!

Introduccin
5

!! Funciones !! f(n) = cn (algoritmos lineales) !! f(n) = cn2 (algoritmos cuadrticos) !! f(n) = cn3 (algoritmos cbicos) !! Un algoritmo puede estar compuesto de dos o ms

operaciones, por lo que determinar la complejidad depende de identificar la operacin ms costosa en el algoritmo
!!

Por ejemplo, sume 2 matrices e imprima el resultado. de que orden es el problema?

Principio de Invarianza
6

!! A travs de un anlisis terico, se pueden obtener

funciones que representen el nmero de operaciones, independientemente de cmo se implementaron !! Anlisis Principio de la Invarianza
!!

Dos implementaciones distintas de un mismo algoritmo no van a diferir en su eficiencia en ms de una constante multiplicativa c

Anlisis Peor Caso Caso Promedio - Mejor Caso


7

!! El tiempo que requiere un algoritmo para dar una

respuesta, se divide generalmente en 3 casos


Peor Caso: caso ms extremo, donde se considera el tiempo mximo para solucionar un problema !! Caso promedio: caso en el cual, bajo ciertas restricciones, se realiza un anlisis del algoritmo !! Mejor caso: caso ideal en el cual el algoritmo tomar el menor tiempo para dar una respuesta
!!

!! Por ejemplo, Cul es el peor y mejor caso de el

algoritmo de ordenamiento burbuja?

Operacin Elemental (OE)


8

!! Es aquella operacin cuyo tiempo de ejecucin se

puede acotar superiormente por una constante que solamente depender de la implementacin particular usada
No depende de parmetros !! No depende de la dimensin de los datos de entrada
!!

Crecimiento de Funciones
9

!! Orden de crecimiento de funciones !! Caracteriza eficiencia de algoritmos !! Permite comparar performance relativo de algoritmos !! Es posible en ocasiones calcular el tiempo de

ejecucin exacto
No siempre vale la pena el esfuerzo !! Las constantes y trminos de orden ms bajo son dominados por los efectos del tamao de la entrada
!!

Crecimiento de Funciones
10

!! Diccionario de la Real Academia Espaola !! Asinttico, ca (De asntota).


"! Adj.

Geom. Dicho de una curva: Que se acerca de continuo a una recta o a otra curva sin llegar nunca a encontrarla.

Crecimiento de Funciones
11

! Eficiencia Asinttica de Algoritmos ! Cuando el tamao de la entrada es suficientemente grande que slo el orden de crecimiento del tiempo de ejecucin es relevante. ! Slo importa cmo incrementa el tiempo de ejecucin con el tamao de la entrada en el lmite
!

El tamao de la entrada incrementa sin frontera

! Usualmente el algoritmo asintticamente ms

eficiente es la mejor opcin, excepto para entradas muy pequeas

Notacin Asinttica
12

!! Eficiencia Asinttica !! Orden de crecimiento del algoritmo conforme el tamao de la entrada se acerca al lmite (incrementa sin frontera) !! Para determinar la complejidad de un algoritmo, se

siguen los siguientes pasos:


Se analiza el algoritmo para determinar una funcin que represente el nmero de operaciones a realizar por el mismo !! Se define el orden de la funcin en trminos de funciones matemticas, !! Se clasifica de acuerdo a su complejidad
!!

Notacin O
13

!! f(n) = O(g(n)), g(n) es una cota superior de f(n) !! Dada una funcin g(n), denotamos como O(g(n)) al

conjunto de funciones tales que:


O(g(n)) = {f:N"R+ | ! c constante positiva y no" N : f(n) ! cg(n), # n " n0}

Propiedades de O
14

1.! 2.! 3.! 4.! 5.! 6.! 7.! 8.!


a)! b)!

Para cualquier funcin de f se tiene que f " O(f). f " O(g) $ O(f) % O(g). O(f) = O(g) & f " O(g) y g " O(f). Si f " O(g) y g " O(h) $ f " O(h). Si f " O(g) y f " O(h) $ f " O(min(g,h)) . Regla de la suma: Si f1 " O(g) y f2 " O(h) $ f1 + f2 " O(max(g,h)). Regla del producto: Si f1 " O(g) y f2 " O(h) $ f1 f2 " O(g h) . Si existe lim n "! Si k ' 0 y k < ( entonces O(f) = O(g).
f ( n) = k , dependiendo del valor de k obtenemos: g ( n)

Si k = 0 entonces f " O(g), es decir, O(f) % O(g), pero sin embargo se verifica que g ) O(f).

Notacin Omega: !
15

!! f(n) = !(g(n)), g(n) es una cota asinttica inferior de

f(n) !! Dada una funcin g(n), denotamos al conjunto de funciones !(g(n)) de la siguiente forma:

!(g(n)) = {f:N"R+ | ! c constante positiva y n0: 0 < cg(n) ! f(n), # n " n0}

NOTA: f(n) " ! (g(n)) s y solo si g(n) " O(f(n))

Propiedades de Omega
16

1.! 2.! 3.! 4.! 5.! 6.! 7.! 8.!


a)! b)!

Para cualquier funcin de f se tiene que f " *(f). f " *(g) $ *(f) % *(g). *(f) = *(g) & f " *(g) y g " *(f). Si f " *(g) y g " *(h) $ f " *(h). Si f " *(g) y f " *(h) $ f " *(max(g,h)) . Regla de la suma: Si f1 " *(g) y f2 " *(h) $ f1 + f2 " *(g + h). Regla del producto: Si f1 " *(g) y f2 " *(h) $ f1 f2 " *(g h) . Si existe lim n "!
f ( n) = k , dependiendo del valor de k obtenemos: g ( n) Si k ' 0 y k < ( entonces *(f) = *(g).

Si k = 0 entonces g " *(f), es decir, *(g) % *(f), pero sin embargo se verifica que f ) *(g).

Notacin Theta: "


17

!! f(n) = " (g(n)), c2g(n) y c1g(n) son las cotas asintticas

de f(n) tanto superior como inferior respectivamente !! Diremos que f(n) " " (g(n)) si f(n) pertenece tanto a O(g(n)) como a ! (g(n))

"(g(n)) = {f:N"R+ | !c1,c2 constantes positivas, n0: 0 < c1g(n) ! f(n) ! c2g(n), # n " n0}

Propiedades de Theta
18

1.! 2.! 3.! 4.! 5.! 6.! 7.!


a)! b)!

Para cualquier funcin f se tiene que f " +(f). f " +(g) $ +(f) % +(g). +(f) = +(g) & f " +(g) y g " +(f). Si f " +(g) y g " +(h) $ f " +(h). Regla de la suma: Si f1 " +(g) y f2 " +(h) $ f1 + f2 " +(max(g,h)). Regla del producto: Si f1 " +(g) y f2 " +(h) $ f1 f2 " +(g h) . Si existe lim n "! Si k ' 0 y k < ( entonces +(f) = +(g).
f ( n) = k , dependiendo del valor de k obtenemos: g ( n)

Si k = 0 entonces los rdenes exactos de f y g son distintos.

Notacin Theta
19

!! Teorema 2.1 !! f(n) = " (g(n)) s y solo si f(n) = O(g(n)) y f(n) = ! (g(n)).

Ejemplo Theta (1/3)


20

!! Considere la funcin f(n) = # n2 3n !! Debido a que f(n) es un polinomio cuadrtico, se deduce que su estructura general tiene la forma an2 + bn + c !! Para n muy grande, an2 domina al resto de la ecuacin !! Por tanto, se propone una g(n) = n2 de tal forma que se demostrar si f(n) " " (n2)

Ejemplo Theta (2/3)


21

!! Para demostrarlo, se debe apelar a la definicin de

":

" (n2) = {f(n) | !c1,c2 constantes positivas, n0: 0 < c1n2 ! f(n) ! c2 n2, # n " n0}, donde f (n) = # n2 3n
"! Se

0 < c1n2 ! # n2 3n ! c2 n2 "! 0 < c1 ! # 3/n ! c2


"! Esta
"! c1

deben encontrar c1, c2 y n0 para los cuales se cumple ecuacin se analiza por casos:

! # 3/n "! # 3/n ! c2

Ejemplo Theta (3/3)


22

!!
!!

Para el caso c1 ! # 3/n


$!

Como c1 es constante positiva, entonces


0 < # - 3/n n>6

!!

Por tanto, si n0 = 7, entonces c1 ! # 3/7, lo que es igual a c1 ! 1/14. Sea c1 = 1/14

!! !!

Para el caso # 3/n ! c2, cuando n " ( entonces # 3/n " #. Por tanto, c2 = 1/2 Para c1 = 1/14, c2 = # y n0 = 7 se cumple que f (n) " " (n2)

Ejemplo O (1/2)
23

!! Considere la funcin f(n) = 2n2 + 3n + 1 !! Debido a que f(n) es un polinomio cuadrtico, se deduce que su estructura general tiene la forma an2 + bn + c !! Para n muy grande, an2 domina al resto de la ecuacin !! Por tanto, se propone una g(n) = n2 de tal forma que se demostrar si f(n) " O(n2)

Ejemplo O (2/2)
24

!! Para demostrarlo, se debe apelar a la definicin de O:


O(n2) = {f(n) | ! c constante positiva, n0: 0 < f(n) ! c n2, # n " n0}, donde f(n) = 2n2 + 3n + 1
"! Se

0 < 2n2 + 3n + 1 ! c n2 "! 0 < 2 + 3/n + 1/n2 ! c Notemos que si n " (, 2 + 3/n + 1/n2 " 2 Si n = 1 entonces 2 + 3/n + 1/n2 = 6 Por tanto, para c = 6 y n0 = 1, se demuestra que f(n) " O(n2)

deben encontrar c y n0 para los cuales se cumple

Notacin o
25

!! f(n) = o(g(n)), g(n) es una cota superior de f(n) que

no es asintticamente justa (tight)

Notacin #
26

!! f(n) = #(g(n)), g(n) es una cota inferior de f(n) que

no es asintticamente justa (tight)

Orden de Complejidad
27

!! La familia O(f(n)),

de complejidad
!!

! (f(n)), " (f(n)) define un orden

Se elige como representante del orden de complejidad a la funcin f(n) ms sencilla de la familia

!! Se identifican diferentes familias de orden de

complejidad

Orden de Complejidad
28

!! O(c) : Orden constante !! O(log n): orden logartmico !! O(n): orden lineal !! O(n log n): orden casi lineal !! O(n2): Orden cuadrtico !! O(n3): Orden cbico !! O(nc): Orden polinmico de grado c !! O(2n): Orden exponencial !! O(n!): Orden factorial

Orden de Complejidad
29

140 120 100 80 60 40 20 0 1 2 3 4 5 6 7 8 9 10 Constante Log Lineal Casi lineal Cuadrtico Cbico Potencia Factorial

Consejos
30

!! Consejos para Identificar f(n) que Represente el

Nmero de Operaciones Elementales (OE) de un Algoritmo

Consejo 1
31

!! Se asume que el tiempo de una OE es de orden 1 !! La constante c del principio de la invarianza se asume, por fines prcticos, como 1 !! El tiempo de ejecucin de una secuencia de

instrucciones (elementales o no elementales), se obtiene sumando los tiempos de ejecucin de cada instruccin

Consejo Instruccin case


32

!! El tiempo de ejecucin de una instruccin switch(n)

case 1: S1, , case k: Sk es:


f(n) = f(c) + max{f(S1), , f(Sk)}
!!

f(c) considera el tiempo de comparacin de n con cada uno de los casos case 1 case k

Consejo Instruccin if
33

!! El tiempo de ejecucin de una instruccin if C then

S1 else S2 es:
f(n) = f(C) + max{f(S1), f(S2)}

if (n == 0)
for (i = 0; i<n; i++) r += i;

else
r = 2;

Consejo Instruccin while


34

!! Tiempo de ejecucin de la instruccin:


while (c) { S }

es definido por: f(n) = f(c) + (#iteraciones)*(f(c)+f(s))

!! Nota: las instrucciones for, repeat, loop son

equivalentes a una instruccin while

Consejo Instruccin while


35

for (i = 0; i <= n; i++) { S; }

i = 1; while (i <= n) { S; i++; }

Consejo Llamado a Funciones NO Recursivas


36

!! El tiempo de ejecucin de una llamada a una funcin

F (A1, , As) es:


1, por el llamado a la funcin, ms !! Tiempo de evaluacin de los parmetros A1, , As !! Tiempo de ejecucin de la funcin (s)
!!

f(A1, , As) = 1 + f(A1) + + f(As) + f(s)

Consejo para Funciones Recursivas


37

!! El tiempo de ejecucin de una funcin recursiva se

calcula a travs de la solucin de funciones de recurrencia (siguiente tema)

Tarea
38

!! Ejercicios 2.1-3, 2.2-2 (del Cormen, Leiserson,

Rivest, Stein) !! Cules de las siguientes afirmaciones es cierta?


n2 " O(n3) !! 2n+1 " O(2n) !! n2 " !(n3)
!!

Vous aimerez peut-être aussi