algoritmos 2 digitales ii ing. hugo fdo. velasco peña universidad nacional © 2006

57
ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Upload: sarita-bega

Post on 07-Feb-2015

13 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

ALGORITMOS 2DIGITALES II

Ing Hugo Fdo Velasco PentildeaUniversidad Nacionalcopy 2006

OBJETIVOS

Conocer los principios de evaluacioacuten de costos en algoritmos iterativos y recursivos

Ejemplo 1

En alguacuten lugar de la cinta se pueden encontrar dos o mas letras ldquoardquo seguidas Copiar una ldquobrdquo a continuacioacuten de la uacuteltima ldquoardquo

λaaaλ rarr λaaabλ

Ejemplo 1 Solucioacuten 1

No hay un estado final

1

1aa

1aa

1

1aa

1b

Ejemplo 1 Solucioacuten 2

1

1aa

1aa

1

1aa

1b

1bb 1b

b

Ejemplo 1 Solucioacuten 2

Supone que pueden haber caracteres ldquobrdquo en la cadena

Supone que despueacutes de una ldquoardquo sola puede haber una ldquobrdquo

Ejemplo 1 Solucioacuten 3

1

1aa

1aa

1aa

1b

1bb

1bb

1bb

Ejemplo 2

Copiar todas las ldquoardquo de la memoria a continuacioacuten de las ldquobrdquo

λλλλaaaλλλbbbbbλλλλλrarrλλλλλλλbbbbbaaaλλλ

Ejemplo 2 Solucioacuten

COSTOS

En la maquina de Turing y en general para cualquier algoritmo los costos se pueden medir de la siguiente forma

Costo de tiempoCosto de espacio

COSTO DE TIEMPO

Es la cantidad de transiciones cambios de estado que realiza la maquina contando tambieacuten aquellas transiciones que parten de un estado y vuelven al mismo

Por ejemplo nuestro programa para la maacutequina de Turing del ejemplo 1 Para el caso λaaaaλ insume 5 transiciones y la cinta queda de la forma λaaaabλ

COSTO DE ESPACIO

Se puede medir como la cantidad de estados del programa

Cada estado en la maquina de Turing representa una cierta memoria por lo que medir la cantidad de estados es una buena forma de medir el costo espacial

Nuestro primer algoritmo para la maquina de Turing tiene 4 estados

EFICIENCIA DE UN ALGORITMO

En la maquina de Turing el anaacutelisis de la eficiencia de un algoritmo pasa por averiguar si no existe un programa que pueda resolver el mismo problema en forma mas raacutepida empleando menos transiciones o bien utilizando menos espacio menor cantidad de estados

EFICIENCIA DE UN ALGORITMO

Desarrolle un algoritmo para cambiar una bombilla

OTROS MODELOS COMPUTACIONALES La maquina de Turing es un modelo poco

practico ya que al ser demasiado abstracta programar resulta extremadamente complejo

Ademaacutes no es una buena referencia para la obtencioacuten de programas reales ya que un programa hecho para la maquina de Turing no tiene relacioacuten alguna con un programa realizado en un lenguaje de propoacutesito general

Es por esto que destacando la nobleza de la maquina de Turing pasamos a otros modelos un tanto mas cercanos a la realidad

MAacuteQUINA RAM DE COSTO FIJO

La maacutequina RAM proviene de Random Access Memory

Es una maquina ideal muy similar a una computadora actual aunque con algunas simplicaciones

Los programas de la maquina RAM se almacenan en memoria (en la maquina de Turing los programas no se almacenan por lo menos no en la cinta)

MAacuteQUINA RAM DE COSTO FIJO

Puede suponerse que todos los accesos a memoria tienen el mismo costo en tiempo y que todas las instrucciones tienen un costo constante e ideacutentico en tiempo

El set de instrucciones de la maacutequina RAM estaacute compuesto por la gran mayoriacutea de las instrucciones que podemos encontrar en un lenguaje de alto nivel

Un programa para la maquina RAM se escribe en un pseudocodigo especial en el cual vamos a adoptar algunas convenciones baacutesicas

Las llaves solo son necesarias si su ausencia afecta la claridad del coacutedigo

Los pasajes de paraacutemetros a una funcioacuten se hacen por valor

El acceso a un elemento de un arreglo cuesta lo mismo que el acceso a una variable

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 2: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

OBJETIVOS

Conocer los principios de evaluacioacuten de costos en algoritmos iterativos y recursivos

Ejemplo 1

En alguacuten lugar de la cinta se pueden encontrar dos o mas letras ldquoardquo seguidas Copiar una ldquobrdquo a continuacioacuten de la uacuteltima ldquoardquo

λaaaλ rarr λaaabλ

Ejemplo 1 Solucioacuten 1

No hay un estado final

1

1aa

1aa

1

1aa

1b

Ejemplo 1 Solucioacuten 2

1

1aa

1aa

1

1aa

1b

1bb 1b

b

Ejemplo 1 Solucioacuten 2

Supone que pueden haber caracteres ldquobrdquo en la cadena

Supone que despueacutes de una ldquoardquo sola puede haber una ldquobrdquo

Ejemplo 1 Solucioacuten 3

1

1aa

1aa

1aa

1b

1bb

1bb

1bb

Ejemplo 2

Copiar todas las ldquoardquo de la memoria a continuacioacuten de las ldquobrdquo

λλλλaaaλλλbbbbbλλλλλrarrλλλλλλλbbbbbaaaλλλ

Ejemplo 2 Solucioacuten

COSTOS

En la maquina de Turing y en general para cualquier algoritmo los costos se pueden medir de la siguiente forma

Costo de tiempoCosto de espacio

COSTO DE TIEMPO

Es la cantidad de transiciones cambios de estado que realiza la maquina contando tambieacuten aquellas transiciones que parten de un estado y vuelven al mismo

Por ejemplo nuestro programa para la maacutequina de Turing del ejemplo 1 Para el caso λaaaaλ insume 5 transiciones y la cinta queda de la forma λaaaabλ

COSTO DE ESPACIO

Se puede medir como la cantidad de estados del programa

Cada estado en la maquina de Turing representa una cierta memoria por lo que medir la cantidad de estados es una buena forma de medir el costo espacial

Nuestro primer algoritmo para la maquina de Turing tiene 4 estados

EFICIENCIA DE UN ALGORITMO

En la maquina de Turing el anaacutelisis de la eficiencia de un algoritmo pasa por averiguar si no existe un programa que pueda resolver el mismo problema en forma mas raacutepida empleando menos transiciones o bien utilizando menos espacio menor cantidad de estados

EFICIENCIA DE UN ALGORITMO

Desarrolle un algoritmo para cambiar una bombilla

OTROS MODELOS COMPUTACIONALES La maquina de Turing es un modelo poco

practico ya que al ser demasiado abstracta programar resulta extremadamente complejo

Ademaacutes no es una buena referencia para la obtencioacuten de programas reales ya que un programa hecho para la maquina de Turing no tiene relacioacuten alguna con un programa realizado en un lenguaje de propoacutesito general

Es por esto que destacando la nobleza de la maquina de Turing pasamos a otros modelos un tanto mas cercanos a la realidad

