Analisis Clase2

35
Universidad de Caldas Facultad de Ingenieria nalisis de nalisis de lgoritmos lgoritmos

description

Aqui se hara una presentacion del concepto de complejidad

Transcript of Analisis Clase2

Page 1: Analisis  Clase2

Universidad de CaldasFacultad de Ingenieria

nalisis denalisis de

lgoritmoslgoritmos

Page 2: Analisis  Clase2

INPUT: Una secuencia de numeros <a1,a2,a3,...,an>

PARADIGMA INCREMENTALPARADIGMA INCREMENTAL

• Solve for 1Solve for 1

• Solve for 2:Solve for 2: usando la solucion para usando la solucion para 1 1

• Solve for the next:Solve for the next: usando la usando la solucion previasolucion previa

• Solve for n:Solve for n: usando la solucion para usando la solucion para n-1 n-1

Ordenamiento x Insercion Ordenamiento x Insercion

Page 3: Analisis  Clase2

9 7 6 15 16 5 10 119 7 6 15 16 5 10 11

Ordenamiento x Insercion

9 7 6 15 16 5 10 117 9 6 15 16 5 10 117 9 6 15 16 5 10 117 9 6 15 16 5 10 116 7 9 15 16 5 10 116 7 9 15 16 5 10 116 7 9 15 16 5 10 116 7 9 15 16 5 10 116 7 9 15 16 5 10 115 6 7 9 15 16 10 115 6 7 9 15 16 10 115 6 7 9 15 16 10 115 6 7 9 10 15 16 115 6 7 9 10 15 16 115 6 7 9 10 15 16 115 6 7 9 10 11 15 165 6 7 9 10 11 15 16

Page 4: Analisis  Clase2

procedimiento insercionprocedimiento insercion( A( A[1..n] )[1..n] ) for i for i 2 to n do2 to n do x x A[i] A[i] j j i-1 i-1

while x<A[j] and j>0 dowhile x<A[j] and j>0 do A[j+1] A[j+1] A[j] A[j] j j j-1 j-1

end-whileend-whileA[j+1] A[j+1] x x

end-forend-forendend

Page 5: Analisis  Clase2

4 3 5 2

i

j

i=2

1 3

xA

i

3 5 2

i

j

1 3

i

4

j = i-1 = 1

j = j-1 = 0

Exit while because j<0

Page 6: Analisis  Clase2

3 5 2

j

i=3

1 5

xA

i

4

Exit while because x >A[i]

j = i-1 = 2

Page 7: Analisis  Clase2

3 254

j

i=4

1 2

i

3 5

j

1 2

i

4

j = i-1 = 3

j = j-1 = 2

5

Page 8: Analisis  Clase2

3 44

j

1 2

i

3

j

1 2

i

4

j = j-1 =1

j = j-1 = 0

5

5

2

Page 9: Analisis  Clase2

2 143

j

i=5

5 1

i

2 4

j

1

i

3

j = i-1 = 4

j = j-1 =3

5 5

Page 10: Analisis  Clase2

3 44

j

1 2

i

3

j

1 2

i

4

j = j-1 =1

j = j-1 = 0

5

5

2

Page 11: Analisis  Clase2

2 4

j

1

i

3

j = j-1 =2

4 5

2 3

j

1

i

3

j = j-1 =2

4 5

1 3 12 4 5

Page 12: Analisis  Clase2

CorrectitudCorrectitud

Usando un loop invariante para Usando un loop invariante para probar la correctitud de un probar la correctitud de un

algoritmoalgoritmo

Un loop invariante es una sentencia acerca de las variables de los algoritmos que nos ayuda a probar porque un algoritmo es correcto. Debemos probar 3cosas acerca de un loop invariante:

Page 13: Analisis  Clase2

• INICIALIZACIONel loop invariante es cierto previo a la primera iteracion del loop.

• MANTENIMIENTO Si es cierto antes de una iteracion, permanece cierto antes de la proxima iteracion.

• TERMINACIONCuando el loop termina, el invariante da una propiedad util que nos ayuda a mostrar que el algoritmo es correcto ( usual/ usamos un loop invariante que en la terminacion implique la correctitud del algoritmo).

