Las matemáticas como Las matemáticas como medio para medir la medio para medir la
eficiencia de los Algoritmos eficiencia de los Algoritmos ComputacionalesComputacionales
¿Qué es un algoritmo?¿Qué es un algoritmo?
““(del árabe al-Khowârizmî, sobrenombre del (del árabe al-Khowârizmî, sobrenombre del célebre matemático árabe Mohámed ben célebre matemático árabe Mohámed ben Musa). Conjunto ordenado y finito de Musa). Conjunto ordenado y finito de operaciones que permite encontrar la operaciones que permite encontrar la solución a un problema…”solución a un problema…”
Un algoritmo, puede expresarse en términos Un algoritmo, puede expresarse en términos de un lenguaje de programación, para de un lenguaje de programación, para obtener un programa que resuelve el obtener un programa que resuelve el problema por medio de la computadora.problema por medio de la computadora.
Cita...Cita...
““No hay un incremento concebible en el poder de las No hay un incremento concebible en el poder de las computadoras que pueda saturar la demanda científica: aún computadoras que pueda saturar la demanda científica: aún pensando que una computadora posea un ciclo de tiempo pensando que una computadora posea un ciclo de tiempo subnuclear (10subnuclear (10-23-23 seg.) y densidades de almacenamiento seg.) y densidades de almacenamiento subnucleares (10subnucleares (103939 bits/cm bits/cm33), ésta no podría manejar la ), ésta no podría manejar la mayoría de los problemas que son importantes en la mayoría de los problemas que son importantes en la investigación científica básica y aplicada. Por lo tanto, existirá investigación científica básica y aplicada. Por lo tanto, existirá siempre una fuerte presión para incrementar la siempre una fuerte presión para incrementar la eficienciaeficiencia de de los programas, para poder incrementar también la cantidad de los programas, para poder incrementar también la cantidad de información últil generada por un programa.”información últil generada por un programa.”
Ken Wilson, Nóbel de Física 1982Ken Wilson, Nóbel de Física 1982
Áreas de estudioÁreas de estudio
¿Cómo construir algoritmos?¿Cómo construir algoritmos? Técnicas de diseñoTécnicas de diseño
¿Cómo expresar algoritmos?¿Cómo expresar algoritmos? Enfoques de los lenguajes de programaciónEnfoques de los lenguajes de programación
¿Cómo validar algoritmos?¿Cómo validar algoritmos? Verificación formalVerificación formal
¿Cómo analizar algoritmos?¿Cómo analizar algoritmos? Complejidad computacional, eficiencia, legibilidad, Complejidad computacional, eficiencia, legibilidad,
usabilidad, etc...usabilidad, etc...
Análisis de algoritmosAnálisis de algoritmos
Si se tuvieran 2 programas que hacen lo Si se tuvieran 2 programas que hacen lo mismo, ¿cómo se podrían comparar?mismo, ¿cómo se podrían comparar?
1. Eficiencia:1. Eficiencia:Tiempo de ejecuciónTiempo de ejecuciónUso de espacios de memoriaUso de espacios de memoria
2. Facilidad de lectura, mantenimiento, 2. Facilidad de lectura, mantenimiento, rapidez para codificarlo.rapidez para codificarlo.
Medición del tiempo de Medición del tiempo de ejecuciónejecución
El tiempo de ejecución depende de:El tiempo de ejecución depende de:1. La entrada al programa:1. La entrada al programa:
Su tamañoSu tamaño
Sus característicasSus características
2. La calidad del código generado para el 2. La calidad del código generado para el programa por el compilador .programa por el compilador .
3. La rapidez de las instrucciones de máquina.3. La rapidez de las instrucciones de máquina.
4. La 4. La complejidad de tiempo del algoritmocomplejidad de tiempo del algoritmo..
¿Cómo medir?¿Cómo medir?
Cantidad de instrucciones básicas (o Cantidad de instrucciones básicas (o elementales) que se ejecutan.elementales) que se ejecutan.
Ejemplos de instrucciones básicas:Ejemplos de instrucciones básicas: asignación de escalaresasignación de escalares lectura o escritura de escalareslectura o escritura de escalares saltos (goto’s) implícitos o explícitos.saltos (goto’s) implícitos o explícitos. evaluación de condicionesevaluación de condiciones llamada a funcionesllamada a funciones etc.etc.
EjemploEjemplo
cont = 1;cont = 1;
while (cont <= n) dowhile (cont <= n) do { {
x = x + a[cont];x = x + a[cont];
x = x + b[cont];x = x + b[cont];
cont = cont + 1;cont = cont + 1;
}}
1n+1nnnn (goto implícito)1 goto en falso.
TOTAL: TOTAL: 5n + 5n + 33
EjemploEjemplo
z = 0;z = 0;
for for (int (int x=1x=1; x<=; x<=nn; x++); x++)
for for (int y(int y=1=1; y<=; y<=nn; y++); y++)
z = z + a[x,y];z = z + a[x,y];
11 asignación + (n+1) comparaciones
(n+2)*n = n2 +2nn*n = n2
2n2 (incremento + goto implícito)n (goto en falso for y)2n (incremento + goto implícito)1 (goto en falso for x)
TOTAL: TOTAL: 44nn22 + + 66n + n + 44
Consecuencia…Consecuencia…
Se requiere contar con una notación que permita Se requiere contar con una notación que permita comparar la eficiencia entre los algoritmos…comparar la eficiencia entre los algoritmos…
La La NOTACIÓN ASINTÓTICANOTACIÓN ASINTÓTICA es la propuesta de notación es la propuesta de notación aceptada por la comunidad científica para describir el aceptada por la comunidad científica para describir el comportamiento en eficiencia (o complejidad) de un comportamiento en eficiencia (o complejidad) de un algoritmo.algoritmo.
Describe en forma sintética el comportamiento de la Describe en forma sintética el comportamiento de la función que con la variable de entrada, determina el función que con la variable de entrada, determina el número de operaciones que realiza el algoritmo.número de operaciones que realiza el algoritmo.
NOTACIÓN ASINTÓTICANOTACIÓN ASINTÓTICA
COMPLEJIDAD TEMPORAL COMPLEJIDAD TEMPORAL (y ESPACIAL)(y ESPACIAL). . Tiempo Tiempo (o espacio)(o espacio) requerido por un algoritmo, requerido por un algoritmo, expresado en base a una función que depende expresado en base a una función que depende del tamaño del problema.del tamaño del problema.
COMPLEJIDAD TEMPORAL ASINTÓTICA COMPLEJIDAD TEMPORAL ASINTÓTICA (y (y ESPACIAL)ESPACIAL). Comportamiento límite conforme el . Comportamiento límite conforme el tamaño del problema se incrementa. Determina tamaño del problema se incrementa. Determina el tamaño del problema que puede ser resuelto el tamaño del problema que puede ser resuelto por un algoritmo.por un algoritmo.
DefiniciónDefinición
Se dice que la función Se dice que la función f(n)f(n) “es de orden “es de orden g(n)g(n)” ” [[O(g(n))O(g(n))], si existen constantes positivas ], si existen constantes positivas cc y y nn00
tales que tales que f(n)f(n) <= <= c g(n)c g(n) cuando cuando nn >= >= nn00
Ejemplos:Ejemplos: n+5n+5 es es O(n)O(n) pues pues n+5n+5 <= <= 2n2n para toda para toda nn >= 5 >= 5 (n+1)(n+1)22 es es O(nO(n22)) pues pues (n+1)(n+1)22 <= <= 4n4n22 para para nn>= 1>= 1 (n+1)(n+1)22 NONO es es O(n)O(n) pues para cualquier pues para cualquier c > 1c > 1
no se cumple que no se cumple que (n+1)(n+1)22 <= <= c*nc*n
Ordenes más comunes de los Ordenes más comunes de los algoritmosalgoritmos
O(1) ConstanteO(1) Constante O(n) LinealO(n) Lineal O(nO(n2 2 ) Cuadrático) Cuadrático O(nO(n3 3 ) Cúbico) Cúbico O (nO (nm m ) Polinomial) Polinomial O(log(n)) LogarítmicoO(log(n)) Logarítmico O(nlog(n)) nlog (n)O(nlog(n)) nlog (n) O(mO(mn n ) exponencial) exponencial O(n!) factorialO(n!) factorial
Comportamiento Comportamiento de las funcionesde las funciones
log n
n
n log n
n sqrt(n)
n2
Otro método para calcular el orden Otro método para calcular el orden de un problemade un problema
Consiste en aplicar reglas a los estatutos Consiste en aplicar reglas a los estatutos estructurados:estructurados:
1.1.Secuencia de instruccionesSecuencia de instrucciones
2.2.Decisiones (ejemplo: if)Decisiones (ejemplo: if)
3.3.Ciclos (ejemplo: while)Ciclos (ejemplo: while)
4.4.RecursividadRecursividad
Regla 1: Secuencia de Regla 1: Secuencia de instruccionesinstrucciones
Ejemplo:Ejemplo: Una secuencia de 3 ciclos:Una secuencia de 3 ciclos:
Ciclo 1 = Ciclo 1 = O(n)O(n) Ciclo 2 = Ciclo 2 = O(log n)O(log n) Ciclo 3 = Ciclo 3 = O(nO(n22))
Tendrá como orden total…Tendrá como orden total… O(nO(n22))..
O(g1(n))O(g1(n))
O(g2(n))O(g2(n))
O(g3(n))O(g3(n))
O(gm(n))O(gm(n))
≈ O( mayor(g1(n), g2(n), …, gm(n) )
Regla 2: Regla 2: DecisionesDecisiones
Ejemplo:Ejemplo: Una decisión con:Una decisión con:
Rama then = Rama then = O(n log n)O(n log n) Rama else = Rama else = O(log n)O(log n)
Tendrá como orden total… Tendrá como orden total… O(n log n)O(n log n)..
O(g1(n))O(g1(n))
O(g2(n))O(g2(n))
≈ O( mayor(g1(n), g2(n)) )
Regla 3: Regla 3: CiclosCiclos
Ejemplo:Ejemplo: Un ciclo cuya instrucción:Un ciclo cuya instrucción:
Tiene un Tiene un O(log n)O(log n) Se repite Se repite n/2n/2 veces veces
Tendrá como orden total… Tendrá como orden total… O(O(½ n log n½ n log n) = O(n log n)) = O(n log n)..
O(g(n))O(g(n))
≈ O( m * g(n) )
Se repite m veces
Consideraciones especialesConsideraciones especiales
En decisiones y ciclos anidados:En decisiones y ciclos anidados: Analizar el código desde la instrucción más Analizar el código desde la instrucción más
interna hacia el más externa.interna hacia el más externa. Tip para los ciclos:Tip para los ciclos:
¿“Normalmente” cuál es el orden de la ¿“Normalmente” cuál es el orden de la instrucción interna?instrucción interna? Si la variable de control se incrementa o Si la variable de control se incrementa o
decrementa con un valor constante: decrementa con un valor constante: Orden Orden LINEALLINEAL..
Si la variable de control se multiplica o divide por Si la variable de control se multiplica o divide por un valor constante: un valor constante: Orden LOGARÍTIMICOOrden LOGARÍTIMICO..
Ejemplo: Sort por intercambioEjemplo: Sort por intercambio
for for (int (int i=1i=1; i<n; i++); i<n; i++)
for for (int (int j=i+1j=i+1; j<=; j<=nn;j++);j++)
if if ((a[ j ] < a[ i ]a[ j ] < a[ i ]))
intercambia(a[ i ], a[ j ]);intercambia(a[ i ], a[ j ]); → O( )11→ O( )
Regla 2: Decisiones = mayor de las 2 ramas
Ejemplo: Sort por intercambioEjemplo: Sort por intercambio
for for (int (int i=1i=1; i<n; i++); i<n; i++)
for for (int (int j=i+1j=i+1; j<=; j<=nn;j++);j++)
if if ((a[ j ] < a[ i ]a[ j ] < a[ i ]))
intercambia(a[ i ], a[ j ]);intercambia(a[ i ], a[ j ]);→ O( )
1→ O( )
Peor caso: se repite n-1 veces
n
Regla 3: Ciclos = # veces * orden de la instrucción interna
Ejemplo: Sort por intercambioEjemplo: Sort por intercambio
for for (int (int i=1i=1; i<n; i++); i<n; i++)
for for (int (int j=i+1j=i+1; j<=; j<=nn;j++);j++)
if if ((a[ j ] < a[ i ]a[ j ] < a[ i ]))
intercambia(a[ i ], a[ j ]);intercambia(a[ i ], a[ j ]);
→ O( )n2→ O( )
Se repite n-1 veces
n
Regla 3: Ciclos = # veces * orden de la instrucción interna
Ejemplo: Multiplicación de Ejemplo: Multiplicación de matricesmatrices
a11 a12 … a1n
a21 a22 … a2n
… … … …
am1 am2 … amn
b11 b12 … b1m
b21 b22 … b2m
… … … …
bn1 bn2 … bnm
X
c11 = a11*b11+a12 *b21 +…+ a1n *bn1
c12 = a11*b12+a12 *b22 +…+ a1n *bn2
…
c21 = a21*b11+a22 *b21 +…+ a2n *bn1
…
cmm = am1*b1m+am2 *b2m +…+ amn *bnm
c11 c12 … c1m
c21 c22 … c2m
… … … …
cm1 cm2 … cmm
=
ccijij = = a aikikbbkjkj
nn
k=1k=1
Ejemplo: Multiplicación de Ejemplo: Multiplicación de matricesmatrices
for i = 1 to n dofor i = 1 to n do
for j = 1 to n dofor j = 1 to n do
C[i,j] = 0;C[i,j] = 0;
for k = 1 to n dofor k = 1 to n do
C[i,j] = C[i,j] + A[i,k]*B[k,j];C[i,j] = C[i,j] + A[i,k]*B[k,j];O( 1 ) ←
O( n ) ←
O( n2 ) ←O( n3 ) ←
O( 1 ) ←
Regla 4: RecursividadRegla 4: Recursividad
La complejidad de tiempo se obtiene contando la cantidad de La complejidad de tiempo se obtiene contando la cantidad de veces que se hace veces que se hace la llamada recursivala llamada recursiva..
Casos que “normalmente” se dan:Casos que “normalmente” se dan: Orden LINEAL si sólo se tiene una llamada recursiva, con Orden LINEAL si sólo se tiene una llamada recursiva, con
incrementos o decrementos en el parámetro de control.incrementos o decrementos en el parámetro de control. Orden LOGARITMICO si sólo se tiene una llamada Orden LOGARITMICO si sólo se tiene una llamada
recursiva, con multiplicaciones o divisiones en el recursiva, con multiplicaciones o divisiones en el parámetro de control.parámetro de control.
Si hay más de una llamada recursiva, el orden puede Si hay más de una llamada recursiva, el orden puede tender a ser EXPONENCIAL.tender a ser EXPONENCIAL.
Ejemplo: Fibonacci (Iterativo)Ejemplo: Fibonacci (Iterativo)
ant = 1;ant = 1; --> 1--> 1act = 1;act = 1; --> 1--> 1while (n>2)while (n>2){{ --> n-2 + 1--> n-2 + 1 aux = ant + act;aux = ant + act; --> n-2--> n-2 ant = act;ant = act; --> n-2--> n-2 act = aux;act = aux; --> n-2--> n-2 n = n - 1;n = n - 1; --> n-2--> n-2}} --> n-2--> n-2+1+1write (act);write (act); --> 1--> 1
T(n) = 6n-7
Por lo tanto el orden del algoritmo es O(n)O(n)
Ejemplo: Fibonacci (recursivo)Ejemplo: Fibonacci (recursivo)
Function fibonacci (n:int): int;Function fibonacci (n:int): int;
if (n < 3) return 1;if (n < 3) return 1;
else return fibonacci(n-1) + fibonacci(n-2);else return fibonacci(n-1) + fibonacci(n-2); ¿Cómo obtener la complejidad de tiempo del ¿Cómo obtener la complejidad de tiempo del
algoritmo?algoritmo? Cantidad de llamadas recursivas: Cantidad de llamadas recursivas: 2 en cada 2 en cada
llamada.llamada. Algoritmo de orden: Algoritmo de orden: O(2O(2n/2n/2))
Análisis de Fibonacci Análisis de Fibonacci (recursivo)(recursivo)
¿Cuántos términos ¿Cuántos términos se requieren para se requieren para calcular:calcular:
f(5)?f(5)?
f(4)?f(4)?
f(3)?f(3)?
f(2)?f(2)?
f(6)?f(6)?
f(5)
f(3)
f(1) f(2)
f(4)
f(2) f(3)
f(1) f(2)
--> 9--> 5--> 3--> 1--> 15
Relación:El término T(n) requiereT(n-1)+T(n-2)+1 términos para calcularse.
Análisis de FibonacciAnálisis de Fibonacci
Si el término Si el término T(n)T(n) requiere requiere T(n-1)+T(n-T(n-1)+T(n-2)+12)+1 términos para calcularse… términos para calcularse…
se puede decir que se puede decir que T(n) > 2 * T(n-2)T(n) > 2 * T(n-2) …… y por lo tanto: y por lo tanto: T(n) > 2 * 2 * T(n-4)T(n) > 2 * 2 * T(n-4) … … y y T(n) > 2 * 2 * 2 * T(n-6)T(n) > 2 * 2 * 2 * T(n-6) …… y así sucesivamente hasta: y así sucesivamente hasta:
T(n) > 2 * 2 * 2 * …. * 2 * T(1)T(n) > 2 * 2 * 2 * …. * 2 * T(1)
n/2 veces
Por lo tanto:T(n) > 2n/2
y podemos decir que el orden del
algoritmo es
O(2O(2n/2n/2))