MAacuteQUINA RAM DE COSTO FIJO

La maacutequina RAM proviene de Random Access Memory

Es una maquina ideal muy similar a una computadora actual aunque con algunas simplicaciones

Los programas de la maquina RAM se almacenan en memoria (en la maquina de Turing los programas no se almacenan por lo menos no en la cinta)

MAacuteQUINA RAM DE COSTO FIJO

Puede suponerse que todos los accesos a memoria tienen el mismo costo en tiempo y que todas las instrucciones tienen un costo constante e ideacutentico en tiempo

El set de instrucciones de la maacutequina RAM estaacute compuesto por la gran mayoriacutea de las instrucciones que podemos encontrar en un lenguaje de alto nivel

Un programa para la maquina RAM se escribe en un pseudocodigo especial en el cual vamos a adoptar algunas convenciones baacutesicas

Las llaves solo son necesarias si su ausencia afecta la claridad del coacutedigo

Los pasajes de paraacutemetros a una funcioacuten se hacen por valor

El acceso a un elemento de un arreglo cuesta lo mismo que el acceso a una variable

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 3: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Ejemplo 1

En alguacuten lugar de la cinta se pueden encontrar dos o mas letras ldquoardquo seguidas Copiar una ldquobrdquo a continuacioacuten de la uacuteltima ldquoardquo

λaaaλ rarr λaaabλ

Ejemplo 1 Solucioacuten 1

No hay un estado final

1

1aa

1aa

1

1aa

1b

Ejemplo 1 Solucioacuten 2

1

1aa

1aa

1

1aa

1b

1bb 1b

b

Ejemplo 1 Solucioacuten 2

Supone que pueden haber caracteres ldquobrdquo en la cadena

Supone que despueacutes de una ldquoardquo sola puede haber una ldquobrdquo

Ejemplo 1 Solucioacuten 3

1

1aa

1aa

1aa

1b

1bb

1bb

1bb

Ejemplo 2

Copiar todas las ldquoardquo de la memoria a continuacioacuten de las ldquobrdquo

λλλλaaaλλλbbbbbλλλλλrarrλλλλλλλbbbbbaaaλλλ

Ejemplo 2 Solucioacuten

COSTOS

En la maquina de Turing y en general para cualquier algoritmo los costos se pueden medir de la siguiente forma

Costo de tiempoCosto de espacio

COSTO DE TIEMPO

Es la cantidad de transiciones cambios de estado que realiza la maquina contando tambieacuten aquellas transiciones que parten de un estado y vuelven al mismo

Por ejemplo nuestro programa para la maacutequina de Turing del ejemplo 1 Para el caso λaaaaλ insume 5 transiciones y la cinta queda de la forma λaaaabλ

COSTO DE ESPACIO

Se puede medir como la cantidad de estados del programa

Cada estado en la maquina de Turing representa una cierta memoria por lo que medir la cantidad de estados es una buena forma de medir el costo espacial

Nuestro primer algoritmo para la maquina de Turing tiene 4 estados

EFICIENCIA DE UN ALGORITMO

En la maquina de Turing el anaacutelisis de la eficiencia de un algoritmo pasa por averiguar si no existe un programa que pueda resolver el mismo problema en forma mas raacutepida empleando menos transiciones o bien utilizando menos espacio menor cantidad de estados

EFICIENCIA DE UN ALGORITMO

Desarrolle un algoritmo para cambiar una bombilla

OTROS MODELOS COMPUTACIONALES La maquina de Turing es un modelo poco

practico ya que al ser demasiado abstracta programar resulta extremadamente complejo

Ademaacutes no es una buena referencia para la obtencioacuten de programas reales ya que un programa hecho para la maquina de Turing no tiene relacioacuten alguna con un programa realizado en un lenguaje de propoacutesito general

Es por esto que destacando la nobleza de la maquina de Turing pasamos a otros modelos un tanto mas cercanos a la realidad

MAacuteQUINA RAM DE COSTO FIJO

La maacutequina RAM proviene de Random Access Memory

Es una maquina ideal muy similar a una computadora actual aunque con algunas simplicaciones

Los programas de la maquina RAM se almacenan en memoria (en la maquina de Turing los programas no se almacenan por lo menos no en la cinta)

MAacuteQUINA RAM DE COSTO FIJO

Puede suponerse que todos los accesos a memoria tienen el mismo costo en tiempo y que todas las instrucciones tienen un costo constante e ideacutentico en tiempo

El set de instrucciones de la maacutequina RAM estaacute compuesto por la gran mayoriacutea de las instrucciones que podemos encontrar en un lenguaje de alto nivel

Un programa para la maquina RAM se escribe en un pseudocodigo especial en el cual vamos a adoptar algunas convenciones baacutesicas

Las llaves solo son necesarias si su ausencia afecta la claridad del coacutedigo

Los pasajes de paraacutemetros a una funcioacuten se hacen por valor

El acceso a un elemento de un arreglo cuesta lo mismo que el acceso a una variable

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 4: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Ejemplo 1 Solucioacuten 1

No hay un estado final

1

1aa

1aa

1

1aa

1b

Ejemplo 1 Solucioacuten 2

1

1aa

1aa

1

1aa

1b

1bb 1b

b

Ejemplo 1 Solucioacuten 2

Supone que pueden haber caracteres ldquobrdquo en la cadena

Supone que despueacutes de una ldquoardquo sola puede haber una ldquobrdquo

Ejemplo 1 Solucioacuten 3

1

1aa

1aa

1aa

1b

1bb

1bb

1bb

Ejemplo 2

Copiar todas las ldquoardquo de la memoria a continuacioacuten de las ldquobrdquo

λλλλaaaλλλbbbbbλλλλλrarrλλλλλλλbbbbbaaaλλλ

Ejemplo 2 Solucioacuten

COSTOS

En la maquina de Turing y en general para cualquier algoritmo los costos se pueden medir de la siguiente forma

Costo de tiempoCosto de espacio

COSTO DE TIEMPO

Es la cantidad de transiciones cambios de estado que realiza la maquina contando tambieacuten aquellas transiciones que parten de un estado y vuelven al mismo

Por ejemplo nuestro programa para la maacutequina de Turing del ejemplo 1 Para el caso λaaaaλ insume 5 transiciones y la cinta queda de la forma λaaaabλ

COSTO DE ESPACIO

Se puede medir como la cantidad de estados del programa

Cada estado en la maquina de Turing representa una cierta memoria por lo que medir la cantidad de estados es una buena forma de medir el costo espacial

Nuestro primer algoritmo para la maquina de Turing tiene 4 estados

EFICIENCIA DE UN ALGORITMO

En la maquina de Turing el anaacutelisis de la eficiencia de un algoritmo pasa por averiguar si no existe un programa que pueda resolver el mismo problema en forma mas raacutepida empleando menos transiciones o bien utilizando menos espacio menor cantidad de estados

EFICIENCIA DE UN ALGORITMO

Desarrolle un algoritmo para cambiar una bombilla

OTROS MODELOS COMPUTACIONALES La maquina de Turing es un modelo poco

practico ya que al ser demasiado abstracta programar resulta extremadamente complejo

