Sunteți pe pagina 1din 39

Análisis de Algoritmos

Jhonny Felípez Andrade

jrfelizamigo@yahoo.es
Contenido

 Consideraciones.
 Complejidad algorítmica.
 Análisis teórico.
 Ejemplos

2
CONSIDERACIONES

3
Pregunta

¿Dado un problema será


posible encontrar más de
un algoritmo que sea
correcto?

4
Algoritmo de Fibonacci
int fibonacci(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
a = 0; b = 1;
while (n >= 2) {
c = a + b;
a = b; b = c;
n = n - 1;
}
return c;
}

5
Pregunta

¿Cómo determinar si un
algoritmo es mejor que otro?

6
Algunas respuestas
 Fácil de implementar.
 Fácil de entender.
 Fácil de modificar.
 Utiliza menos memoria.
 Utiliza menos tiempo de ejecución.

7
De lo anterior se ocupa el:

Análisis de la
complejidad de
algoritmos

8
COMPLEJIDAD ALGORÍTMICA

9
Pregunta

¿Qué es la complejidad
algorítmica?

10
Complejidad de Algoritmos

Es obtener una medida de la cantidad


de recursos (espacio o tiempo) que
consume determinado algoritmo al
resolver un problema.

11
Complejidad de Algoritmos

Tiempo Espacio

Tiempo Espacio
12
Complejidad de Algoritmos.
Cont.
Existe la complejidad :
 Temporal: Toma en cuenta el tiempo de
ejecución.
 Espacial: Toma en cuenta el espacio de
memoria ocupada (no se verá en la
materia).

13
Complejidad de Algoritmos.
Cont.
Se tiene dos métodos para obtener la
complejidad algorítmica.

 Estimación teórica o a priori.

 Verificación empírica o a posteriori.

14
Complejidad de Algoritmos.
Cont.
El método teórico también denominado a
priori, consiste en determinar
matemáticamente la cantidad de
recursos necesitados por cada algoritmo
como una función cuya variable
independiente es el tamaño de los datos
del problema.

15
Complejidad de Algoritmos.
Cont.
El método empírico también denominado
a posteriori, consiste en implementar en
un computador los algoritmos a
comparar, se prueban para distintos
tamaños de los datos del problema y se
comparan.

16
ESTIMACIÓN TEÓRICA

17
Preguntas

Suponiendo que se tiene la siguiente


instrucción:

x=x+1

1. ¿Cuánto tiempo tarda en


ejecutarse esta instrucción?
2. ¿Cuál es el número de veces que
ésta instrucción se ejecuta?
18
Respuesta 1

Es imposible determinar
exactamente cuanto
tarda en ejecutar una
instrucción

19
Respuesta 1

A menos que se tenga la siguiente


información:
 Características de la máquina.
 Conjunto de instrucciones de la maquina.
 Tiempo que tarda una instrucción de
maquina.
 Compilador utilizado.

20
Lo anterior es difícil si se
elige una maquina real!.

21
Respuesta 2

La respuesta a la segunda pregunta


se conoce como frecuencia de
ejecución.

22
Respuesta 2

Las consideraciones
anteriores nos limitan a
obtener solamente la
frecuencia de ejecución de
todas las instrucciones para
un análisis a priori.

23
Análisis a Priori

EJEMPLOS

24
Ejemplo 1

.
.
x=x+1
.
.

La cantidad de frecuencia es uno

25
Ejemplo 2

for i = 1 to n do
x=x+1
end

La misma sentencia será ejecutada n


veces en el programa.

26
Ejemplo 3

for i = 1 to n do
for j = 1 to n do
x=x+1
end
end

n2 veces (asumiendo n  1)

27
Ejemplo 4

Calcular el número n-ésimo de Fibonacci.


La secuencia Fibonacci comienza como
sigue
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
Cada nuevo término se define mediante la
siguiente función: F0 = 0, F1 = 1 y
Fn = Fn-1 + Fn-2, n  2

28
Fibonacci
Cantidad de frecuencia para n > 1

Paso Algoritmo Frecuencia


1 void fibonacci(int n) 1
{
int a, b, c, i;
2-3 if (n < 0) { printf("Error"); return;} 1
4-5 if (n == 0) { printf("0"); return;} 1
6-7 if (n == 1) { printf("1"); return;} 1
8 a = 0; b = 1; 2
9 for (i = 2; i <= n; i++) n
{
10 c = a + b; n-1
11 a = b; n-1
12 b = c; n-1
}
13 printf("%d\n",c); 1
}

29
t(n) = 4n + 4
Análisis a Priori

 El tiempo de cálculo es 4n + 4.
 Ignorando las dos constantes 4,
obtenemos que la complejidad
algorítmica u Orden de Complejidad
es O(n).

30
Ejemplo 5

Obtener la frecuencia de ejecución y


la complejidad algorítmica para:

Obtener el mínimo elemento de un


vector.

31
Ejemplo 5
Paso Algoritmo Frecuencia
1 int minimo(int *vector, int n) 1
{
int i, min;
2 min = 1; 1
3 for (i = 2; i <= n; i++) n
{
4 if (vector[i] < vector[min]) n-1
5 min = i; n-1
}
6 return (vector[min]); 1
}

t(n) = 3n + 1

t(n)  O(n).
32
Ejemplo 6

Obtener la frecuencia de ejecución y


la complejidad algorítmica para:

Ordenar n elementos de un vector


por el método de burbuja.

33
Ejemplo 6
Paso Algoritmo Frecuencia
1 void burbuja(int vector[], int n) 1
{
int i, j, aux;
2 for (i = 1; i <= n-1; i++) n
3 for (j = i+1; j <= n; j++) n-1 n
4 if (vector[i] > vector[j]) n-1 n-1
{
5 aux = vector[i]; n-1 n-1
6 vector[i] = vector[j]; n-1 n-1
7 vector[j] = aux; n-1 n-1
}
}

t(n) = 5n2 - 8n + 5

t(n)  O(n2).
34
Ejemplo 7

Obtener la frecuencia de ejecución y


la complejidad algorítmica para el
siguiente algoritmo:

35
Ejemplo 7
Paso Algoritmo Frecuencia
1 void nuevo() { 1
int x, t;
2 x = 1; t = 0; 2
3 while (x < n) { 1 + log n
4 x = x * 2; log n
5 t = t + 1; log n
}
}

t(n) = 4 + 3 log n

t(n)  O(log n).


36
Ejemplo 7

 Calculando el valor
de t se tiene:
Por lo tanto:
n t
1 0
2 1 25 = 32
4 2
=> 2t = n
8 3
16 4
32 5 log2n = t
37
Bibliografía

 Fundamentos de Programación, Jorge


Teran Pomier, 2006.
 Fundamentals of Data Structures, Ellis
Horowitz, 1981.
 Data Structures & Algorithms in Java 2nd
Edition, Robert Lafore, Sams Publishing,
2003.
 Introduction to Algorithms, third edition,
Thomas Cormer, 2009.
38
FIN

39