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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
Ω(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)
Θ(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)
Θ 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)
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)
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)
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)
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)
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)
Top Related