Ademaacutes no es una buena referencia para la obtencioacuten de programas reales ya que un programa hecho para la maquina de Turing no tiene relacioacuten alguna con un programa realizado en un lenguaje de propoacutesito general

Es por esto que destacando la nobleza de la maquina de Turing pasamos a otros modelos un tanto mas cercanos a la realidad

MAacuteQUINA RAM DE COSTO FIJO

La maacutequina RAM proviene de Random Access Memory

Es una maquina ideal muy similar a una computadora actual aunque con algunas simplicaciones

Los programas de la maquina RAM se almacenan en memoria (en la maquina de Turing los programas no se almacenan por lo menos no en la cinta)

MAacuteQUINA RAM DE COSTO FIJO

Puede suponerse que todos los accesos a memoria tienen el mismo costo en tiempo y que todas las instrucciones tienen un costo constante e ideacutentico en tiempo

El set de instrucciones de la maacutequina RAM estaacute compuesto por la gran mayoriacutea de las instrucciones que podemos encontrar en un lenguaje de alto nivel

Un programa para la maquina RAM se escribe en un pseudocodigo especial en el cual vamos a adoptar algunas convenciones baacutesicas

Las llaves solo son necesarias si su ausencia afecta la claridad del coacutedigo

Los pasajes de paraacutemetros a una funcioacuten se hacen por valor

El acceso a un elemento de un arreglo cuesta lo mismo que el acceso a una variable

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 5: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Ejemplo 1 Solucioacuten 2

1

1aa

1aa

1

1aa

1b

1bb 1b

b

Ejemplo 1 Solucioacuten 2

Supone que pueden haber caracteres ldquobrdquo en la cadena

Supone que despueacutes de una ldquoardquo sola puede haber una ldquobrdquo

Ejemplo 1 Solucioacuten 3

1

1aa

1aa

1aa

1b

1bb

1bb

1bb

Ejemplo 2

Copiar todas las ldquoardquo de la memoria a continuacioacuten de las ldquobrdquo

λλλλaaaλλλbbbbbλλλλλrarrλλλλλλλbbbbbaaaλλλ

Ejemplo 2 Solucioacuten

COSTOS

En la maquina de Turing y en general para cualquier algoritmo los costos se pueden medir de la siguiente forma

Costo de tiempoCosto de espacio

COSTO DE TIEMPO

Es la cantidad de transiciones cambios de estado que realiza la maquina contando tambieacuten aquellas transiciones que parten de un estado y vuelven al mismo

Por ejemplo nuestro programa para la maacutequina de Turing del ejemplo 1 Para el caso λaaaaλ insume 5 transiciones y la cinta queda de la forma λaaaabλ

COSTO DE ESPACIO

Se puede medir como la cantidad de estados del programa

Cada estado en la maquina de Turing representa una cierta memoria por lo que medir la cantidad de estados es una buena forma de medir el costo espacial

Nuestro primer algoritmo para la maquina de Turing tiene 4 estados

EFICIENCIA DE UN ALGORITMO

En la maquina de Turing el anaacutelisis de la eficiencia de un algoritmo pasa por averiguar si no existe un programa que pueda resolver el mismo problema en forma mas raacutepida empleando menos transiciones o bien utilizando menos espacio menor cantidad de estados

EFICIENCIA DE UN ALGORITMO

Desarrolle un algoritmo para cambiar una bombilla

OTROS MODELOS COMPUTACIONALES La maquina de Turing es un modelo poco

practico ya que al ser demasiado abstracta programar resulta extremadamente complejo

Ademaacutes no es una buena referencia para la obtencioacuten de programas reales ya que un programa hecho para la maquina de Turing no tiene relacioacuten alguna con un programa realizado en un lenguaje de propoacutesito general

Es por esto que destacando la nobleza de la maquina de Turing pasamos a otros modelos un tanto mas cercanos a la realidad

MAacuteQUINA RAM DE COSTO FIJO

La maacutequina RAM proviene de Random Access Memory

Es una maquina ideal muy similar a una computadora actual aunque con algunas simplicaciones

Los programas de la maquina RAM se almacenan en memoria (en la maquina de Turing los programas no se almacenan por lo menos no en la cinta)

MAacuteQUINA RAM DE COSTO FIJO

Puede suponerse que todos los accesos a memoria tienen el mismo costo en tiempo y que todas las instrucciones tienen un costo constante e ideacutentico en tiempo

El set de instrucciones de la maacutequina RAM estaacute compuesto por la gran mayoriacutea de las instrucciones que podemos encontrar en un lenguaje de alto nivel

Un programa para la maquina RAM se escribe en un pseudocodigo especial en el cual vamos a adoptar algunas convenciones baacutesicas

Las llaves solo son necesarias si su ausencia afecta la claridad del coacutedigo

Los pasajes de paraacutemetros a una funcioacuten se hacen por valor

El acceso a un elemento de un arreglo cuesta lo mismo que el acceso a una variable

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 6: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Ejemplo 1 Solucioacuten 2

Supone que pueden haber caracteres ldquobrdquo en la cadena

Supone que despueacutes de una ldquoardquo sola puede haber una ldquobrdquo

Ejemplo 1 Solucioacuten 3

1

1aa

1aa

1aa

1b

1bb

1bb

1bb

Ejemplo 2

Copiar todas las ldquoardquo de la memoria a continuacioacuten de las ldquobrdquo

λλλλaaaλλλbbbbbλλλλλrarrλλλλλλλbbbbbaaaλλλ

Ejemplo 2 Solucioacuten

COSTOS

En la maquina de Turing y en general para cualquier algoritmo los costos se pueden medir de la siguiente forma

Costo de tiempoCosto de espacio

COSTO DE TIEMPO

Es la cantidad de transiciones cambios de estado que realiza la maquina contando tambieacuten aquellas transiciones que parten de un estado y vuelven al mismo

Por ejemplo nuestro programa para la maacutequina de Turing del ejemplo 1 Para el caso λaaaaλ insume 5 transiciones y la cinta queda de la forma λaaaabλ

COSTO DE ESPACIO

Se puede medir como la cantidad de estados del programa

Cada estado en la maquina de Turing representa una cierta memoria por lo que medir la cantidad de estados es una buena forma de medir el costo espacial

Nuestro primer algoritmo para la maquina de Turing tiene 4 estados

EFICIENCIA DE UN ALGORITMO

En la maquina de Turing el anaacutelisis de la eficiencia de un algoritmo pasa por averiguar si no existe un programa que pueda resolver el mismo problema en forma mas raacutepida empleando menos transiciones o bien utilizando menos espacio menor cantidad de estados

EFICIENCIA DE UN ALGORITMO

Desarrolle un algoritmo para cambiar una bombilla

OTROS MODELOS COMPUTACIONALES La maquina de Turing es un modelo poco

practico ya que al ser demasiado abstracta programar resulta extremadamente complejo

Ademaacutes no es una buena referencia para la obtencioacuten de programas reales ya que un programa hecho para la maquina de Turing no tiene relacioacuten alguna con un programa realizado en un lenguaje de propoacutesito general

Es por esto que destacando la nobleza de la maquina de Turing pasamos a otros modelos un tanto mas cercanos a la realidad

MAacuteQUINA RAM DE COSTO FIJO