Page 14: Analisis  Clase2

Loop Invariante para Insertion-sortLoop Invariante para Insertion-sort

En el principio de cada iteracion del loop for el sub-arreglo A[1,..,i-1] consiste de los elementos original/ in A[1,..,i-1] pero en orden.

Page 15: Analisis  Clase2

Antes de empezar el loop i=2, el sub-arreglo A[1,..,i-1] consiste unica/ del A[1], el cual es de hecho el elemento original A[1]. Este sub-arreglo es ordenado (trivial/, por supuesto).

INICIALIZACION

Page 16: Analisis  Clase2

x1 x2 x3 ...

ij

... xn

Antes de empezar la iteracion i=2

max{x1 , x2 }

ij

... xnmin{x1 , x2 }

MANTENIMIENTO

Antes de empezar la iteracion i=3

Page 17: Analisis  Clase2

ij

... xnxi1

max{x1 , x2 }

ij

... xnmin{x1 , x2 } x3

xi2xi3

{xi1 ,xi2

,xi3 }= {x1 ,x2 ,x3

}xi1

< xi2 <

xi3

Antes de empezar la iteracion i=3

Antes de empezal la iteracion i=4

Page 18: Analisis  Clase2

ij

ij

{xi1 ,xi2

,...,xik }= {x1 ,x2 ,...,x3

} xi1< xi2

<...< xi3

Antes de empezar la iteracion i=k

Antes de empezar la iteracion i=k+1

... xnxi1

xi2xi3

... xik-1xk

... xnxi1

xi2xi3

... xik-1xik

Page 19: Analisis  Clase2

En la terminacion i=n+1 el sub-arreglo A[1,..,i-1] consiste de los elementos en el arreglo original A[1,..,n] pero de manaera ordenada. Por esto el algoritmo es correcto.

TERMINACION

Page 20: Analisis  Clase2

Cantidad de trabajo realizadoComo mediremos la cantidad de trabajo realizada por un algoritmo?La medida elegida debe permitirnos comparar dos algoritmos para el

mismo problema y asi determinar cual es mas eficiente. Seria bueno que esa medida nos permitiera comparar aprox. los tiempos de ejecución, pero el tiempo de ejecución no lo usaremos ,porqué? Envez de esto podriamos contar todas las instrucciones ejecutadas por un programa, pero también aquí hay problemas, porqué?..

Lo que queremos es algo que nos diga acerca de la eficiencia del método empleado por un algoritmo con independencia no solo del computador, el lenguaje de programación, el programador sino también de los múltiples detalles de implementacion (indices,apuntadores etc).

Para analizar un algoritmo podemos aislar una operación específica que sea fundamental para el problema que se estudia, asi hariamos caso omiso de inicializaciones, control de ciclos y demás tareas de contabilidad y simplemente contar las operaciones básicas que el algoritmo efectua.En tanto las operaciones básicas se escojan bien y el numero total de operaciones efectuadas sea aproximada/ proporcional al numero de operaciones básicas tendremos una buena medida del trabajo realizado por un algoritmo y un buen criterio para comparar varios algoritmos.

Page 21: Analisis  Clase2

1o. En algunas situaciones puede interesarnos como operación básica una operación muy costosa comparada con las demás

2o.En muchos casos nos interesa la tasa de crecimiento del tiempo que el algoritmo requiere a medida que el tamaño de las entradas aumenta. En tanto que se cumpla la proporcionalidad de operaciones, bastará contar las básicas para tener una idea de que tan factible es aplicar un algoritmo a entrada grandes.

Podemos sustituir el término cantidad de trabajo por complejidad de un algoritmo.

COMPLEJIDAD Cantidad de trabajo realizada medida según alguna medida de complejidad específica, que la mayoria de las veces será el número de operaciones básicas efectuadas

