Sunteți pe pagina 1din 24

Anlisis de Algoritmos

Metodologas para el anlisis de algoritmos

Notacin asinttica

Elementos matemticos

Otras tcnicas de anlisis

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.

long startTime = System.currentTimeMillis();


// retorna el tiempo en miliseconds desde 1/1/1970 GMT

// cdigo a ser medido

long elapsedTime = System.currentTimeMillis()


- startTime;

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):

long startTime = System.currentTimeMillis();


long counter;
do {
counter++;
hacerAlgo ( );
} while (System.currentTimeMillis() -
startTime < 1000),
long elapsedTime = (System.currentTimeMillis()
- startTime) / counter;
6
Metodologas para el anlisis de
algoritmos
Interesa hallar la dependencia del tiempo de
ejecucin en funcin del tamao de la entrada.
Un mtodo para estudiar el tiempo de ejecucin es
la experimentacin, que tiene limitaciones:
Los experimentos se pueden hacer sobre un conjunto
limitado de entradas de prueba.
Es necesario realizar los experimentos con el mismo
hardware y software.
Es necesario implementar y ejecutar el algoritmo.

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

Regla simple: Eliminar los trminos de bajo orden


y las constantes
7n-3 es O(n)
8n2log n + 5n2 + n es O(n2log n)

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

Significa que la cantidad de datos es irrelevante para el


algoritmo, siempre va a tardar el mismo tiempo en terminar.
Lamentablemente es difcil que un algoritmo no trivial caiga
en esta categora.

Items Tiempo Asumiendo que k es una cantidad


1 k segundos constante
10 k segundos
100 k segundos Ejemplos
Acceder al elemento de un arreglo
Insertar en elemento en una lista
ligada
Aadir o sacar un elemento de una
pila
16
O(log n) Complejidad Logartmica

En este caso el tiempo incrementa conforme aumenta el


nmero de elementos, pero de forma logartmica por lo que
para grandes cantidades de datos el tiempo es relativamente
corto.
Ejemplos
Items Tiempo Bsqueda binaria
1 1 segundo Encontrar menor/mayor elemento
10 2 segundos en un rbol binario de bsqueda
100 3 segundos Algunos algoritmos Divide y
1000 4 segundos Vencers
10000 5 segundos
Divide y Vencers

17
O(n) Complejidad Lineal

Vas a incrementar la cantidad de elementos? Seguro, pero el


tiempo va a incrementar de forma proporcional.

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)

Esta es una combinacin de las dos anteriores, es comn


encontrar varios algoritmos de ordenamiento en esta categora.

Items Tiempo Ejemplos


1 1 segundo Merge Sort
10 20 segundos Heap Sort
100 300 segundos Quick Sort

19
O(n^2) Complejidad Cuadrtica

La cantidad de tiempo que tarda el algoritmo comienza a


dispararse, no es muy eficiente con una gran cantidad de datos.

Items Tiempo Ejemplos


1 1 segundo Bubble sort
10 100 segundos Selection sort
100 10000 segundos Iterar un arreglo de 2 dimensiones

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

Considerando 109 instrucciones/segundo

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

10000 10mic 130mic 100milli 17min 10000 116 ??? ???


days

106 1milli 20milli 17min 32years 10^6 3 x 10^7 ?????? ??????


years

24

S-ar putea să vă placă și