La maacutequina RAM proviene de Random Access Memory

Es una maquina ideal muy similar a una computadora actual aunque con algunas simplicaciones

Los programas de la maquina RAM se almacenan en memoria (en la maquina de Turing los programas no se almacenan por lo menos no en la cinta)

MAacuteQUINA RAM DE COSTO FIJO

Puede suponerse que todos los accesos a memoria tienen el mismo costo en tiempo y que todas las instrucciones tienen un costo constante e ideacutentico en tiempo

El set de instrucciones de la maacutequina RAM estaacute compuesto por la gran mayoriacutea de las instrucciones que podemos encontrar en un lenguaje de alto nivel

Un programa para la maquina RAM se escribe en un pseudocodigo especial en el cual vamos a adoptar algunas convenciones baacutesicas

Las llaves solo son necesarias si su ausencia afecta la claridad del coacutedigo

Los pasajes de paraacutemetros a una funcioacuten se hacen por valor

El acceso a un elemento de un arreglo cuesta lo mismo que el acceso a una variable

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 7: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Ejemplo 1 Solucioacuten 3

1

1aa

1aa

1aa

1b

1bb

1bb

1bb

Ejemplo 2

Copiar todas las ldquoardquo de la memoria a continuacioacuten de las ldquobrdquo

λλλλaaaλλλbbbbbλλλλλrarrλλλλλλλbbbbbaaaλλλ

Ejemplo 2 Solucioacuten

COSTOS

En la maquina de Turing y en general para cualquier algoritmo los costos se pueden medir de la siguiente forma

Costo de tiempoCosto de espacio

COSTO DE TIEMPO

Es la cantidad de transiciones cambios de estado que realiza la maquina contando tambieacuten aquellas transiciones que parten de un estado y vuelven al mismo

Por ejemplo nuestro programa para la maacutequina de Turing del ejemplo 1 Para el caso λaaaaλ insume 5 transiciones y la cinta queda de la forma λaaaabλ

COSTO DE ESPACIO

Se puede medir como la cantidad de estados del programa

Cada estado en la maquina de Turing representa una cierta memoria por lo que medir la cantidad de estados es una buena forma de medir el costo espacial

Nuestro primer algoritmo para la maquina de Turing tiene 4 estados

EFICIENCIA DE UN ALGORITMO

En la maquina de Turing el anaacutelisis de la eficiencia de un algoritmo pasa por averiguar si no existe un programa que pueda resolver el mismo problema en forma mas raacutepida empleando menos transiciones o bien utilizando menos espacio menor cantidad de estados

EFICIENCIA DE UN ALGORITMO

Desarrolle un algoritmo para cambiar una bombilla

OTROS MODELOS COMPUTACIONALES La maquina de Turing es un modelo poco

practico ya que al ser demasiado abstracta programar resulta extremadamente complejo

Ademaacutes no es una buena referencia para la obtencioacuten de programas reales ya que un programa hecho para la maquina de Turing no tiene relacioacuten alguna con un programa realizado en un lenguaje de propoacutesito general

Es por esto que destacando la nobleza de la maquina de Turing pasamos a otros modelos un tanto mas cercanos a la realidad

MAacuteQUINA RAM DE COSTO FIJO

La maacutequina RAM proviene de Random Access Memory

Es una maquina ideal muy similar a una computadora actual aunque con algunas simplicaciones

Los programas de la maquina RAM se almacenan en memoria (en la maquina de Turing los programas no se almacenan por lo menos no en la cinta)

MAacuteQUINA RAM DE COSTO FIJO

Puede suponerse que todos los accesos a memoria tienen el mismo costo en tiempo y que todas las instrucciones tienen un costo constante e ideacutentico en tiempo

El set de instrucciones de la maacutequina RAM estaacute compuesto por la gran mayoriacutea de las instrucciones que podemos encontrar en un lenguaje de alto nivel

Un programa para la maquina RAM se escribe en un pseudocodigo especial en el cual vamos a adoptar algunas convenciones baacutesicas

Las llaves solo son necesarias si su ausencia afecta la claridad del coacutedigo

Los pasajes de paraacutemetros a una funcioacuten se hacen por valor

El acceso a un elemento de un arreglo cuesta lo mismo que el acceso a una variable

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 8: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Ejemplo 2

Copiar todas las ldquoardquo de la memoria a continuacioacuten de las ldquobrdquo

λλλλaaaλλλbbbbbλλλλλrarrλλλλλλλbbbbbaaaλλλ

Ejemplo 2 Solucioacuten

COSTOS

En la maquina de Turing y en general para cualquier algoritmo los costos se pueden medir de la siguiente forma

Costo de tiempoCosto de espacio

COSTO DE TIEMPO

Es la cantidad de transiciones cambios de estado que realiza la maquina contando tambieacuten aquellas transiciones que parten de un estado y vuelven al mismo

Por ejemplo nuestro programa para la maacutequina de Turing del ejemplo 1 Para el caso λaaaaλ insume 5 transiciones y la cinta queda de la forma λaaaabλ

COSTO DE ESPACIO

Se puede medir como la cantidad de estados del programa

Cada estado en la maquina de Turing representa una cierta memoria por lo que medir la cantidad de estados es una buena forma de medir el costo espacial

Nuestro primer algoritmo para la maquina de Turing tiene 4 estados

EFICIENCIA DE UN ALGORITMO

En la maquina de Turing el anaacutelisis de la eficiencia de un algoritmo pasa por averiguar si no existe un programa que pueda resolver el mismo problema en forma mas raacutepida empleando menos transiciones o bien utilizando menos espacio menor cantidad de estados

EFICIENCIA DE UN ALGORITMO

Desarrolle un algoritmo para cambiar una bombilla

OTROS MODELOS COMPUTACIONALES La maquina de Turing es un modelo poco

practico ya que al ser demasiado abstracta programar resulta extremadamente complejo

Ademaacutes no es una buena referencia para la obtencioacuten de programas reales ya que un programa hecho para la maquina de Turing no tiene relacioacuten alguna con un programa realizado en un lenguaje de propoacutesito general

Es por esto que destacando la nobleza de la maquina de Turing pasamos a otros modelos un tanto mas cercanos a la realidad

MAacuteQUINA RAM DE COSTO FIJO

La maacutequina RAM proviene de Random Access Memory

Es una maquina ideal muy similar a una computadora actual aunque con algunas simplicaciones

Los programas de la maquina RAM se almacenan en memoria (en la maquina de Turing los programas no se almacenan por lo menos no en la cinta)

MAacuteQUINA RAM DE COSTO FIJO

Puede suponerse que todos los accesos a memoria tienen el mismo costo en tiempo y que todas las instrucciones tienen un costo constante e ideacutentico en tiempo

El set de instrucciones de la maacutequina RAM estaacute compuesto por la gran mayoriacutea de las instrucciones que podemos encontrar en un lenguaje de alto nivel

Un programa para la maquina RAM se escribe en un pseudocodigo especial en el cual vamos a adoptar algunas convenciones baacutesicas

Las llaves solo son necesarias si su ausencia afecta la claridad del coacutedigo

Los pasajes de paraacutemetros a una funcioacuten se hacen por valor