En consecuencia la cantidad de trabajo realizado no se puede describir con un solo número porque el número de pasos ejecutados no es el mismo con todas las entradas. Observemos que la cantidad de trabajo efectuada generalmente depende del tamaño de la entrada….Pero también observemos que incluso si el tamaño de las entradas fuera el mismo, el numero de operaciones efectuadas por un algoritmo podría depender de la naturaleza de las entradas . Necesitamos una medida de tamaño de las entradas de un problema el tiempo tomado por una algoritmo depende de la entrada

Page 22: Analisis  Clase2

Como analizamos el tiempo de ejecución de un algoritmo

• Ordenar 1000 números toma mas tiempo que ordenar 3 números.• Un algoritmo de ordenamiento dado puede aun tomar cantidades

diferentes de tiempo en dos entradas del mismo tamaño • Por ej. Veremos que ordenamiento X inserción toma menos tiempo

para ordenar n elementos cuando ellos están ya ordenados que cuando ellos están en orden contrario .

Input size: Depende del problema que es estudiado.• Usual/, es el numero de items en la entrada. Como el tamaño n del

arreglo a ser ordenado.• Pero podría ser algo mas. Por ej. Multiplicando dos enteros, podría

ser el número total de bits en los dos enteros.• Podría ser descrito por mas de un numero por ejemplo: En

algoritmos de grafos los tiempos de ejecución son usualmente expresados en términos del numero de vértices y el numero de arcos en el grafo de entrada

Page 23: Analisis  Clase2

Tiempo de Ejecucion: Sobre una entrada particular es el numero de operaciones primitivas (pasos) ejecutados.• Queremos definir los pasos independientes de la maquina .• Suponga que c/linea de pseudocodigo requiere una cantidad constante de tiempo.• Una linea puede tomar una cantidad diferente de tiempo que otra, pero cada ejecucion de la linea i toma la misma cantidad de tiempo ci .• Esto es asumiendo que la linea consiste unica/ de operaciones primitivas

• Si la linea es una llamada a subrutina, entonces la llamada actual toma un tiempo constante, pero la ejecucion de la subrutina siendo llamada podria no.

• Si la linea especifica operaciones diferentes a las primitivas entonces podria tomar mas que un tiempo constante. Ej: “ordene los puntos por coordenadas x.”

Page 24: Analisis  Clase2

Analisis del ordenamiento x Analisis del ordenamiento x InsercionInsercion

procedimiento insercion( A[1..n] ) for i 2 to n do x A[i] inserte A[i] entre A[1,..,I-1]� j i-1

while x<A[j] and j>0 do A[j+1] A[j] j j-1

end-whileA[j+1] x

end-forend

El tiempo de ejecucion del algoritmo es

Page 25: Analisis  Clase2

complejidad en tiempocomplejidad en tiempo

costocosto vecesvecesprocedimiento insercion( A[1..n] ) for i 2 to n do c1 n x A[i] c2 n-1 insert A[i] into A[1,..,I-1]� c3 0 j i-1 c4 n-1

while x<A[j] and j>0 do c5 i=2,..,n ti

A[j+1] A[j] c6 i=2,..,n (ti -1)

j j-1 c7 i=2,..,n (ti -1) end-while

A[j+1] x c8 n-1end-for

end

Page 26: Analisis  Clase2

El tiempo de ejecucion del algoritmo es la suma de los tiempos de ejecucion para c/sentencia ejecutada.Para computar T(n), el tiempo de ejecucion del algoritmo, nosotros sumamos los productos de COSTO y VECES obteniendo:

El tiempo de ejecucion depende de los valores de t j . Estos varian de acuerdo con la entrada.

Page 27: Analisis  Clase2

Complejidad de tiempo en el mejor caso tb(n) En este caso ti = 1 entonces

tb(n) = c1n + (c2+c4+c8 ) n-1 + c5 i=2,..,n 1 + (c6+c7) i=2,..,n 0= (c1+c2+c4+c8+c5 ) n - (c2+c4+c8+c5 ) = an+b

= (n).

Puede expresar T (n) como an+b para constantes a y b (que dependen del costo de la sentencia ci ) ⇒ T (n) es una funcion lineal de n.

Complejidad de tiempo en el peor caso tw(n) En este caso ti = i entonces

