Está en la página 1de 46

Tema 3: Complejidad

Estructura de Datos

ndice
3.1 Complejidad computacional y asinttica
3.2 Ejemplos de complejidad asinttica
3.3 La notacin O
3.4 Anlisis del caso mejor, peor y medio

Estructura de Datos

Complejidad computacional y
asinttica

Entrada

Algoritmo

Estructura de Datos

Salida

Complejidad computacional y
asinttica

Para resolver un problema suele ser habitual disponer de


varios algoritmos.
Ejemplo: para obtener el m.c.d. de dos nmeros se puede:

Clculo de divisores
Descomponer en factores primos
Utilizar el Algoritmo de Euclides

El objetivo es elegir el algoritmo ms eficiente de ellos

Estructura de Datos

Complejidad computacional y
asinttica

Regla: La eleccin del algoritmo nunca debera afectar a la


correccin de la solucin ni a la claridad (evitar algoritmos
incomprensibles).
Excepcin: A veces se eligen algoritmos aproximados o
heursticos porque la solucin correcta resulta inmanejable.
No alcanzan la solucin ptima pero s a una solucin
aceptable.

Ejemplos:

Algoritmo aproximado: Clculo de la raz cuadrada


Heurstica: Problema del viajante

Mito:

La capacidad de computacin es ilimitada, por qu preocuparse


de la eficiencia si siempre podemos encontrar un sistema ms
potente?
Adems est la Ley de Moore

Estructura de Datos

Complejidad computacional y
asinttica

Para comparar algoritmos se puede utilizar una medida del


grado de dificultad del algoritmo: la complejidad
computacional

COMPLEJIDAD COMPUTACIONAL
Indica el esfuerzo que hay que realizar para aplicar un
algoritmo y lo costoso que ste resulta.
Dicho coste que se puede medir de diversas formas (espacio,
tiempo...)

Estructura de Datos

Complejidad computacional y
asinttica
Un algoritmo es ms eficiente cuanto menos complejo
sea
La eficiencia suele medirse en trminos de consumo de
recursos:
Espaciales: cantidad de memoria que un algoritmo consume o
utiliza durante su ejecucin Complejidad espacial
Temporales: tiempo que necesita el algoritmo para ejecutarse
Complejidad temporal
Otros: utilizacin de CPU, utilizacin de perifricos, tiempo y
coste de implementacin...

Estructura de Datos

Complejidad computacional y
asinttica
Objetivo: encontrar algoritmos con la menor
complejidad espacial y temporal
Menor complejidad espacial suele implicar mayor
complejidad temporal

Nos centraremos en complejidad temporal por


ser el recurso ms crtico

Estructura de Datos

Complejidad computacional y
asinttica
Factores que influyen en la complejidad
Tamao del problema
Naturaleza de los datos de entrada
Recursos hardware y software

Estructura de Datos

Complejidad computacional y
asinttica
Factores que influyen en la complejidad
Tamao del problema: magnitud(es) que al
aumentar incrementan la complejidad del algoritmo.
Ejemplos:
Ordenacin de un vector: nmero de elementos
Factorizar un nmero en sus factores primos: valor del
nmero

Estructura de Datos

10

Complejidad computacional y
asinttica
Factores que influyen en la complejidad
Naturaleza de los datos de entrada: en funcin de
cules sean los datos del problema se ejecutarn o
no determinadas instrucciones de decisin y ser
distinto el nmero de iteraciones de los bucles el
problema se resolver en ms o en menos tiempo.
Ejemplo:
buscar en un vector el valor que est almacenado en la primera
celda resulta trivial en la bsqueda lineal.

Estructura de Datos

11

Complejidad computacional y
asinttica
Factores que influyen en la complejidad
Naturaleza de los datos de
entrada:

Caso peor: los datos de


entrada consumen el mximo
(cota superior).
Caso promedio: los datos
se distribuyen de forma
aleatoria. Difcil de calcular.

120

Tiempo de ejecucin

Caso mejor: los datos de