El acceso a un elemento de un arreglo cuesta lo mismo que el acceso a una variable

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 9: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Ejemplo 2 Solucioacuten

COSTOS

En la maquina de Turing y en general para cualquier algoritmo los costos se pueden medir de la siguiente forma

Costo de tiempoCosto de espacio

COSTO DE TIEMPO

Es la cantidad de transiciones cambios de estado que realiza la maquina contando tambieacuten aquellas transiciones que parten de un estado y vuelven al mismo

Por ejemplo nuestro programa para la maacutequina de Turing del ejemplo 1 Para el caso λaaaaλ insume 5 transiciones y la cinta queda de la forma λaaaabλ

COSTO DE ESPACIO

Se puede medir como la cantidad de estados del programa

Cada estado en la maquina de Turing representa una cierta memoria por lo que medir la cantidad de estados es una buena forma de medir el costo espacial

Nuestro primer algoritmo para la maquina de Turing tiene 4 estados

EFICIENCIA DE UN ALGORITMO

En la maquina de Turing el anaacutelisis de la eficiencia de un algoritmo pasa por averiguar si no existe un programa que pueda resolver el mismo problema en forma mas raacutepida empleando menos transiciones o bien utilizando menos espacio menor cantidad de estados

EFICIENCIA DE UN ALGORITMO

Desarrolle un algoritmo para cambiar una bombilla

OTROS MODELOS COMPUTACIONALES La maquina de Turing es un modelo poco

practico ya que al ser demasiado abstracta programar resulta extremadamente complejo

Ademaacutes no es una buena referencia para la obtencioacuten de programas reales ya que un programa hecho para la maquina de Turing no tiene relacioacuten alguna con un programa realizado en un lenguaje de propoacutesito general

Es por esto que destacando la nobleza de la maquina de Turing pasamos a otros modelos un tanto mas cercanos a la realidad

MAacuteQUINA RAM DE COSTO FIJO

La maacutequina RAM proviene de Random Access Memory

Es una maquina ideal muy similar a una computadora actual aunque con algunas simplicaciones

Los programas de la maquina RAM se almacenan en memoria (en la maquina de Turing los programas no se almacenan por lo menos no en la cinta)

MAacuteQUINA RAM DE COSTO FIJO

Puede suponerse que todos los accesos a memoria tienen el mismo costo en tiempo y que todas las instrucciones tienen un costo constante e ideacutentico en tiempo

El set de instrucciones de la maacutequina RAM estaacute compuesto por la gran mayoriacutea de las instrucciones que podemos encontrar en un lenguaje de alto nivel

Un programa para la maquina RAM se escribe en un pseudocodigo especial en el cual vamos a adoptar algunas convenciones baacutesicas

Las llaves solo son necesarias si su ausencia afecta la claridad del coacutedigo

Los pasajes de paraacutemetros a una funcioacuten se hacen por valor

El acceso a un elemento de un arreglo cuesta lo mismo que el acceso a una variable

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 10: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

COSTOS

En la maquina de Turing y en general para cualquier algoritmo los costos se pueden medir de la siguiente forma

Costo de tiempoCosto de espacio

COSTO DE TIEMPO

Es la cantidad de transiciones cambios de estado que realiza la maquina contando tambieacuten aquellas transiciones que parten de un estado y vuelven al mismo

Por ejemplo nuestro programa para la maacutequina de Turing del ejemplo 1 Para el caso λaaaaλ insume 5 transiciones y la cinta queda de la forma λaaaabλ

COSTO DE ESPACIO

Se puede medir como la cantidad de estados del programa

Cada estado en la maquina de Turing representa una cierta memoria por lo que medir la cantidad de estados es una buena forma de medir el costo espacial

Nuestro primer algoritmo para la maquina de Turing tiene 4 estados

EFICIENCIA DE UN ALGORITMO

En la maquina de Turing el anaacutelisis de la eficiencia de un algoritmo pasa por averiguar si no existe un programa que pueda resolver el mismo problema en forma mas raacutepida empleando menos transiciones o bien utilizando menos espacio menor cantidad de estados

EFICIENCIA DE UN ALGORITMO

Desarrolle un algoritmo para cambiar una bombilla

OTROS MODELOS COMPUTACIONALES La maquina de Turing es un modelo poco

practico ya que al ser demasiado abstracta programar resulta extremadamente complejo

Ademaacutes no es una buena referencia para la obtencioacuten de programas reales ya que un programa hecho para la maquina de Turing no tiene relacioacuten alguna con un programa realizado en un lenguaje de propoacutesito general

Es por esto que destacando la nobleza de la maquina de Turing pasamos a otros modelos un tanto mas cercanos a la realidad

MAacuteQUINA RAM DE COSTO FIJO

La maacutequina RAM proviene de Random Access Memory

Es una maquina ideal muy similar a una computadora actual aunque con algunas simplicaciones

Los programas de la maquina RAM se almacenan en memoria (en la maquina de Turing los programas no se almacenan por lo menos no en la cinta)

MAacuteQUINA RAM DE COSTO FIJO

Puede suponerse que todos los accesos a memoria tienen el mismo costo en tiempo y que todas las instrucciones tienen un costo constante e ideacutentico en tiempo

El set de instrucciones de la maacutequina RAM estaacute compuesto por la gran mayoriacutea de las instrucciones que podemos encontrar en un lenguaje de alto nivel

Un programa para la maquina RAM se escribe en un pseudocodigo especial en el cual vamos a adoptar algunas convenciones baacutesicas

Las llaves solo son necesarias si su ausencia afecta la claridad del coacutedigo

Los pasajes de paraacutemetros a una funcioacuten se hacen por valor

El acceso a un elemento de un arreglo cuesta lo mismo que el acceso a una variable

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 11: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

COSTO DE TIEMPO

Es la cantidad de transiciones cambios de estado que realiza la maquina contando tambieacuten aquellas transiciones que parten de un estado y vuelven al mismo

Por ejemplo nuestro programa para la maacutequina de Turing del ejemplo 1 Para el caso λaaaaλ insume 5 transiciones y la cinta queda de la forma λaaaabλ

COSTO DE ESPACIO

Se puede medir como la cantidad de estados del programa

Cada estado en la maquina de Turing representa una cierta memoria por lo que medir la cantidad de estados es una buena forma de medir el costo espacial

Nuestro primer algoritmo para la maquina de Turing tiene 4 estados

EFICIENCIA DE UN ALGORITMO

En la maquina de Turing el anaacutelisis de la eficiencia de un algoritmo pasa por averiguar si no existe un programa que pueda resolver el mismo problema en forma mas raacutepida empleando menos transiciones o bien utilizando menos espacio menor cantidad de estados

EFICIENCIA DE UN ALGORITMO

Desarrolle un algoritmo para cambiar una bombilla

OTROS MODELOS COMPUTACIONALES La maquina de Turing es un modelo poco

practico ya que al ser demasiado abstracta programar resulta extremadamente complejo

Ademaacutes no es una buena referencia para la obtencioacuten de programas reales ya que un programa hecho para la maquina de Turing no tiene relacioacuten alguna con un programa realizado en un lenguaje de propoacutesito general