tw(n) = c1n + (c2+c4+c8 ) n-1 + c5 i=2,..,n i + (c6+c7) i=2,..,n (i-1)

= an2+bn+c = (n2).

Page 28: Analisis  Clase2

Complejidad de tiempo en el caso Promedio ta(n)

En este caso promedio ti = (i+1)/2then

tw(n) = c1n + (c2+c4+c8 ) n-1 + c5 i=2,..,n (i+1)/2 + (c6+c7) i=2,..,n i/2

= an2+bn+c = (n2).

Si ci= 1•tb(n) = 5 n-4 = (n).

•tw(n) = 3/4 n2 + 17/ 4 n - 4 = (n2) cuando la entrada es una permutacion aleatoria uniforme de 1..n sin repeticion

•tw(n) = 3/2 n2 + 7/2 n - 4 = (n2).

Page 29: Analisis  Clase2

Analisis del peor caso y del caso promedio

Sea Dn el conjunto de entradas de tamaño n para el problema en consideración, y sea I un elemento de D n . .Sea T(I) el número de operaciones básicas que el algoritmo ejecuta con la entrada I. Definimos la función

tw(n) = máx. {T(I) / I ε D n }

El tiempo de ejecución del peor caso es el tiempo de ejecución mas largo para una entrada de tamaño n.Este se constituye en un limite superior del tiempo de ejecución para alguna entrada, de esta forma nos da una garantia de que el algoritmo nunca tomara mas tiempo.

En algunos algoritmos el peor caso ocurre con bastante frecuencia, por ejemplo, buscar en una BD una información (el peor caso ocurre cuando la informacion no esta)

Sea Pr(I)la probabilidad de que se presente la entrada I el comportamiento promedio del algoritmo se define asi: ta(n)=

El caso promedio es con frecuencia aproximadamente tan malo como el peor caso. Suponga que aleatoria/ escogemos n números y aplicamos ordenamiento por insercion.Cuánto tiempo toma determinar donde en el subarreglo A[1,,j-1] insertar el elemento A[j]? En promedio, la mitad de los elementos en A[1,,j-1] son menores que A[j] y la mitad de los elementos son mas grandes. En promedio, por esto, nosotros revisamos la mitad del subarreglo A[1,j-1] ,asi tj = j/2. Si planeamos el tiempo de ejecución del caso promedio resultante el vuelve a ser una función cuadrática del tamaño de la entrada, justo como el tiempo de ejecución del peor caso.

nDI

