Documente Academic
Documente Profesional
Documente Cultură
Notacin asinttica
Elementos matemticos
1
Metodologas para el anlisis de
algoritmos
La complejidad de un algoritmo estudia los
recursos necesarios (tiempo y memoria) que
requiere un algoritmo.
El tiempo de ejecucin de un algoritmo o es
prioritario cuando se analiza un algoritmo.
El tiempo de ejecucin de un algoritmo o
estructura de datos depende de varios factores
relativos al hardware (procesador, reloj, memoria,
disco, etc) y el software (sistema operativo,
lenguaje, compilador, etc.).
2
Metodologas para el anlisis de
algoritmos
Medida del tiempo de ejecucin:
experimentacin.
Escribir un programa que implemente el algoritmo.
Ejecutar el programa con un conjunto de datos que
varan en tamao y composicin (peor caso, mejor
caso, caso promedio) .
Usar un mtodo como System.currentTimeMillis() para
obtener una medida precisa del tiempo de ejecucin.
3
Metodologas para el anlisis de
algoritmos
Medida del tiempo en Java: experimentacin.
4
Metodologas para el anlisis de
algoritmos
Medida del tiempo en Java: experimentacin.
t (ms)
60
50
40
30
20
10
n
0 50 100
5
Metodologas para el anlisis de
algoritmos
Medida del tiempo en Java (ms preciso):
7
Metodologas para el anlisis de
algoritmos
Adicionalmente a la experimentacin conviene
disponer de un enfoque analtico que:
Tome en consideracin todas las posibles entradas.
Permita evaluar la eficiencia de dos algoritmos de
forma independiente del hardware y software.
Se pueda realizar estudiando una representacin de alto
nivel del algoritmo sin necesidad de implementarlo.
8
Anlisis de algoritmos
Operaciones Primitivas: se pueden identificar en
el pseudocdigo instrucciones de bajo nivel
independientes del lenguaje de programacin.
Ejemplos:
llamar un mtodo y retornar de un mtodo
operaciones aritmticas (e.g. suma)
comparacin de dos nmeros, etc.
Inspeccionando el pseudocdigo se puede contar
el nmero de operaciones primitivas ejecutadas
por un algoritmo.
9
Ejemplo de conteo
Algorithm arrayMax(A, n):
Input: Un array A que almacena n enteros.
Output: El mximo elemento en A.
currentMax A[0] 2
for i 1 to n -1 do 1 n
if currentMax < A[i] then currentMax A[i] 4(n-1) |
6(n-1)
return currentMax 1
t(n) = 2 + 1 + n +4(n-1) + 1 = 5n (mnimo)
= 2 + 1 + n +6(n-1) + 1 = 7n - 2 (mximo)
10
Notacin asinttica
Objetivo: simplificar el anlisis eliminando
la informacin innecesaria (como
redondeo 1,000,0011,000,000)
Queremos decir de manera formal 3n2 n2
Notacin O-grande (Big-Oh):
dadas las funciones f(n) y g(n), decimos
que f(n) es O(g(n) ) si y solo si hay
constantes positivas c y n0 tal que f(n)
c g(n) para n n0
11
Notacin asinttica: ejemplo
f(n) = 2n + 6
Para funciones f(n) y
g(n) (derecha) hay
constantes positivas
c y n0 tales que: c g(n) 4n
f(n)c g(n) para n
n0
g(n) n
conclusin:
n
2n+6 es O(n).
12
Notacin asinttica: ejemplo
Otro caso
n2 no es O(n) debido a
que no hay c y n0 tal
que:
n2 cn para n n0
(como se ve en el
grfico, no importa cuan
grande se escoge c hay
un n suficientemente
grande que n2>cn ) .
13
Notacin asinttica
Nota: Aun cuando es correcto decir que 7n - 3 es
O(n3), es mejor decir 7n - 3 es O(n), esto es, se debe
hacer la aproximacin lo ms cerca posible
14
Notacin asinttica (terminologa)
Clases especiales de algoritmos:
logaritmico: O(log n)
lineal: O(n)
cuadratico: O(n2)
polinomico: O(nk), k 1
exponencial: O(an), n > 1
15
O(1) Complejidad Constante
17
O(n) Complejidad Lineal
Items Tiempo
1 1 segundo
10 10 segundos
100 100 segundos
Ejemplos
Recorrer un arreglo o lista ligada
Bsqueda lineal
Comparar dos cadenas
18
O(n log n)
19
O(n^2) Complejidad Cuadrtica
20
Tiempo de ejecucin
Usar la notacin Big-Oh para expresar el nmero de
operaciones primitivas ejecutadas como funcin del
tamao de entrada.
Ejemplo: decimos que el algoritmo arrayMax se ejecuta en
tiempo O(n).
Comparacin de tiempos de ejecucin asintticos
- un algoritmo que corre en tiempo O(n) es mejor que uno
que corre en tiempo O(n2)
- de forma similar, O(log n) es mejor que O(n)
- jerarqua de funciones: log n << n << n2 << n3 << 2n
21
Ejemplo de anlisis asinttico
Algoritmo para calcular promedios prefijos:
i
A[i ]
j 0
X [ j]
i 0,..., n 1
Algorithm prefixAverages1(X): i 1
Input: Array X de nmeros de n-elementos.
Output: Array A de nmeros de n -elementos tal que A[i] es
el promedio de los elementos X[0], ... , X[i].
Sea A un array de n nmeros.
for i 0 to n - 1 do
a0
for j 0 to i do
a a + X[j]
A[i] a/(i+ 1)
return array A
Anlisis: O(n2)
22
Ejemplo de anlisis asinttico
Otro algoritmo para calcular promedios prefijos:
A[i-1] = (X[0] + X[1] +...+ X[i-1])/i
A[i] = (X[0] + X[1] +...+ X[i-1] + X[i])/(i+1)
Algorithm prefixAverages2(X):
Input: Array X de nmeros de n-elementos.
Output: Array A de nmeros de n -elementos tal que A[i] es
el promedio de los elementos X[0], ... , X[i].
Sea A un array de n nmeros.
s 0
for i 0 to n do
s s + X[i]
A[i] s/(i+ 1)
return array A
Anlisis: O(n)
23
Complejidad en la prctica
4 10 n
n n nlogn n2 n3 n n n 2
13 283
1000 1mic 10mic 1milli 1sec 1000 17min 3.2 x 10 3.2 x 10
years years
24