Es por esto que destacando la nobleza de la maquina de Turing pasamos a otros modelos un tanto mas cercanos a la realidad

MAacuteQUINA RAM DE COSTO FIJO

La maacutequina RAM proviene de Random Access Memory

Es una maquina ideal muy similar a una computadora actual aunque con algunas simplicaciones

Los programas de la maquina RAM se almacenan en memoria (en la maquina de Turing los programas no se almacenan por lo menos no en la cinta)

MAacuteQUINA RAM DE COSTO FIJO

Puede suponerse que todos los accesos a memoria tienen el mismo costo en tiempo y que todas las instrucciones tienen un costo constante e ideacutentico en tiempo

El set de instrucciones de la maacutequina RAM estaacute compuesto por la gran mayoriacutea de las instrucciones que podemos encontrar en un lenguaje de alto nivel

Un programa para la maquina RAM se escribe en un pseudocodigo especial en el cual vamos a adoptar algunas convenciones baacutesicas

Las llaves solo son necesarias si su ausencia afecta la claridad del coacutedigo

Los pasajes de paraacutemetros a una funcioacuten se hacen por valor

El acceso a un elemento de un arreglo cuesta lo mismo que el acceso a una variable

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 12: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

COSTO DE ESPACIO

Se puede medir como la cantidad de estados del programa

Cada estado en la maquina de Turing representa una cierta memoria por lo que medir la cantidad de estados es una buena forma de medir el costo espacial

Nuestro primer algoritmo para la maquina de Turing tiene 4 estados

EFICIENCIA DE UN ALGORITMO

En la maquina de Turing el anaacutelisis de la eficiencia de un algoritmo pasa por averiguar si no existe un programa que pueda resolver el mismo problema en forma mas raacutepida empleando menos transiciones o bien utilizando menos espacio menor cantidad de estados

EFICIENCIA DE UN ALGORITMO

Desarrolle un algoritmo para cambiar una bombilla

OTROS MODELOS COMPUTACIONALES La maquina de Turing es un modelo poco

practico ya que al ser demasiado abstracta programar resulta extremadamente complejo

Ademaacutes no es una buena referencia para la obtencioacuten de programas reales ya que un programa hecho para la maquina de Turing no tiene relacioacuten alguna con un programa realizado en un lenguaje de propoacutesito general

Es por esto que destacando la nobleza de la maquina de Turing pasamos a otros modelos un tanto mas cercanos a la realidad

MAacuteQUINA RAM DE COSTO FIJO

La maacutequina RAM proviene de Random Access Memory

Es una maquina ideal muy similar a una computadora actual aunque con algunas simplicaciones

Los programas de la maquina RAM se almacenan en memoria (en la maquina de Turing los programas no se almacenan por lo menos no en la cinta)

MAacuteQUINA RAM DE COSTO FIJO

Puede suponerse que todos los accesos a memoria tienen el mismo costo en tiempo y que todas las instrucciones tienen un costo constante e ideacutentico en tiempo

El set de instrucciones de la maacutequina RAM estaacute compuesto por la gran mayoriacutea de las instrucciones que podemos encontrar en un lenguaje de alto nivel

Un programa para la maquina RAM se escribe en un pseudocodigo especial en el cual vamos a adoptar algunas convenciones baacutesicas

Las llaves solo son necesarias si su ausencia afecta la claridad del coacutedigo

Los pasajes de paraacutemetros a una funcioacuten se hacen por valor

El acceso a un elemento de un arreglo cuesta lo mismo que el acceso a una variable

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 13: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

EFICIENCIA DE UN ALGORITMO

En la maquina de Turing el anaacutelisis de la eficiencia de un algoritmo pasa por averiguar si no existe un programa que pueda resolver el mismo problema en forma mas raacutepida empleando menos transiciones o bien utilizando menos espacio menor cantidad de estados

EFICIENCIA DE UN ALGORITMO

Desarrolle un algoritmo para cambiar una bombilla

OTROS MODELOS COMPUTACIONALES La maquina de Turing es un modelo poco

practico ya que al ser demasiado abstracta programar resulta extremadamente complejo

Ademaacutes no es una buena referencia para la obtencioacuten de programas reales ya que un programa hecho para la maquina de Turing no tiene relacioacuten alguna con un programa realizado en un lenguaje de propoacutesito general

Es por esto que destacando la nobleza de la maquina de Turing pasamos a otros modelos un tanto mas cercanos a la realidad

MAacuteQUINA RAM DE COSTO FIJO

La maacutequina RAM proviene de Random Access Memory

Es una maquina ideal muy similar a una computadora actual aunque con algunas simplicaciones

Los programas de la maquina RAM se almacenan en memoria (en la maquina de Turing los programas no se almacenan por lo menos no en la cinta)

MAacuteQUINA RAM DE COSTO FIJO

Puede suponerse que todos los accesos a memoria tienen el mismo costo en tiempo y que todas las instrucciones tienen un costo constante e ideacutentico en tiempo

El set de instrucciones de la maacutequina RAM estaacute compuesto por la gran mayoriacutea de las instrucciones que podemos encontrar en un lenguaje de alto nivel

Un programa para la maquina RAM se escribe en un pseudocodigo especial en el cual vamos a adoptar algunas convenciones baacutesicas

Las llaves solo son necesarias si su ausencia afecta la claridad del coacutedigo

Los pasajes de paraacutemetros a una funcioacuten se hacen por valor

El acceso a un elemento de un arreglo cuesta lo mismo que el acceso a una variable

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 14: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

EFICIENCIA DE UN ALGORITMO

Desarrolle un algoritmo para cambiar una bombilla

OTROS MODELOS COMPUTACIONALES La maquina de Turing es un modelo poco

practico ya que al ser demasiado abstracta programar resulta extremadamente complejo

Ademaacutes no es una buena referencia para la obtencioacuten de programas reales ya que un programa hecho para la maquina de Turing no tiene relacioacuten alguna con un programa realizado en un lenguaje de propoacutesito general

Es por esto que destacando la nobleza de la maquina de Turing pasamos a otros modelos un tanto mas cercanos a la realidad

MAacuteQUINA RAM DE COSTO FIJO

La maacutequina RAM proviene de Random Access Memory

Es una maquina ideal muy similar a una computadora actual aunque con algunas simplicaciones

Los programas de la maquina RAM se almacenan en memoria (en la maquina de Turing los programas no se almacenan por lo menos no en la cinta)

MAacuteQUINA RAM DE COSTO FIJO

Puede suponerse que todos los accesos a memoria tienen el mismo costo en tiempo y que todas las instrucciones tienen un costo constante e ideacutentico en tiempo

El set de instrucciones de la maacutequina RAM estaacute compuesto por la gran mayoriacutea de las instrucciones que podemos encontrar en un lenguaje de alto nivel

Un programa para la maquina RAM se escribe en un pseudocodigo especial en el cual vamos a adoptar algunas convenciones baacutesicas

Las llaves solo son necesarias si su ausencia afecta la claridad del coacutedigo

Los pasajes de paraacutemetros a una funcioacuten se hacen por valor

El acceso a un elemento de un arreglo cuesta lo mismo que el acceso a una variable

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 15: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

