Notacin Asinttica
Anlisis de Complejidad
Notacin Big O
Notacin Omega
Diseo y anlisis de algoritmos
Qu es un algoritmo ?
Por qu vale la pena estudiar algoritmos?
Algoritmos y su relacin con otras tecnologas utilizadas en las computadoras?
Forma en que especificamos los algoritmo
Estrategias de diseo
Qu tipos de problemas se resuelven mediante algoritmos?
Diseo y anlisis de algoritmos
Informalmente, un algoritmo es cualquier procedimiento computacional bien
definido que tome algn valor, o conjunto de valores, como entrada y produce
algn valor, o conjunto de valores, como salida. Un algoritmo es, por lo tanto, una
secuencia de pasos computacionales que transforman la entrada en la salida.
Tambin podemos ver un algoritmo como una herramienta para resolver un
problema de computacin bien especificado. La declaracin del problema
especifica en trminos generales relacin de entrada / salida. El algoritmo
describe un procedimiento computacional especfico para lograr esa relacin de
entrada / salida.
A esta secuencia de entrada se le llama una instancia del problema de
clasificacin. En general, una instancia de un problema consiste en la entrada
necesaria para calcular una solucin al problema.
Diseo y anlisis de algoritmos
Eficiencia
Diferentes algoritmos diseados para resolver el mismo problema a menudo
difieren en su eficiencia.
Estas diferencias pueden ser mucho ms significativas que las diferencias debido
al hardware y software.
Diseo y anlisis de algoritmos
Anlisis de algoritmos
Analizar un algoritmo ha llegado a significar predecir los recursos que el algoritmo
requiere. Ocasionalmente, recursos como memoria, ancho de banda de
comunicacin, o el hardware de la computadora son de la preocupacin primaria,
pero la mayora de las veces es computacional tiempo que queremos medir. Por lo
general, al analizar varios Algoritmos para un problema, podemos identificar uno
ms eficiente. Tal anlisis puede Indican ms de un candidato viable, pero a
menudo podemos desechar varios Algoritmos en el proceso.
Diseo y anlisis de algoritmos
Conceptos bsicos
Un algoritmo es:
Siempre correcto
Siempre termina
Debe tener un rendimiento aceptable
Se dice que un algoritmo es correcto si, para cada instancia de entrada, se detiene
con el salida correcta. Un algoritmo correcto resuelve el clculo computacional
dado un problema.
Un algoritmo siempre termina, es un conjunto finito de pasos.
El rendimiento suele trazar la lnea entre lo que es posible y lo que es imposible
Diseo y anlisis de algoritmos
Diseo y Anlisis de Algoritmos
Anlisis: predecir el costo de un algoritmo en trminos de recursos y rendimiento
Diseo: diseo de algoritmos que minimizan el coste
EJEMPLO
El siguiente ejemplo muestra como se puede hacer un anlisis de complejidad
de un algoritmo. Dado como entrada un arreglo A de tamao n:
var M = A[ 0 ];
for ( var i = 0; i < n; ++i ) {
if ( A[ i ] >= M ) {
M = A[ i ];
}
}
Diseo y anlisis de algoritmos
Iniciamos con la instruccin varM = A[ 0 ]; Esta requiere 2
instrucciones: una para buscarA[ 0 ] y otra para asignar el valor
aM(asumimos que n siempre es al menos 1).
Una asignacin y una comparacin: i = 0; i < n;
Estas corrern antes de la primera iteracinforloop.
var M = A[ 0 ];
Despus de cada iteracinforloop, necesitaremos ejecutar dos
for ( var i = 0; i < n; ++i ) {
instrucciones ms: un incremento deiy una comparacin: ++i;
if ( A[ i ] >= M ) {
i < n;
M = A[ i ];
} Entonces, si ignoramos el cuerpo del bucle, el nmero de
instrucciones que necesita este algoritmo son 4 + 2n.
}
if( A[ i ] >= M ) { ...
Eso seran dos instrucciones. Si ocurriese queA[ i ] >= M,
entonces ejecutaremos dos instrucciones adicionales una
bsqueda en arreglo y una asignacin: M = A[ i ]. Estas dos
instrucciones ocurren siempre.
Diseo y anlisis de algoritmos
Anlisis del Peor (Caso Worst-Case)
Lo peor que puede ocurrir: A = [ 1, 2, 3, 4 ]
mejor casoA = [ 4, 3, 2, 1 ].
Entonces, en el peor de los casos, tenemos 4 instrucciones para
ejecutar dentro del cuerpo delforpor lo que tenemos:
f( n ) = 4 + 2n + 4n O sea f(n) = 6n + 4
En anlisis de complejidad solamente nos preocupamos de lo que ocurre
con la funcin contadora de instrucciones a medida que crece la entrada
(n) del programa. Es decir, descartamos los trminos constantes tanto
los independientes como los que multiplican a n. Quedndonos f( n ) = n
Diseo y anlisis de algoritmos
Asumiremos que nuestro procesador puede ejecutar las siguientes instrucciones
por separado:
Asignar un valor a una variable
Buscar el valor de un elemento en particular en un arreglo
Comparar dos valores
Incrementar un valor
Operaciones aritmticas bsicas tales como adicin y multiplicacin
Comportamiento Asinttico(Asymptotic Behavior)
Cuando hayamos encontrado la f asinttica exacta, diremos que
nuestro programa es ( f( n ) ). Por ejemplo, el programa anterior es
( n ) y se pronuncia "theta de n".
Comportamiento Asinttico(Asymptotic Behavior)
Encontremos el comportamiento asinttico de las siguientes funciones, mediante la
eliminacin de los factores constantes y manteniendo los trminos que crecen ms
rpido:
1. f( n ) = 5n + 12 queda en f( n ) = n. Usando el mismo razonamiento
2 . f( n ) = 109 queda en f( n ) = 1.
Estamos eliminando el multiplicador 109*1, pero todava tenemos que poner un 1,
para indicar que esta funcin tiene un valor distinto de 0.
3 . f( n ) = n2 + 3n + 112 queda en f( n ) = n2
Aqu, n2 crece ms rpido que 3n, para un n suficientemente grande, asique slo
mantenemos n2.
4 f( n ) = n3 + 1999n + 1337 queda en f( n ) = n3
Comportamiento Asinttico(Asymptotic Behavior)
4 . f( n ) = n3 + 1999n + 1337 queda en f( n ) = n3
Aunque el factor en frente de n es bastante grande, an podemos encontrar
un n suficientemente grande de modo de que n3 sea mayor que 1999n. Como slo
estamos interesados en el comportamiento de valores muy grandes de n, slo
mantenemos n3 (Ver Figura 2).
5 f( n ) = n + queda en f( n ) = n (Esto es porque n crece ms rpido que a medida
que incrementamos n)
Comportamiento Asinttico(Asymptotic Behavior)
Figura 2.
n3
1999n
Comportamiento Asinttico(Asymptotic Behavior)
Ejercicio 1
a) f( n ) = n6 + 3n
b) f( n ) = 2n + 12
c) f( n ) = 3n + 2n
d) f( n ) = nn + n
Comportamiento Asinttico(Asymptotic Behavior)
Ejercicio 1 (Solucin)
a) n6 + 3n ( n6 )
b) 2n + 12 ( 2n )
c) 3n + 2n ( 3n )
d) nn + n ( nn )
Regla General
Regla General No.1: El anlisis de programas sencillos se puede hacer contando los ciclos anidados que
contiene el programa. Un slo bucle sobre n tems genera f(n)=n. Un ciclo dentro de otro ciclo f( n ) = n 2.
Un ciclo dentro de un ciclo que est dentro de otro ciclo genera f( n ) = n 3.
Si tenemos un programa que invoca una funcin dentro de un ciclo, y sabemos el nmero de instrucciones
que la funcin invocada realiza n instrucciones, entonces es fcil determinar el nmero de instrucciones
de todo el programa. De hecho, demos una mirada al siguiente ejemplo (Siguiente diapositiva).
Regla General No.2: Dado un conjunto de ciclos que son secuenciales, el ms lento de ellos determina el
comportamiento asinttico del programa. Dos ciclos anidados, seguidos por un solo ciclo, asintticamente
es lo mismo que los bucles anidados por s solos, ya que los ciclos anidados dominan el ciclo individual.
Regla general No.3: Programas con un mayor corren ms lentamente que programas con un menor.
Ejemplo: cuando se llama a una funcin dentro de un ciclo.
var M = A[ 0 ];
for ( var i = 0; i < n; ++i ) {
funcion(n); // funcin de orden n.
}
}
Orden f(n) = n2. Para el caso en funcion(n) se realice n veces
Anlisis de Algoritmos
Siempre nos va a interesar el peor caso de un algoritmo.
Cada algoritmo presenta una funcin que describe su comportamiento en el peor
caso.
Nos interesa la funcin que crece ms sin importar el coeficiente que lo
acompae.
Por ejemplo, si un algoritmo dura entonces su tiempo de ejecucin crece
Sin embargo, los trminos no nos interesan, por lo que queda .
Ejemplo
Bsqueda Lineal:
for (int i = 0; i < array.length; i++){
if(array[i] == value){
return i;
}
return -1;
}
Suponga que c1 es el tiempo constante que toman las operaciones en caf. Estas dependen de las
iteraciones del ciclo for.
Suponga que c2 es el tiempo constante que duran las operaciones de azul. Se ejecutan una nica
vez.
El peor caso de este algoritmo es cuando el valor no se encuentra en la lista. En este caso, el
algoritmo se ejecutar n veces, donde n es el largo de la lista.
Por lo que este algoritmo tomara c1 n + c2.
Notacin Theta: (f(n))
Tiempo ejecucin en el peor caso: c1 n + c2
Nos interesa nicamente la funcin que crece ms y descartamos las
constantes, por lo que tendramos que el tiempo es n.
A ese tiempo le llamamos (n).
Este se lee Theta de n.
Notacin Theta: (f(n))
Se refiere a la cota ajustada (inferior y superior) en el que la funcin
f(n) se encuentra dentro de 2 valores k1 y k2.
Notacin Theta: (f(n))
Definicin formal:
Decimos que f(n) es (g(n)) s
Otra forma para decir que es f(n) es (g(n)), es demostrando lo siguiente:
y
Notacin O Grande: O(f(n))
Se refiere a la cota superior en el que la funcin f(n) se puede
encontrar dado un valor k.
Notacin O Grande: O(f(n))
Definicin formal:
Decimos que f(n) es O(g(n)) s
En otras palabras, la funcin f crece ms lentamente o es menor que la
funcin g multiplicada por una constante mayor a 0.
Notacin o pequea: o(f(n))
Tambin existe la notacin o pequea. o(f(n)) describe un caso
particular de O grande, teniendo la siguiente definicin.
f(n) es o(g(n)) s:
Note que el nico cambio fue .
Notacin O Grande: O(f(n))
Ejemplos:
Notacin Omega: (f(n))
Se refiere a la cota inferior en el que la funcin f(n) se puede
encontrar dado un valor k.
Notacin Omega: (f(n))
Definicin formal:
Decimos que f(n) es (g(n)) s
En otras palabras, la funcin f crece ms rpidamente o es mayor que la
funcin g multiplicada por una constante mayor a 0.
Notacin omega pequea: w(f(n))
Tambin existe la notacin omega pequea. (f(n)) describe un caso
particular de omega, teniendo la siguiente definicin.
Decimos que f(n) es (g(n)) s
Notacin Omega: (f(n))
Ejemplos:
Ejemplos - Demostraciones
demostrar que una funcin f es O u Omega de otra funcin g, se aplican las
Para
definiciones y se buscan los valores de para que se cumpla la desigualdad.
Note que el valor de define el intervalo de valores para que la funcin la cual se
quiere demostrar cumpla la desigualdad.
Ejemplos - Demostraciones
() = 10 () = () (())?
La definicin de O grande nos dice que para que f(n) sea O(g(n)), se cumple que:
Hay que calcular los valores de c y
para que la definicin se cumpla
Este valor de c, hace que la funcin
sea mayor que 10n.
Este valor de , hace que los valores
que recibe la funcin 11n, cumpla
la desigualdad
Ejemplos - Demostraciones
?
La definicin de O grande nos dice que para que f(n) sea O(g(n)), se cumple que:
Hay que calcular los valores de c y
para que la definicin se cumpla
Se cancelan los n.
Recuerde que una funcin lineal
crece ms rpido que una
constante.
Ejemplos - Demostraciones
?
La definicin de O grande nos dice que para que f(n) sea O(g(n)), se cumple que:
Hay que calcular los valores de c y
para que la definicin se cumpla
Este valor de c hace que sean
iguales. Note que =
Se cancelan los 2. Como las
funciones son iguales, cualquier n
funciona, ya que la desigualdad es
mayor o igual. Particularmente
con .
Ejemplos - Demostraciones
?
La definicin de Omega Grande nos dice que para que f(n) sea (g(n)), se cumple que:
Hay que calcular los valores de c y para
que la definicin se cumpla
Se cancelan el n! con n!
Recuerde que (n+1)! = (n+1) * n!
Recuerde que una funcin lineal crece
ms rpido.
Funciones de ms lentas a mas
rpidas
Existen ms funciones, pero estas son las ms comunes.
Orden de la complejidad:
a) log(n)
Resumen
Algoritmo es o( algo ) Un nmero es < algo
Algoritmo es O( algo ) Un nmero es algo
Algoritmo es ( algo ) Un nmero es = algo
Algoritmo es ( algo ) Un nmero es algo
Algoritmo es ( algo ) Un nmero es > algo