ItI )()Pr(

Page 30: Analisis  Clase2

Orden de crecimientoUsamos algunas abstracciones para facilitar nuestro analisis del algoritmo de

INSERCION.1. Ignoramos el costo actual de cada sentencia usando las constantes ci para

representar estos costos.2. Observamos que aun estas constantes nos dan mas detalle del que

necesitamos (Recuerde Tiempo para el peor caso an2 + bn + c para algunas constantes a,b,c que dependen de los costos ci de las sentencias.

En conclusion ignoramos no unicamente los costos de las sentencias actuales, sino tambien los costos abstractos ci.

Ahora haremos una abstraccion mas simplificada: es la RATA DE CRECIMIENTO u ORDEN DE CRECIMIENTO del tiempo de ejecucion. Por esto consideramos solo los terminos ppales de una formula (e.g: an2) ya que los terminos de orden inferior son relativamente insignificantes para n grande.Tambien ignoramos los coeficientes constantes de los terminos ppales, ya que factores constantes son menos significativos que la rata de crecimiento para entradas grandes .En conclusion escribimos que insercion, tiene un tiempo de ejecucion en el peor caso de . Usaremos informalmente la notacion theta y luego la definiremos.

Usual/ consideramos que un algoritmo es mas eficiente que otro si el tiempo de ejecucion de su peor caso tiene un orden de crecimiento mas bajo.

Page 31: Analisis  Clase2

In summaryOrder of growth Another abstraction to ease analysis and focus on the important

features.Look only at the leading term of the formula for running time.• Drop lower-order terms.• Ignore the constant coefficient in the leading term.Example: For insertion sort, we already abstracted away the actual

statement coststo conclude that the worst-case running time is an2 + bn + c.Drop lower-order terms⇒an2.Ignore constant coefficient n⇒ 2

But we cannot say that the worst-case running time T (n) equals n2.

It grows like n2. But it doesn’t equal n2.We say that the running time is (n2) to capture the notion that the

order of growth is n2.We usually consider one algorithm to be more efficient than another if its

running time has a smaller order of growth.

Page 32: Analisis  Clase2

Porque hay que buscar la eficienciaTendra sentido invertir tiempo intentando diseñar algoritmos mas eficientes sabiendo que las computadoras se vuelven mas y mas rápidas?Supongamos que que para resolver un problema disponemos de de un algoritmo exponencial y de una computadora que puede ejecutar

este algoritmo para casos de tamaño n en 10-4 x 2n segundos. Es decir el programa resuelve un ejemplar de tamaño 10 en aprox. un décimo de seg., uno de tamaño 20 en aprox. Dos minutos y para resolver un ejemplar de tamaño 30 no bastará todo un dia de tiempo de cálculo. Suponiendo que fuera posible hacer funcionar un año seguido la máquina se podría llegar a resolver un ejemplar de tamaño 38.Supongamos que podemos comprar una computadora 100 veces mas rápida que la anterior. Ahora con el mismo algoritmo podemos resolver un ejemplar de tamaño n en _________seg. No mucho, pero cuando determine que la nueva maquina en un año no podrá resolver nisiquiera un ejemplar de tamaño 45. En genral si antes se podía resolver un ejemplar de tamaño n en un tiempo determinado, la nueva máquina resolverá ejemplares de tamaño como máximo ___________en el mismo tiempo.

Page 33: Analisis  Clase2

• Suponga que en lugar de lo anterior decide invertir en algoritmia y que habiendo invertido la misma cantidad de dinero se las arregla para encontrar un algoritmo cúbico para el problema. Entonces con la máquina original y el algoritmo nuevo puede resolver un caso de tamaño n en 10-2 x n3 seg para resolver un ejemplar de tamaño 10 requerirá 10 seg y uno de tamaño 20 seguirá entre uno y dos minutos, pero un ejemplar de tamaño 30 se podrá resolver en 4 minutos y medio y en un dia se pueden resolver casos de tamaño mayor a 200. En un año un ejemplar de tamaño casi 1500.

• Como sería el nuevo algoritmo en la nueva máquina comparado con lo anterior???????????

Page 34: Analisis  Clase2

CUANDO QUEDA ESPECIFICADO UN ALGORITMO

• Deciamos que la ejecucion de un algoritmo no debia implicar decisiones subjetivas

• Que se debia estar contento si un algoritmo funcionaba en abstracto• Proponiamos considerar la mayoria de las operaciones aritmeticas como

elementales a no ser que dijeramos lo contrario.• Desafortunadamente las consideraciones practicas nos llevan a tener en

cuenta las limitaciones de las maquinas.Por ej. Un algoritmo que deba calcular el valor exacto de fib(100) se vera obligado a considerar que ciertas operaciones aritmeticas, no son elementales(fib(100) es un # con 21 digitos). Si no especificamos como se debe implementar la operación de precision multiple, el algoritmo estara especificado incompletamente . Existen algoritmos cuyo rendimiento dependera del metodo que se use para multiplicar ,por ej, por eso no basta con escribir una instrucción como x y * z dejando que se seleccione cualquier tecnica para implementar la multiplicacion, por eso se debe especificar la forma en que se deben implementar las op. Aritmeticas necesarias.

• Sin embargo, seguiremos dejando descripciones incompletas. Los detalles se trataran posteriormente, si es que los analisis asi lo requieren.

Page 35: Analisis  Clase2

Ejercicio

• Para el algoritmo de selección , que loop invariante este algoritmo mantiene?

• Porque necesita correr para unicamente los primeros n -1 elementos, preferiblemente que para todos los n elementos. De los tiempos de ejecucion para el peor caso,y el mejor caso en notacion theta ( )