0% encontró este documento útil (0 votos)
54 vistas29 páginas

Eficiencia Algoritmos

El documento explora el uso de las matemáticas para medir la eficiencia de los algoritmos computacionales, definiendo un algoritmo como un conjunto ordenado de operaciones para resolver problemas. Se discuten áreas de estudio como la construcción, expresión, validación y análisis de algoritmos, así como la importancia de la notación asintótica para comparar su eficiencia. Se presentan ejemplos y reglas para calcular la complejidad temporal y espacial de diferentes algoritmos, incluyendo casos de recursividad y ciclos.

Cargado por

SebastianCarrion
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
54 vistas29 páginas

Eficiencia Algoritmos

El documento explora el uso de las matemáticas para medir la eficiencia de los algoritmos computacionales, definiendo un algoritmo como un conjunto ordenado de operaciones para resolver problemas. Se discuten áreas de estudio como la construcción, expresión, validación y análisis de algoritmos, así como la importancia de la notación asintótica para comparar su eficiencia. Se presentan ejemplos y reglas para calcular la complejidad temporal y espacial de diferentes algoritmos, incluyendo casos de recursividad y ciclos.

Cargado por

SebastianCarrion
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Las matemticas como

medio para medir la


eficiencia de los Algoritmos
Computacionales

Qu es un algoritmo?
(del rabe al-Khowrizm, sobrenombre
del clebre matemtico rabe Mohmed
ben Musa). Conjunto ordenado y finito de
operaciones que permite encontrar la
solucin a un problema

Un algoritmo, puede expresarse en


trminos de un lenguaje de programacin,
para obtener un programa que resuelve el
problema por medio de la computadora.

Cita...
No hay un incremento concebible en el poder de las
computadoras que pueda saturar la demanda cientfica: an
pensando que una computadora posea un ciclo de tiempo
subnuclear (10-23 seg.) y densidades de almacenamiento
subnucleares (1039 bits/cm3), sta no podra manejar la mayora
de los problemas que son importantes en la investigacin
cientfica bsica y aplicada. Por lo tanto, existir siempre una
fuerte presin para incrementar la eficiencia de los programas,
para poder incrementar tambin la cantidad de informacin
ltil generada por un programa.
Ken Wilson, Nbel de Fsica 1982

reas de estudio
Cmo construir algoritmos?
Tcnicas de diseo

Cmo expresar algoritmos?


Enfoques de los lenguajes de programacin

Cmo validar algoritmos?


Verificacin formal

Cmo analizar algoritmos?


Complejidad computacional, eficiencia, legibilidad,
usabilidad, etc...

Anlisis de algoritmos
Si se tuvieran 2 programas que hacen lo
mismo, cmo se podran comparar?
1. Eficiencia:
Tiempo de ejecucin
Uso de espacios de memoria
2. Facilidad de lectura, mantenimiento,
rapidez para codificarlo.

Medicin del tiempo de


ejecucin
El tiempo de ejecucin depende de:
1. La entrada al programa:
Su tamao
Sus caractersticas

2. La calidad del cdigo generado para el


programa por el compilador .
3. La rapidez de las instrucciones de
mquina.
4. La complejidad de tiempo del
algoritmo.

Cmo medir?
Cantidad de instrucciones bsicas (o
elementales) que se ejecutan.
Ejemplos de instrucciones bsicas:

asignacin de escalares
lectura o escritura de escalares
saltos (gotos) implcitos o explcitos.
evaluacin de condiciones
llamada a funciones
etc.

Ejemplo
cont = 1;
while (cont <= n) do {
x = x + a[cont];
x = x + b[cont];
cont = cont + 1;
}

1
n+1
n
n
n
n (goto implcito)
1 goto en falso.

Funcin: 5n + 3

Ejemplo
z = 0;
for (int x=1; x<=n; x++)
for (int y=1; y<=n; y++)
z = z + a[x,y];