OTROS MODELOS COMPUTACIONALES La maquina de Turing es un modelo poco

practico ya que al ser demasiado abstracta programar resulta extremadamente complejo

Ademaacutes no es una buena referencia para la obtencioacuten de programas reales ya que un programa hecho para la maquina de Turing no tiene relacioacuten alguna con un programa realizado en un lenguaje de propoacutesito general

Es por esto que destacando la nobleza de la maquina de Turing pasamos a otros modelos un tanto mas cercanos a la realidad

MAacuteQUINA RAM DE COSTO FIJO

La maacutequina RAM proviene de Random Access Memory

Es una maquina ideal muy similar a una computadora actual aunque con algunas simplicaciones

Los programas de la maquina RAM se almacenan en memoria (en la maquina de Turing los programas no se almacenan por lo menos no en la cinta)

MAacuteQUINA RAM DE COSTO FIJO

Puede suponerse que todos los accesos a memoria tienen el mismo costo en tiempo y que todas las instrucciones tienen un costo constante e ideacutentico en tiempo

El set de instrucciones de la maacutequina RAM estaacute compuesto por la gran mayoriacutea de las instrucciones que podemos encontrar en un lenguaje de alto nivel

Un programa para la maquina RAM se escribe en un pseudocodigo especial en el cual vamos a adoptar algunas convenciones baacutesicas

Las llaves solo son necesarias si su ausencia afecta la claridad del coacutedigo

Los pasajes de paraacutemetros a una funcioacuten se hacen por valor

El acceso a un elemento de un arreglo cuesta lo mismo que el acceso a una variable

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 16: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

MAacuteQUINA RAM DE COSTO FIJO

La maacutequina RAM proviene de Random Access Memory

Es una maquina ideal muy similar a una computadora actual aunque con algunas simplicaciones

Los programas de la maquina RAM se almacenan en memoria (en la maquina de Turing los programas no se almacenan por lo menos no en la cinta)

MAacuteQUINA RAM DE COSTO FIJO

Puede suponerse que todos los accesos a memoria tienen el mismo costo en tiempo y que todas las instrucciones tienen un costo constante e ideacutentico en tiempo

El set de instrucciones de la maacutequina RAM estaacute compuesto por la gran mayoriacutea de las instrucciones que podemos encontrar en un lenguaje de alto nivel

Un programa para la maquina RAM se escribe en un pseudocodigo especial en el cual vamos a adoptar algunas convenciones baacutesicas

Las llaves solo son necesarias si su ausencia afecta la claridad del coacutedigo

Los pasajes de paraacutemetros a una funcioacuten se hacen por valor

El acceso a un elemento de un arreglo cuesta lo mismo que el acceso a una variable

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 17: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

MAacuteQUINA RAM DE COSTO FIJO

Puede suponerse que todos los accesos a memoria tienen el mismo costo en tiempo y que todas las instrucciones tienen un costo constante e ideacutentico en tiempo

El set de instrucciones de la maacutequina RAM estaacute compuesto por la gran mayoriacutea de las instrucciones que podemos encontrar en un lenguaje de alto nivel

Un programa para la maquina RAM se escribe en un pseudocodigo especial en el cual vamos a adoptar algunas convenciones baacutesicas

Las llaves solo son necesarias si su ausencia afecta la claridad del coacutedigo

Los pasajes de paraacutemetros a una funcioacuten se hacen por valor

El acceso a un elemento de un arreglo cuesta lo mismo que el acceso a una variable

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 18: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Las llaves solo son necesarias si su ausencia afecta la claridad del coacutedigo

Los pasajes de paraacutemetros a una funcioacuten se hacen por valor

El acceso a un elemento de un arreglo cuesta lo mismo que el acceso a una variable

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 19: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Algoritmo 1 Algoritmo 2

y larr 1A[2] larr 1 if n lt 1 then

X larr welse

X larr yend ifwhile n ge 0 do

n larr n -1end whileciclo forfor i = 0 to 10 doA[i] larr 0 end for

a larr 3 b larr a 5 if b == 5 thena larr 2 elsea larr 1end if

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 20: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

El algoritmo 2 tiene 5 instrucciones de las cuales se ejecutan unicamente 4 Por lo tanto el costo del programa en tiempo es de 4C siendo C una constante que indica cuanto tiempo tarda en ejecutarse una instruccioacuten

El espacio que necesita el programa es el espacio ocupado por las variables A y B Es decir 2 Ec siendo Ec el espacio que ocupa una variable

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 21: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

La maacutequina RAM de costo fijo es mucho maacutes realista que la maacutequina de Turing ya que puede verse claramente que a partir de un algoritmo escrito para la maacutequina RAM podemos desarrollar un algoritmo escrito en C Pascal u otro lenguaje para una computadora actual

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 22: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Este acercamiento a la realidad en el coacutedigo de la maquina RAM no se evidencia en cuanto al costo ya que el modelo planteado en el cual todas las instrucciones tienen un costo fijo no es real ya que hay algunas instrucciones que son claramente mas costosas que otras por ejemplo una multiplicacioacuten insume mas tiempo que una suma en cualquier computadora

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 23: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

MAacuteQUINA RAM DE COSTO VARIABLE En la maacutequina RAM de costo variable

cada instruccioacuten Ii tiene asociado un costo Ci que le es propio y que depende del costo de implementar dicha instruccioacuten

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 24: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Para el Algoritmo 2 en una maacutequina de costo variable el costo seraacute

3C1 + 1C2+ 1C3

dondeC1 costo de una asignacioacutenC2 costo de una multiplicacioacutenC3 costo de comparar dos nuacutemeros

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 25: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

El costo del espacio en la maacutequina RAM de costo variable es igual al de la maacutequina RAM de costo fijo

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 26: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Claramente observamos que pese a ganar claridad en cuanto a la escritura de programas perdemos precisioacuten y se hace maacutes complejo el calculo de costos

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 27: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Potencia1(xy) Calcula xy

Require x gt 0 if y == 0 then

return 1else

result larr xfor i = 0 to y ndash 1 do

result larr result x

end forend ifreturn result

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 28: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

iquestCuaacutento cuesta el algoritmo en tiempo La comparacioacuten del if se ejecuta siempre y supongamos que y no es cero lo cual va a pasar la mayoriacutea de las veces Se ejecuta una asignacioacuten y luego y - 1 veces una multiplicacioacuten

T = C1 + C2 + (y-1)(C3 + C1)

C1 costo de comparar dos nuacutemeros

C2 costo de realizar una asignacioacuten

C3 costo de realizar una multiplicacioacuten

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 29: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Por ejemplo si queremos hacer 28 el algoritmo calcula

28 = 2 2 2 2 2 2 2 2

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 30: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Pero se podriacutea hacer

A = 2 2(22)B = A A(24)C = B B(28)

con lo cual en lugar de multiplicaciones se utilizan solamente tres Por lo tanto podriacutea haber un algoritmo maacutes eficiente

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 31: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Potencia2(xy)Calcula xy

Require x gt 0 if y == 0 then

return 1elser larr 1if y gt1 then

r larr Potencia2(xy2)r larr r r

end ifif y mod 2 == 1 then

r larr r xend ifreturn result

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 32: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

1 2 3