entrada consumen el mnimo

caso mejor
caso medio
caso peor
100
80
60
40
20
0

1000

2000

3000

4000

Tamao de Entrada

Estructura de Datos

12

Complejidad computacional y
asinttica
Enfoques para medir la complejidad de un
algoritmo:
Enfoque empricos o a posteriori
Enfoque terico o a priori.

Estructura de Datos

13

Complejidad computacional y
asinttica
Enfoque empricos o a posteriori
9000
8000
7000

Tiempo (ms)

1. Escribir un programa que


implemente el algoritmo, por
ejemplo en Java.
2. Ejecutar el programa con
entradas de tamao y
composicin variadas
3. Usar un mtodo como
System.currentTimeMillis()
para obtener una medida
exacta del tiempo de
ejecucin real
4. Trazar los resultados

6000
5000
4000
3000
2000
1000
0
0

Estructura de Datos

50

Tamao Entrada

100

14

Complejidad computacional y
asinttica

Enfoque tericos o a priori

1.

Utilizar una descripcin de alto nivel del algoritmo (v.g. en


pseudocdigo)

2.

Determinar, matemticamente, la cantidad de recursos


necesarios para ejecutar el algoritmo

3.

Obtener una funcin genrica f(n) que permita hacer


predicciones sobre la utilizacin de recursos, siendo n el tamao
del problema

Estructura de Datos

15

Complejidad computacional y
asinttica

Ventajas e inconvenientes

1.

El estudio a posteriori requiere la implementacin del algoritmo


(mayor coste). El estudio a priori solo requiere de una descripcin de
alto nivel (pseudocdigo).
En el estudio a posteriori no tenemos la seguridad de los recursos
que realmente se van a consumir si varan las entradas. El estudio a
priori es independiente de los datos de entrada.
En el estudio a posteriori, los resultados slo sern vlidos para
unas determinadas condiciones de ejecucin. Es difcil extrapolar los
resultados si se producen cambios en el hardware, sistema
operativo, lenguaje utilizado, etc. El estudio a priori es independiente
de las condiciones de ejecucin.
El estudio a posteriori permite hacer una evaluacin experimental de
los recursos consumidos que no es posible en el estudio a priori.

2.
3.

4.

Estructura de Datos

16

Complejidad computacional y
asinttica
Principio de invarianza:
Dos implementaciones de un mismo algoritmo no diferirn ms que en
una constante multiplicativa.
Si f1(n) y f2(n) son los tiempos consumidos por dos implementaciones de
un mismo algoritmo, se verifica que:
c, d R,
f1(n) cf2(n)
f2(n) df1(n)

El estudio a posteriori trata con programas. El estudio a priori


trata con algoritmos

Es preferible el estudio a priori

Estructura de Datos

17

Complejidad computacional y
asinttica
COMPLEJIDAD ASINTTICA
Consiste en el clculo de la complejidad temporal a
priori de un algoritmo en funcin del tamao del
problema, n, prescindiendo de factores constantes
multiplicativos y suponiendo valores de n muy
grandes
No sirve para establecer el tiempo exacto de
ejecucin, sino que permite especificar una cota
(inferior, superior o ambas) para el tiempo de
ejecucin de un algoritmo
Estructura de Datos

18

Ejemplos de complejidad asinttica

Ejemplo en pseudocdigo:
Buscar el mximo valor de un array
maximoArray(A)mximo
Entrada A array de n enteros
Salida elemento mximo de A
INICIO
maxActual A[0]
PARA i 1 HASTA n 1 HACER
SI A[i] maxActual
ENTONCES maxActual A[i]
DEVOLVER maxActual
FIN

Estructura de Datos

19

Ejemplos de complejidad asinttica

Ejemplo en pseudocdigo: Operaciones


primitivas

Cmputos bsicos realizados por


un algoritmo
Identificables en pseudocdigo
Muy independiente del lenguaje de
programacin
La definicin exacta no es
importante

Estructura de Datos

