Está en la página 1de 18

26/08/2018

Tema 1:
Análisis de Algoritmo

Estructura de Datos

Universidad Nacional de la Patagonia Austral


Unidad Académica Río Gallegos

¿Qué es un buen algoritmo?

Dados dos algoritmos diferentes que resuelven el mismo


problema:

¿cuál elegimos? ¿Cómo los comparamos?

Respuesta: El que consume menos tiempo es el mejor.

INCORRECTO.

Análisis de Algoritmo Estructura de Datos 2

1
26/08/2018

Se debe hacer un análisis de algoritmos (AA) y en base a


estos elegiremos el mejor, el mas eficiente.

Dados dos algoritmos el más eficiente es el que


consume o requiere menos trabajo-recursos. Aunque el
tiempo es una consideración importante.

Análisis de Algoritmo Estructura de Datos 3

¿Cómo se mide el trabajo que realiza un


algoritmo?

1. Tomar el tiempo de ejecución


2. Contar la cantidad de líneas del algoritmo

Ambos criterios son INCORRECTOS.

El tiempo depende de la computadora y S.O., y las líneas


del lenguaje y estilo de programación.

Análisis de Algoritmo Estructura de Datos 4

2
26/08/2018

- Es necesaria una medida más general, que determine la


eficiencia de un algoritmo más allá de la computadora
donde se ejecuta y del lenguaje de programación.
- El objetivo del AA es determinar T que es una función
del trabajo que hace el algoritmo y de allí determinar O
(orden de magnitud).

T = ƒ(N)
ƒ(N) = 4N2 + 5N +3
ƒ(N) = O(N2)

Donde n es el tamaño del problema (por lo general


entrada) y O(n2) es la medida que se usa para comparar
algoritmos.

Análisis de Algoritmo Estructura de Datos 5

Si el algoritmo X tiene O(n2) y el algoritmo Y tiene O(n3),


X es más eficiente que Y, puesto que O(n2) < (On3), es
decir X requiere menos trabajo y recursos que Y.

Análisis de Algoritmo Estructura de Datos 6

3
26/08/2018

Para hallar O, dada una f, se toma el término de


“mayor orden” (operación fundamental) y se
desprecian las constantes y términos de menor orden
de la expresión.

ƒ (n) = 4n2 + 5n + 3

se desprecia la constante 4 del primer término, y el


segundo y tercer término por ser de menor orden. El
término de mayor orden en ƒ (n) es el que crece más rápido,
en este caso 4n2. 4n2 siempre va a ser mayor que 5n, para
cualquier valor de n excepto 1 y 2.
n 4n2 5n
0 0 0
1 4 5
2 16 20
3 36 15
Análisis de Algoritmo Estructura de Datos 7

La mayoría de las veces, una operación dominará el


algoritmo
de tal forma que los otras operaciones carecen de
importancia.

Análisis de Algoritmo Estructura de Datos 8

4
26/08/2018

MODELO
Para AA se define un modelo. Nuestro modelo radica en
una computadora normal en la cual se ejecutan
instrucciones en modo secuencial.
El modelo tiene un repertorio de instrucciones sencillas
(+,-,*,-,mod, comparaciones, asignación, lectura y
escritura) y tarda exactamente una unidad de tiempo en
hacer cualquiera de ellas.
También suponemos memoria infinita.

Análisis de Algoritmo Estructura de Datos 9

Es obvio que esto no es tan así, en la realidad no todas


las operaciones tardan lo mismo.

En particular una operación de lectura o escritura a disco,


demora más que una suma.

También al suponer memoria infinita nunca hemos de


preocuparnos por falta de paginas, lo cual suele ser un
problema real.

Análisis de Algoritmo Estructura de Datos 10

5
26/08/2018

¿Que analizar?
El recurso más importante a analizar es el tiempo vs.
factores que afectan al tiempo de ejecución:

• Compiladores
• La computadora
• El algoritmo
• La entrada

Análisis de Algoritmo Estructura de Datos 11

Ejemplo
Factorial(n): entero
1. f ←1
2. mientras n>=1 hacer
3. f←f*n
4. n ←n-1
5. factorial ← f

Si n = 1000 tardará más que sí n = 10. Es decir el tamaño


del problema afecta al tiempo de ejecución. Por ello T es una
ƒ (n) (función del tamaño)

Análisis de Algoritmo Estructura de Datos 12

6
26/08/2018

T para factorial

Línea 1: requiere una unidad de tiempo (una asignación) = 1


Líneas3y4: requiere dos unidades de tiempo cada una (una
asignación y un calculo aritmético) = 4
Línea 5: requiere una unidad de tiempo (una asignación) = 1
Las líneas 3 y 4 están dentro de un bucle que se ejecuta n
veces = 4n
Línea 2: requiere una unidad de tiempo (una comparación) que
se ejecuta n+1 veces = n+1
ƒ (n) = 1 + n+1 + 4n + 1
ƒ (n) = 3 + 5n
ƒ (n) = O(n)