1
1 asignacin + (n+1) comparaciones
(n+2)*n = n2 +2n
n*n
= n2
??? (goto implcito)
n (goto en falso for y)
n (goto implcito)
1 (goto en falso for x)
Funcin:

Consecuencia
Se requiere contar con una notacin que permita
comparar la eficiencia entre los algoritmos
La NOTACIN ASINTTICA es la propuesta de notacin
aceptada por la comunidad cientfica para describir el
comportamiento en eficiencia (o complejidad) de un
algoritmo.
Describe en forma sinttica el comportamiento de la
funcin que con la variable de entrada, determina el
nmero de operaciones que realiza el algoritmo.

NOTACIN ASINTTICA
COMPLEJIDAD TEMPORAL (y ESPACIAL).
Tiempo (o espacio) requerido por un algoritmo,
expresado en base a una funcin que depende
del tamao del problema.
COMPLEJIDAD TEMPORAL ASINTTICA (y
ESPACIAL). Comportamiento lmite conforme el
tamao del problema se incrementa. Determina
el tamao del problema que puede ser resuelto
por un algoritmo.

Definicin
Se dice que la funcin f(n) es de orden g(n)
[O(g(n))], si existen constantes positivas c y n0
tales que f(n) <= c g(n) cuando n >= n0

Ejemplos:

n+5 es O(n) pues n+5 <= 2n para toda n >= 5


(n+1)2 es O(n2) pues (n+1)2 <= 4n2 para n>= 1
(n+1)2 NO es O(n) pues para cualquier c > 1
no se cumple que (n+1)2 <= c*n

Ordenes ms comunes de los


algoritmos

O(1)
O(n)
O(n2 )
O(n3 )
O (nm )
O(log(n))
O(nlog(n))
O(mn )
O(n!)

Constante
Lineal
Cuadrtico
Cbico
Polinomial
Logartmico
nlog (n)
exponencial
factorial

Comportamiento
de las funciones
n2