r1 = 17 gt 1r1 = potencia2(23)

r2 = 13 gt 1r2 = potencia2(21)

r3 = 1y = 1y 2 = 1r3 = 1 2

1 2 3

return 2r2 = 2 2y 2 = 1r2 = 4 2return 8

r = 8 8y 2 = 1r = 64 2return 128

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 33: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Como podemos ver el algoritmo es recursivo y en nuestro ejemplo para y = 7 realizo 5 multiplicaciones contra las seis que hariacuteamos en el algoritmo tradicional

Para valores mas grandes de y la diferencia entre el primer y el segundo algoritmo se hace mucho maacutes notoria

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 34: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

ALGORITMOS ITERATIVOS

Los algoritmos iterativos son aquellos que se basan en la ejecucioacuten de ciclos que pueden ser de tipo forwhile repeat etc La gran mayoriacutea de los algoritmos tienen alguna parte iterativa y muchos son puramente iterativos

Analizar el costo en tiempo de estos algoritmos implica entender cuantas veces se ejecuta cada una de las instrucciones del algoritmo y cual es el costo de cada una de las instrucciones

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 35: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Ciclos simples

for i = 1 to n do

instruccioacuten

end for

El calculo en costo de un ciclo simple puede hacerse utilizando una sumatoria

CnCn

i

1

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 36: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Ciclos anidados independientes

for I = 1 to n do

for J = 3 to m do

Instruccioacuten

end for

end for

CmnCmCn

i

n

i

m

j

)2()2(11 3

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 37: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Ciclos anidados dependientes

for i = 1 to n do

for j = i to n do

Instruccioacuten

end for

end for

22

22

2

)1(

1)1(

)1(

222

1111

11

nnC

nnnnC

nnn

nnC

inCinC

CinC

n

i

n

i

n

i

n

i

n

i

n

i

m

ij

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 38: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

SORT POR BURBUJEO

Uno de los algoritmos de uso mas comuacuten es el de ordenamiento

Burbujeo(An)

Ordena el vector A

for i 1048576 to n 1048576 do

for j i 1048576 to n do

if Aj Ai then

SwapAiAj

end if

end for

end for

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 39: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

El costo del algoritmo lo vamos a calcular suponiendo que C1 es el costo de efectuar la comparacion y que C2 es el costo de efectuar el SWAP

Sin embargo el SWAP no se hace siempre sino que se hace uacutenicamente cuando la comparacioacuten da A[j] gt A[i] por ello debemos partir el anaacutelisis en tres casos el peor caso el mejor caso y el caso medio

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 40: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Peor caso

En el peor caso el algoritmo siempre hace el Swap Esto ocurre cuando el vector viene ordenado en el orden inverso al que utilizamos

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 41: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Por ejemplo para n = 8 el peor caso nos da (C1 + C2)(32-12+1)=21(C1 + C2) un total de 21 Comparaciones y 21 Swaps

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 42: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Mejor caso

En el mejor caso el vector ya viene ordenado por lo que nunca efectuacutea ninguacuten swap el costo total es entonces el costo de las comparaciones que es igual a lo calculado antes

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 43: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Caso medio

En el caso medio el algoritmo efectuacutea todas las Comparaciones y solo la mitad de los Swaps

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 44: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

ORDEN DE UN ALGORITMO

El anaacutelisis de los algoritmos realizado es muy preciso pero resulta incomodo para entender que tan eficiente es un algoritmo o para poder compararlo contra otro algoritmo

Habitualmente no interesa cuanto tarda exactamente un algoritmo sino que nos interesa saber cual es la tasa de crecimiento del algoritmo en funcioacuten de los datos de entrada

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 45: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

ORDEN DE UN ALGORITMO

DEFINICIOacuteN

Tasa de crecimiento del tiempo que insume el algoritmo en funcioacuten de la cantidad o tamantildeo de los datos de entrada

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 46: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

COTAS DE COMPLEJIDAD MEDIDAS ASINTOacuteTICASNOTACIOacuteN ldquoOrdquo Para el estudio de algoritmos existe una

notacioacuten muy practica y utilizada universalmente en este tipo de problemas conocida como la gran ldquoOrdquo (Big-Oh notation) que define el orden de un algoritmo

Esta notacioacuten sirve para clasificar el crecimiento de las funciones

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 47: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

O(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones O(g(n)) si existe una constante C1 y un numero n0 tales que

0 le f(n) le C1 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda por debajo de la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el peor caso de un algoritmo

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 48: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Ω(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Ω (g(n)) si existe una constante C1 y un numero n0 tales que

C1 g(n) le f(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) siempre es mayor que la funcioacuten g(n) multiplicada por una constante

Sirve para acotar el mejor caso de un algoritmo

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 49: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Θ(g(n))

Sea una funcioacuten f(n) decimos que f(n) pertenece a la familia de funciones Θ(g(n)) si existen constantes C1 y C2 y un nuacutemero n0 tales que

C1 g(n) le f(n) le C2 g(n) para n ge n0

Es decir que a partir de un cierto n la funcioacuten f(n) queda atrapada entre C1 g(n) y C2 g(n)

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 50: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Θ O Ω

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 51: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Como un abuso de notacioacuten usaremos

f(n) = Ω(g(n))

f(n) = o(g(n))

f(n) = θ(g(n))

donde el signo igual debe leerse como pertenece

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 52: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

O(f(n)) + O(g(n)) = O(f(n)) sii f(n) crece maacutes raacutepido que g(n)

Por ejemplo n2 + n = O(n2)

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 53: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Aplicando esta notacioacuten a los algoritmos estudiados podemos ver que el mejor caso del burbujeo es Ω(n2) El peor caso es O(n2) por lo tanto el algoritmo de burbujeo es Θ(n2) Es decir que es un algoritmo de orden cuadraacutetico

El sort por insercioacuten en cambio en el mejor caso es Ω(n) y en el peor caso es O(n2) En el caso medio el algoritmo es O(n2) Por lo que tambieacuten tenemos un algoritmo de orden cuadraacutetico pero que en el mejor de los casos es lineal

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 54: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

Algunas funciones tiacutepicas ordenadas por orden de crecimiento

radicn lt log n lt n lt n log(n) lt nc lt xn lt n lt nn

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)

Page 55: ALGORITMOS 2 DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional © 2006

1 Para cualquier funcioacuten f se tiene que f Є O(f) 2 f Є O(g) O(f) O(sub g) 3 O(f) = O(g) hArr f O(isin g) y g O(isin f) 4 Si f O(isin g) y g O(isin h) rArr f O(isin h) 5 Si f O(isin g) y f O(isin h) rArr f O(min(isin gh)) 6 Regla de la suma Si f1 O(g) y isin f2 O(isin h) rArr f1 + f2 O(max(isin gh)) 7 Regla del producto Si f1 O(isin g) y f2 O(isin h) rArr f1middotf2 O(isin gmiddoth) 8 Si existe g n lim f n nrarrinfin = k dependiendo de los valores que tome k obtenemos a) Si k ne0 y k lt infin entonces O(f) = O(g) b) Si k = 0 entonces f O(isin g) es decir O(f) O(sub g) pero sin embargo se verifica que g O(notin f)