Cursada 2017
Optimizando algoritmos
Notacin Big-Oh
Definicin y ejemplos
Reglas (suma, producto)
Big-Oh
Omega
Theta
Definicin y ejemplos
1. T1(n)+T2 (n)=max(O(f(n)),O(g(n)))
2. T1(n)T2 (n)=O(f(n)g(n))
Decimos que
T(n) = (h(n))
Este conjunto de
funciones en general es
suficiente para describir la
tasa de crecimiento de los
algoritmos tpicos
Orden de
ejecucin Cantidad de Tiempo total Cantidad de Tiempo total
del algoritmo operaciones del algoritmo operaciones del algoritmo
n = 103 n = 106
Secuencia
Condicional:
if /else
Estructuras
switch
de
Control Iteracin:
for
while
do-while
b) if (boolean expression) {
statement(s)
} else {
statement(s)
}
Condicional:
c) do {
statement(s)
} while (boolean expression);
n
int [] a = new int [n]; T(n) =cte1+ cte2 +
int [] s = new int [n]; i=1
for ( int i =1; i<= n ; i++ ) n i
s[i] = 0; + cte3 =
i=1 j=1
for ( int i =1; i<= n ; i++) {
for (int j =1; j<= i ; j++) = cte1+ n *cte2 +
n
s[i] += a[j]; cte3 * i =
} i=1
O(n2)
Prof. Alejandra Schiavoni Programacin 3 Cursada 2017
Clculo del Tiempo de Ejecucin
Iteracin:
(n+1)/2
b) While
T(n) = cte1+ cte2 =
int x= 0; i=1
Si f(n) es:
a.- log 10 n
b.- n
a.- El doble
b.- El triple
n n/2 n 2*i
T (n) cte1 ( cte 2 cte 2)
i 1 i 1 j 2*i 1 j 1
n/2
T (n) cte1* n cte 2 * (n 2 * i 1 1 2 * i 1 1)
i 1
cte1* n cte 2 * (n 2) * n / 2
cte1* n cte 2 / 2 * n 2 cte 2 * n
T ( n) O ( n 2 )
Factorial (n)
cte1 n=1
T(n) =
cte2 + T(n - 1) n >1
T(n - 2) + cte2
T(n - 3) + cte2
T(n - 4) + cte2
Paso i:
T(n) = T(n - i) + i *cte2
T(1) = cte1
Ejemplo :
Encontrar el mximo elemento en un arreglo de
enteros tomando n posiciones a partir de la
posicin i
n
Arreglo a
i i + n -1
Mximo en un arreglo
cte1 n=1
T(n) =
2 * T(n/2) + cte2 n >1
2 * T(n/4) + cte2
2 * T(n/8) + cte2
2 * T(n/16) + cte2
Paso i:
T(n) = 2i * T(n/2i) + (2i 1) *cte2
T(1) = cte1
int ultimo = 1;
int anteUltimo = 1;
int resul= 1;
for( int i = 2; i <= n; i++ )
{
resul = ultimo + anteUltimo;
anteUltimo = ultimo;
ultimo = resul;
}
return resul;
}
cte1 n=1
T(n) =
2 * T(n/2) + n n >1
if (n <= 1)
return (1);
else {
suma=0;
for (int i=1; i<=m; i++)
suma=suma + i;
for (i=1; i<=m; i++)
suma=suma + recursivo(n-1);
return suma;
}
}
cte1 n <= 1
T(n) =
cte2 + m + m* T(n-1) n >1
Optimizando algoritmos
/**
* Driver for divide-and-conquer maximum contiguous
* subsequence sum algorithm. */
public static int maxSubSum3( int [ ] a ) {
return maxSumRec( a, 0, a.length - 1 );
}
/* END */
cte1 n=1
T(n) =
2 * T(n/2) + n + cte2 n >1
Buscar la sub-secuencia
de suma mxima de
cada mitad que incluye
2 llamadas recursivas los elementos centrales