la operación mas fuerte (requiere más


trabajo) es el bucle.

Análisis de Algoritmo Estructura de Datos 13

REGLAS GENERALES

R1: Bucles
El tiempo de ejecución es a lo sumo el tiempo de ejecución de las
instrucciones que están en el interior del ciclo por el número de las
iteraciones.

Análisis de Algoritmo Estructura de Datos 14

7
26/08/2018

R2: bucles anidados


Se analiza de adentro hacia fuera. El tiempo total de una
proposición dentro de un grupo de ciclos anidados es el tiempo de
ejecución de las proposiciones multiplicado por el producto de
los tamaños de todos los ciclos

1. for i:= 1 to n do
2. for j:= 1 to n do
3. s:= s+ A[i,j] {2 unidades de tiempo}

pero la línea tres está dentro de un bucle: 2n


2
pero la línea dos esta dentro de un bucle: (2n)n = 2n

ƒ (n) = O(n2)

Análisis de Algoritmo Estructura de Datos 15

R3: Proposiciones consecutivas(secuencia)

1. a = 1 requiere una unidad de tiempo


2. a = a + 1 requiere dos unidades de tiempo

De las líneas 1 y 2 tenemos tres unidades de tiempo: O(3) =


O(1)

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


read(a[i]);

f(n) = n + n2 = O(n2)
for (i=1; i<n; i++)
for (j=1; j<n; j++) n2
s= s+a[i] + i * j;

Análisis de Algoritmo Estructura de Datos 16

8
26/08/2018

R4: if/else
El tiempo de ejecución de un proposición if/else nunca es mas
grande que el tiempo de ejecución de la condición if, más el
mayor de los tiempos de ejecución de las ramas verdadero-falso.

1. if (a>b && b==0)


2. a = 5
3. else for (i=1; i<=n; i++)
a =a +i

línea 1: dos unidades de tiempo


línea 2: una unidad de tiempo
línea 3: 1+2n+2n=4n

ƒ (n) =O(n)

Análisis de Algoritmo Estructura de Datos 17

NOTACIÓN ASINTOTICA (O-grande)


El interés es hacer AA en problemas de gran tamaño. Ej.
si siempre se va a trabajar con un array de 5 elementos
(pequeño) no es necesario hacer AA, pero si el array ha de
tener miles de elementos entonces hacemos AA.

Se habla del trabajo (tiempo) como una función del


tamaño del problema (datos de entrada)

Se puede expresar una aproximación de esta función


usando una notación matemática llamada “orden de
magnitud” o “notación O grande”.

Análisis de Algoritmo Estructura de Datos 18

9
26/08/2018

El orden de magnitud de una función es la misma que el


orden (exponente) del término de la función que crece
más rápido respecto del tamaño del problema.

ƒ (n) = n4 + 100n2 + 10n + 50


O(n4)

Despreciamos constantes y términos de menor orden.

El orden de magnitud no dice cuantos


nanosegundos tardará la solución en ejecutarse
sobre la computadora. La información O-grande
nos permite comparar algoritmos.

Análisis de Algoritmo Estructura de Datos 19

Ordenes de magnitud comunes

función nombre
C Constante
N Lineal
N2 Cuadrática
N3 Cúbica
Log n Logarítmica
Log2n Logarítmica cuadrática
N log n
2n exponencial

Análisis de Algoritmo Estructura de Datos 20

10
26/08/2018

Función ejemplo
Un tiempo constante es referido como Operaciones simples
O(1), significa que el tiempo requerido (asignación, comparación,
por la operación no cambia. etc.)

Un algoritmo O(n) se conoce como Examinar los n


lineal elementos del array
Un algoritmo O(log n) trabaja mas que Acceso a las hojas de un
O(1) pero menos que O(n), árbol binario.
Un algoritmo O(n2) cuadrática trabaja mas Recorrido de matrices
que O(n)
Un algoritmo O(n3) cúbico trabaja mas Algunos algoritmos de
que O(n2) grafos
Los algoritmos de tiempo exponencial
O(n2)son realmente costosos, son los peores.

Análisis de Algoritmo Estructura de Datos 21

Comparación de razones de crecimiento

N Log N N log N N2 N3 2N
1 0 1 1 1 2
2 1 2 4 8 4
4 2 8 16 64 16
8 3 24 64 512 256
16 4 64 256 4096 65536
32 5 160 1024 32768 2147483648
64 6 384 4096 262144 -
128 7 896 16384 2097152 -
256 8 2048 65536 16777216 -

Análisis de Algoritmo Estructura de Datos 22

11
26/08/2018

Ordenamiento Burbuja

1. for ( i=0; i<n; i++)


2. for (j=0; j<n-i; j++) Cual es la operación mas fuerte?
3. if a[j] > a[j+1]
{ AA:
aux = a[j]; La operación más fuerte
a[j] = a[i]; es la comparación if
a[i] = aux; porque esta dentro de dos
} bucles.