n sqrt(n
n log n
n
log n

Otro mtodo para calcular el orden


de un problema
Consiste en aplicar reglas a los estatutos
estructurados:
[Link] de instrucciones
[Link] (ejemplo: if)
[Link] (ejemplo: while)
[Link]

Regla 1: Secuencia de
instrucciones
O(g
O(g11(n))
(n))
O(g
O(g22(n))
(n))

O( mayor(g1(n), g2(n), , gm(n) )

O(g
O(g33(n))
(n))

Ejemplo:
Una secuencia de 3 ciclos:

O(g
O(gmm(n))
(n))

Tendr como orden total

Ciclo 1 = O(n)
Ciclo 2 = O(log n)
Ciclo 3 = O(n2)
O(n2).

Regla 2: Decisiones

O( mayor(g1(n), g2(n)) )
O(g
O(g11(n))
(n))
O(g
O(g22(n))
(n))

Ejemplo:
Una decisin con:
Rama then = O(n log n)
Rama else = O(log n)

Tendr como orden total


O(n log n).

Regla 3: Ciclos

O( m * g(n) )
O(g(n))
O(g(n))
Se repite
m veces

Ejemplo:
Un ciclo cuya instruccin:
Tiene un O(log n)
Se repite n/2 veces

Tendr como orden total


O( n log n) = O(n log n).

Consideraciones especiales
En decisiones y ciclos anidados:
Analizar el cdigo desde la instruccin ms
interna hacia el ms externa.

Tip para los ciclos:


Normalmente cul es el orden de la
instruccin interna?
Si la variable de control se incrementa o

decrementa con un valor constante: Orden


LINEAL.
Si la variable de control se multiplica o divide por
un valor constante: Orden LOGARTIMICO.

Ejemplo: Sort por intercambio

for (int i=1; i<n; i++)


for (int j=i+1; j<=n;j++)
if (a[ j ] < a[ i ] )
intercambia(a[ i ], a[ j ]); O( 1 )

O( 1 )

Regla 2: Decisiones = mayor de las 2 ramas

Ejemplo: Sort por intercambio

Peor caso: se repite n-1 veces


for (int i=1; i<n; i++)
for (int j=i+1; j<=n;j++)
if (a[ j ] < a[ i ])
O( n )
O( 1 )
intercambia(a[ i ], a[ j ]);

Regla 3: Ciclos = # veces * orden de la instruccin interna

Ejemplo: Sort por intercambio


Se repite n-1 veces

for (int i=1; i<n; i++)


for (int j=i+1; j<=n;j++)
if (a[ j ] < a[ i ] )
O( n )
intercambia(a[ i ], a[ j ]);

O( n2 )

Regla 3: Ciclos = # veces * orden de la instruccin interna

Ejemplo: Multiplicacin de
matrices
a11 a12 a1n
a21 a22 a2n

b11 b12 b1m


b21 b22 b2m

am1 am2 amn


c11 c12 c1m
c21 c22 c2m

cm1 cm2 cmm

bn1 bn2 bnm


c11 = a11*b11+a12 *b21 ++ a1n *bn1
c12 = a11*b12+a12 *b22 ++ a1n *bn2

c21 = a21*b11+a22 *b21 ++ a2n *bn1

cmm = am1*b1m+am2 *b2m ++ amn *bnm

cij =

aikbkj
k=1

Ejemplo: Multiplicacin de
matrices
O( n3 ) for i = 1 to n do
O( n2 ) for j = 1 to n do
O( 1 ) C[i,j] = 0;
O( n ) for k = 1 to n do
O( 1 ) C[i,j] = C[i,j] +
A[i,k]*B[k,j];

Regla 4: Recursividad
La complejidad de tiempo se obtiene contando la cantidad
de veces que se hace la llamada recursiva.
Casos que normalmente se dan:
Orden LINEAL si slo se tiene una llamada recursiva,
con incrementos o decrementos en el parmetro de
control.
Orden LOGARITMICO si slo se tiene una llamada
recursiva, con multiplicaciones o divisiones en el
parmetro de control.
Si hay ms de una llamada recursiva, el orden puede
tender a ser EXPONENCIAL.

Ejemplo: Fibonacci (Iterativo)


ant = 1;
--> 1
act = 1;
--> 1
while (n>2){ --> n-2 + 1
aux = ant + act;
--> n-2
ant = act;
--> n-2
act = aux;
--> n-2
n = n - 1;
--> n-2
}
--> n-2+1
write (act);
--> 1

T(n) = 6n-7
Por lo tanto el orden
del algoritmo es
O(n)

Ejemplo: Fibonacci (recursivo)


Function fibonacci (n:int): int;
if (n < 3) return 1;
else return fibonacci(n-1) + fibonacci(n-2);
Cmo obtener la complejidad de tiempo
del algoritmo?
Cantidad de llamadas recursivas: 2 en
cada llamada.
Algoritmo de orden: O(2n/2)

Anlisis de Fibonacci
(recursivo)
f(5)
f(3)
f(1)

f(4)
f(2)

f(2)

f(3)
f(1)

Relacin:
El trmino T(n) requiere
T(n-1)+T(n-2)+1 trminos
para calcularse.

f(2)

Cuntos trminos
se requieren para
calcular:
f(5)?--> 9
f(4)?--> 5
f(3)?--> 3
--> 1
f(2)?
--> 15
f(6)?

Anlisis de Fibonacci
Si el trmino T(n) requiere T(n-1)+T(n

2)+1 trminos para calcularse


se puede decir que T(n) > 2 * T(n-2)
y por lo tanto: T(n) > 2 * 2 * T(n-4)
Por lo tanto:
y T(n) > 2 * 2 * 2 * T(n-6)
T(n) > 2n/2
y as sucesivamente hasta:
y podemos decir
que el orden del
T(n) > 2 * 2 * 2 * . * 2 * T(1)
algoritmo es
n/2

n/2 veces

O(2 )

También podría gustarte