Ejemplos:
Evaluar una
expresin
Asignar un valor a
una variable
Indexar un array
Llamar a un
mtodo
Retornar un valor

20

Ejemplos de complejidad asinttica

Revisando el pseudocdigo, se puede estipular el


nmero mximo de operaciones primitivas ejecutadas por
un algoritmo, como una funcin del tamao de la entrada
maximoArray(A)
INICIO
maxActual A[0]
PARA i 1 HASTA n 1 HACER
SI A[i] maxActual
ENTONCES maxActual A[i]
{ incrementar contador i }
DEVOLVER maxActual

operaciones
2
2+n
2(n 1)
2(n 1)
2(n 1)
1

FIN
Total

Estructura de Datos

7n 1

21

Ejemplos de complejidad asinttica


El algoritmo maximoArray ejecuta 7n 1
operaciones primitivas en el peor de los casos
Se definen:
a Tiempo tardado por la op. primitiva ms rpida
b Tiempo tardado por la op. primitiva ms lenta
Sea T(n) el tiempo de ejecucin real para el peor de
los casos de maximoArray . Entonces:
a (7n 1) T(n) b(7n 1)
Por lo tanto, el tiempo de ejecucin T(n) est
acotado por dos funciones lineales
Estructura de Datos

22

Ejemplos de complejidad asinttica


Un cambio en el entorno hardware/software
Afecta a T(n) en un factor constante, pero
No altera la tasa de crecimiento de T(n)
La tasa de crecimiento lineal del tiempo de
ejecucin T(n) es una propiedad intrnseca del
algoritmo maximoArray

Estructura de Datos

23

Ejemplos de complejidad asinttica


Tasa de
crecimiento:

En un diagrama
logartmico, la
pendiente de la
lnea corresponde a
la tasa de
crecimiento de la
funcin
Estructura de Datos

T (n )

Lineal n
Cuadrtica n2
Cbica n3

1E+30
1E+28
1E+26
1E+24
1E+22
1E+20
1E+18
1E+16
1E+14
1E+12
1E+10
1E+8
1E+6
1E+4
1E+2
1E+0
1E+0

Cbica
Cuadrtica
Lineal

1E+2

1E+4

1E+6

1E+8

1E+10

24

Ejemplos de complejidad asinttica

factores constantes
trminos de orden
menor

T (n )

La tasa de
crecimiento no se
ve afectada por:

Ejemplos
102n + 105 es una
funcin lineal
105n2 + 108n es una
funcin cuadrtica

1E+26
1E+24
1E+22
1E+20
1E+18
1E+16
1E+14
1E+12
1E+10
1E+8
1E+6
1E+4
1E+2
1E+0
1E+0

Cuadrtica
Cuadrtica
Lineal
Lineal

1E+2

1E+4

1E+6

1E+8

1E+10

Estructura de Datos

25

La notacin O
Dadas las funciones f(n)
y g(n), se dice que f(n)
es O(g(n)) si existen
constantes positivas
c y n0 tales que
f(n) cg(n) para n n0
Ejemplo: 2n + 10 es O(n)
2n + 10 cn
(c 2) n 10
n 10/(c 2)
Elegir c = 3 y n0 = 10

Estructura de Datos

10,000
3n
2n+10

1,000

100

10

1
1

10

100

1,000

26

La notacin O
Ejemplo:
5n3 + 3n2 +1 O(n3)
tomando n0= 3, c= 6 tenemos que:
5n3 + 3n2 +1 6n3
Nota: Tambin pertenecera a O(n4), pero no a O(n2).

Estructura de Datos

27

La notacin O
Existen diferentes notaciones para la complejidad
asinttica
Una de ellas es la notacin O, que permite especificar
la cota superior de la ejecucin de un algoritmo
La sentencia f(n) es O(g(n)) significa que la tasa de
crecimiento de f(n) no es mayor que la tasa de
crecimiento de g(n)
La notacin O sirve para clasificar las funciones de
acuerdo con su tasa de crecimiento

Estructura de Datos

28