Análisis de Algoritmo Estructura de Datos 23

Analizando de adentro hacia fuera, la línea 3 :


N=5

I
1Comparaciones
J = {0, 1, 2, 3} n-1 4
2 J = {0, 1, 2} n-2 3
3 J = {0, 1} n-3 2
4 J = {0} n-4 1
10

ƒ (n) = 0 + 1 + 2 + 3 + .....n-1 = (n2-n) /2 = ½ (n2-n)


ƒ (n) = n2 = O(n2)

El algoritmo burbuja tiene un orden de magnitud cuadrática.


Es lento.

Análisis de Algoritmo Estructura de Datos 24

12
26/08/2018

Supongamos un array de 1000 elementos


• N2 : 1000 2 comparaciones = 1000000
• ½(10002-1000) = 499500

O es una aproximación, podrá ser una


sobrestimación pero nunca una subestimación.

Análisis de Algoritmo Estructura de Datos 25

Búsqueda Secuencial
1. i= 1;
2. enc = false;
3. while ( i <= n || !enc)
4. if (a[i]= = valor)
enc = true;
else i++;
Cual es la operación mas fuerte?

AA:
Si el array es de 10 elementos, requiere a lo
sumo 10 comparaciones. La operación más
pesada es la comparación, esta dentro del
bucle. Se ejecuta a lo sumo n veces (aunque
el array este ordenado)

Análisis de Algoritmo Estructura de Datos 26

13
26/08/2018

Búsqueda Binaria

Enc = false
primero= 1
ultimo = n
while (primero <= ultimo && ! enc)
{
ptomedio = (primero+ultimo) / 2
if ( lista[ptomedio] == valor)
enc = true;
else
if (lista[ptomedio] > valor)
ultimo = ptomedio –1;
else primero = ptomedio + 1;
}
if (enc) return true;
else return false;
Análisis de Algoritmo Estructura de Datos 27

Valor = 38
AA N = 11
primero = 1
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] ultimo = 11
3 5 8 12 17 21 26 33 38 40 49 ptomedio = 5
enc=false

1ºIteración 1ºcomparación: falso


primero = 6
[6] [7] [8] [9] [10] [11] ultimo = 11
21 26 33 38 40 49 ptomedio = 8

2ºIteración 2ºcomparación: falso


primero = 9
[9] [10] [11] ultimo = 11
38 40 49 ptomedio = 10

Análisis de Algoritmo Estructura de Datos 28

14
26/08/2018

3ºIteración 3º comparación: falso

[9] primero = 9
38 ultimo = 9
ptomedio = 9

4ºIteración 4ºcomparación: verdadero

N = 11
Secuencial: 9 comparaciones
Binaria: 4 comparaciones

Análisis de Algoritmo Estructura de Datos 29

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]
Valor = 57
3 5 8 12 17 21 26 33 38 40 49

1ºIteración 1º comparación: falso

[6] [7] [8] [9] [10] [11]


21 26 33 38 40 49

2ºIteración 2º comparación: falso

[9] [10] [11]


38 40 49

3ºIteración 3º comparación: falso

[11]
49

4ºIteración 4º comparación: falso


Análisis de Algoritmo Estructura de Datos 30

15
26/08/2018

5ºIteración: no entra al bucle.

N = 11
Secuencial: 11 comparaciones (peor caso)
Binaria: 4 comparaciones (peor caso)

Pero Log2 11= 4

ƒ (n) = O(log n)

si n = 1000, secuencial requiere 1000 comparaciones y


binaria (log 2 1000 = 9.96) 10 comparaciones

Análisis de Algoritmo Estructura de Datos 31

La mayoría de los algoritmos que utilizan la


estrategia de resolución “divide y vencerás” tienen un O
logarítmica.

Análisis de Algoritmo Estructura de Datos 32

16
26/08/2018

Recursividad (analizar cuantas veces se llama)


y
Problema: x (x e y enteros positivos)

int potencia (int x, int y)


{
if (y = = 0) return 1;
else return x * potencia(x, y-1);
}

Análisis de Algoritmo Estructura de Datos 33

AA

Si Y = 0 requiere una unidad de tiempo (solo para un caso)

Si Y = 4 Y = 0 : falso (1)
llama Y = 3 Y = 0 : falso (2)
llama Y = 2 Y = 0 : falso (3)
llama Y = 1 Y = 0 : falso (4)
llama Y = 0 Y = 0 : falso (5)

hace n+1 llamadas-comparaciones

ƒ (n) = n + 1 = O( n) lineal, igual que algoritmo iterativo.

Análisis de Algoritmo Estructura de Datos 34

17
26/08/2018

Consultas…

Análisis de Algoritmo Estructura de Datos 35

Próximas clases
• Clases prácticas:
– Miércoles 22/08/18
– Viernes 24/08/18
• Clase de teoría:
– Tema: Ordenamiento
– Miércoles 29/08/18

Análisis de Algoritmo Estructura de Datos 36

18

También podría gustarte