Algoritmos Eficiencia
Algoritmos Eficiencia
Algoritmos Eficiencia
• Eficiencia de un algoritmo
Bibliografía
Robert Sedgewick:
“Algorithms in C”
Addison-Wesley, 1990
ISBN 0201514257
“Fundamentos de Algoritmia”
Prentice Hall, 1997
ISBN 848966000X
Eficiencia de un algoritmo
El análisis de algoritmos estudia, desde el punto de vista teórico, los
recursos computacionales que necesita la ejecución de un programa de
ordenador: su eficiencia.
p.ej. Tiempo de CPU
Uso de memoria
Ancho de banda
…
Observación
El tiempo de ejecución depende del tamaño del conjunto de datos.
Objetivo
Parametrizar el tiempo de ejecución en función del tamaño del conjunto
de datos, intentando buscar una cota superior que nos sirva de garantía
Tipos de análisis
Notación O
O(g(n)) = { f(n) | ∃c,n0 constantes positivas tales que f (n) = c g(n) ∀ n = n0 }
Eficiencia asintótica
Cuando n es lo suficientemente grande…
un algoritmo O(1)
es más eficiente que
un algoritmo O(log n)
es más eficiente que
un algoritmo O(n)
es más eficiente que
un algoritmo O(n log n)
es más eficiente que
un algoritmo O(n2)
es más eficiente que
un algoritmo O(n3)
es más eficiente que
un algoritmo O(2n)
Propiedades de la notación O
c O(f(n)) = O(f(n))
O(f(n)+g(n)) = O(f(n)+g(n))
O(f(n))O(g(n)) = O(f(n)g(n))
O(O(f(n))) = O(f(n))
Secuencias de instrucciones
I1;
I2; T(n) = T1(n) + T2(n) = max { O(T1(n)), O(T2(n)) }
Algoritmos recursivos
Se obtienen recurrencias que hay que resolver…
tmp = v[i];
v[j] = tmp;
}
}
n −1
T ( n ) =∑ O (i ) = O ( n 2 )
i =1
n −1
T ( n ) =∑ Θ(i / 2 ) = Θ( n 2 )
i =1
IDEA
- Dividir el vector en dos y ordenar cada mitad por separado.
- Una vez que tengamos las mitades ordenadas, las podemos ir mezclando
para obtener fácilmente el vector ordenado
IMPLEMENTACIÓN EN C
double aux[maxN];
// Algoritmo de ordenación
if (r > l) { // O(1)
mergesort (v, l, m); // T(n/2)
mergesort (v, m+1, r); // T(n/2)
merge (a, l, m, r); // O(n)
}
}
2. Algoritmo de ordenación
O (1) si n = 1
T (n) =
2T ( n / 2) + O ( n ) si n > 1
Solución de la ecuación T ( n ) = 2T ( n / 2) + n
Por tanto,
la ordenación por mezcla es más eficiente que la ordenación por inserción.
Ejercicio
Comprobar experimentalmente a partir de qué valor de n el algoritmo de
ordenación por mezcla es más rápido que el de ordenación por inserción.
Método de sustitución
1. Adivinar la forma de la solución.
2. Demostrar por inducción.
3. Resolver las constantes.
O (1) si n = 1
T (n ) =
4T ( n / 2) + n si n > 1
¿T(n) es O(n3)?
Suposición T(k) = ck3 para k<n
Demostramos por inducción T(n) = cn3
T(n) = 4T(n/2) + n
= 4c(n/2)3 + n = (c/2)n3 + n = cn3 – ((c/2)n3 – n)
= cn3 siempre que ((c/2)n3 – n)>0 (p.ej. c=2 y n=1)
Árbol de recursión
Se basa en construir una representación gráfica intuitiva…
T ( n ) = T ( n / 4 ) + T ( n / 2) + n 2
T (n) = −
5 2 2
Sustituimos tn=xn:
a0xn + a1xn-1 + … + akxn-k = 0
a0xk + a1xk-1 + … + ak = 0
DEMOSTRACIÓN:
A partir de
a0tn + a1tn-1 + … + aktn-k = bnp(n)
donde b es una constante y p(n) un polinomio de grado d
Problema: Calcular an
an = a · an-1
a n / 2 a n / 2 si n es par
a = ( n−1) / 2 ( n−1) / 2
n
a a a si n es impar
n
Fn+1 Fn Fn Fn−1 1 1 1 1
F = =
Fn −1 Fn−1 Fn −2 1 0 1 0
·
n
Estrategia greedy
Solución rápida pero no siempre óptima
Dado un grafo, obtener el camino más corto para llegar desde un vértice hasta otro:
S = { origen }
Para todo i
D[i] = C[origen,i]
P[i] = origen
Mientras S ≠ V
Elegir w ∈ V – S tal que D[w] sea mínimo
S = S ∪ {w}
Para cada vértice v ∈ V – S
Si D[v] > D[w] + C[w,v] entonces
D[v] = D[w] + C[w,v]
P[v] = w
Ejemplos
Números combinatorios
n n − 1 n − 1
= +
k k − 1 k
Variante: “Memoization”
IDEA: No calcular dos veces lo mismo
Aplicaciones
Reconocimiento de voz (DTW: Dynamic Time Warping).