La notacin O
Ejemplo: la funcin n2 1,000,000
no es O(n)
n2 cn
nc
La desigualdad
anterior no puede
satisfacerse porque c
debe ser una
constante

n^2
100n

100,000

10n
n

10,000
1,000
100
10
1
1

Estructura de Datos

10

100

1,000

29

La notacin O
La notacin O proporciona una cota superior para la
tasa de crecimiento de una funcin

f(n) es O(g(n))

g(n) es O(f(n))

g(n) crece ms

No

f(n) crece ms

No

Igual crecimiento

Estructura de Datos

30

La notacin O
Sea {g(n)} la clase (conjunto) de funciones que son
O(g(n))
Se tiene:
{n} {n2} {n3} {n4} {n5}
donde la inclusin es estricta

{n3}
{n2}
{n}
Estructura de Datos

31

La notacin O

Propiedades de O(f(n)):
Reflexiva: f(n)O(f(n))
Transitiva: si f(n) O(g(n)) y g(n) O(h(n)),
entonces f(n) O(h(n))
Eliminacin de constantes: O(cf(n)) = O(f(n)),
para todo c.
O(logan) = O(logbn), para todo a y b.
Suma de rdenes: O(f(n)+g(n)) =
O(max(f(n),g(n))
Producto de rdenes: O(f(n))O(g(n)) = O(f(n)
g(n))

Estructura de Datos

32

La notacin O

Jerarqua de rdenes de complejidad

O(1)

Constante

No depende del tamao del


problema

O(log n)

Logartmica

Bsqueda binaria

O(n)

Lineal

Bsqueda lineal

O(nlog n)

Casi lineal

Quick-sort

O(n2)

Cuadrtica

Algoritmo de la burbuja

O(n3)

Cbica

Producto de matrices

O(nk) k>3

Polinmica

O(kn) k>1

Exponencial

O(n!)

Factorial

Estructura de Datos

Algunos algoritmos de
grafos

Eficiente

Tratable

Intratable

33

La notacin O
Jerarqua de rdenes de complejidad
1E+30
1E+27
1E+24
1E+21

T (n )

1E+18

Cbica
Cuadrtica
Lineal

1E+15
1E+12
1E+9
1E+6
1E+3
1E+0
1E+0

1E+2

1E+4

1E+6

1E+8

1E+10

Estructura de Datos

34

La notacin O

Cambios en el entorno HW o SW afectan a factores


constantes (principio de invarianza) pero no al orden
de complejidad O(f(n))
Hay que buscar algoritmos con el menor orden de
complejidad
La eficiencia es un trmino relativo que depende del
problema
El anlisis de la eficiencia es asinttico slo es
vlido para tamaos de problema suficientemente
grandes

Estructura de Datos

35

La notacin O
El anlisis asinttico de algoritmos determina el tiempo
de ejecucin en notacin O
Para realizar el anlisis asinttico
Buscar el nmero de operaciones primitivas ejecutadas en el
peor de los casos como una funcin del tamao de la entrada
Expresar esta funcin con la notacin O

Ejemplo:
Se sabe que el algoritmo maximoArray ejecuta como mucho
7n 1 operaciones primitivas
Se dice que maximoArray ejecuta en un tiempo O(n)

Como se prescinde de los factores constantes y de los


trminos de orden menor, se puede hacer caso omiso
de ellos al contar las operaciones primitivas

Estructura de Datos

36

La notacin O

Reglas:

Si f(n) es un polinomio de grado d, entonces f(n) es


O(nd), es decir,
1. Prescindir de los trminos de orden menor
2. Prescindir de los factores constantes

Usar la clase ms pequea posible de funciones


Decir 2n es O(n) en vez de 2n es O(n2)

Usar la expresin ms simple para la clase


Decir 3n + 5 es O(n) en vez de 3n + 5 es O(3n)

Estructura de Datos

37

La notacin O

Reglas prcticas:

Operaciones primitivas: O(1)

Secuencia de instrucciones: mximo de la complejidad de


cada instruccin (regla de la suma)

Condiciones simples: Tiempo necesario para evaluar la


condicin ms el requerido para ejecutar la consecuencia
(peor caso).

Condiciones alternativas: Tiempo necesario para evaluar la


condicin ms el requerido para ejecutar el mayor de los
tiempos de las consecuencias (peor caso).

Estructura de Datos

38

La notacin O

Reglas prcticas:

Bucle con iteraciones fijas: multiplicar el nmero de


iteraciones por la complejidad del cuerpo (regla del
producto).

Bucle con iteraciones variables: Igual pero ponindose


en el peor caso (ejecutar el mayor nmero de iteraciones
posible).

Llamadas a subprogramas, funciones o mtodos: Tiempo


de evaluacin de cada parmetro ms el tiempo de
ejecucin del cuerpo.

Estructura de Datos

39

La notacin O
Ejemplo de anlisis asinttico para
dos algoritmos de clculo de medias
prefijas

La media prefija i-sima


de un array X es la media
de los primeros (i + 1)
elementos de X
A[i] = X[0] + X[1] + + X[i]/
(i+1)

35

X
A

30
25
20
15
10
5

Computar el array A de medias


prefijas de otro array X tiene
aplicaciones en anlisis financiero

Estructura de Datos

0
1

2 3

5 6

40

La notacin O
Medias prefijas (Cuadrtico)
mediasPrefijas1(vector,n) vector
INICIO
A nuevo Array de n enteros
i0
MIENTRAS (i < n)
s X[0]
j1
MIENTRAS (j <= i)
s s + X[j]
jj+1
FIN-MIENTRAS
A[i] s / (i + 1)
ii+1
FIN-MIENTRAS
DEVOLVER A
FIN

OPERACIONES
n
1
n+1
n
n
1,2,3,4,,n
1,2,3,,n-1
1,2,3,,n-1
n
n
n
1

Tiempo de ejecucin = O(7n +3 + (n +1)n/2 + 2(n-1+1)n/2) O(n2)


Estructura de Datos

41

La notacin O
Medias prefijas (Lineal)
mediasPrefijas2(vector,n) vector
INICIO
A nuevo Array de n enteros
s0
i0
MIENTRAS (i < n)
s s + X[j]
A[i] s / (i + 1)
ii+1
FIN-MIENTRAS
DEVOLVER A
FIN

OPERACIONES
n
1
1
n+1
n
n
n
n
1

Tiempo de ejecucin = O(n)

Estructura de Datos

42

Anlisis del caso mejor, peor y medio

El tiempo de ejecucin de un algoritmo puede variar


con los datos de entrada.
Ejemplo (ordenacin por insercin): :
INICIO
i1
MIENTRAS (i < n)
x T[i]
ji-1
MIENTRAS (j > 0 Y T[j] > x)
T[j+1] T[j]
jj-1
FIN-MIENTRAS
T[j+1] x
ii+1
FIN-MIENTRAS
FIN

Estructura de Datos

43

Anlisis del caso mejor, peor y medio

Si el vector est completamente ordenado (mejor


caso) el segundo bucle no realiza ninguna
iteracin Complejidad O(n).

Estructura de Datos

44

Anlisis del caso mejor, peor y medio

Si el vector est ordenado de forma decreciente,


el peor caso se produce cuando x es menor que
T[j] para todo j entre 1 e i -1.
En esta situacin la salida del bucle se
produce cuando j = 0.
En este caso, el algoritmo realiza i 1
comparaciones.
Esto ser cierto para todo valor de i entre 1
y n -1 si el orden es decreciente.
El nmero total de comparaciones ser:

Estructura de Datos

45

Anlisis del caso mejor, peor y medio

La complejidad en el caso promedio estar entre


O(n) y O(n2).

Para hallarla habra que calcular


matemticamente la complejidad de todas las
permutaciones de todos valores que se
pueden almacenar en el vector.

Se puede demostrar que es O(n2).

Estructura de Datos

46

También podría gustarte